Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Разбор структуры сайта

Прежде всего скрипт должен считать файл со структурой сайта и преобразовать его содержимое в массив. Чтение в массив делается одной функцией file() – каждая строка файла становится элементом массива, возвращаемого этой функцией. Но каждая строка содержит набор данных, то есть тоже массив. Значит, следующим шагом нам нужно «разбить» каждую строку на элементы. Сразу же создадим функцию, которая этим займется.


<?php
function hierarchy($heap) {
  $hier=array();
  foreach ($heap as $val) {
    $item=explode('|',trim($val));
    $hier[$item[2]]['number']=$item[0];
    $hier[$item[2]]['parent']=$item[1];
    $hier[$item[2]]['knot']=trim($item[2]);
    $hier[$item[2]]['name']=$item[3];
    $hier[$item[2]]['some']=$item[4];
    $hier[$item[2]]['branch']=$item[5];
  }
  return $hier;
}
?>

Раньше мы уже определили набор данных для предполагаемого сайта. Используем этот набор для примера. После считывания файла функцией file() массив строк выглядит так:


Array
(
    [0] => 1||/|Главная|0|1
    [1] => 2||good|Товары|0|2
    [2] => 3||about|О нас|0|3
    [3] => 4|good|morm|Мормышки|0|2
    [4] => 5|good|popl|Поплавки|0|2
    [5] => 6|good|hooks|Крючки|0|2
    [6] => 7|about|requis|Реквизиты|0|3
    [7] => 8|about|map|Схема проезда|0|3
)

После разбора этого массива нашей функцией hierarchy() мы получаем массив, в котором индексами являются алиасы разделов, а каждый элемент – ассоциативный массив, содержащий информацию о разделе. Будем дальше называть его «массив разделов»:


Array (
    [/] => Array
        (
            [number] => 1
            [parent] => 
            [knot] => /
            [name] => Главная
            [some] => 0
            [branch] => 1
        )

    [good] => Array
        (
            [number] => 2
            [parent] => 
            [knot] => good
            [name] => Товары
            [some] => 0
            [branch] => 2
        )

    [about] => Array
        (
            [number] => 3
            [parent] => 
            [knot] => about
            [name] => О нас
            [some] => 0
            [branch] => 3
        )

    [morm] => Array
        (
            [number] => 4
            [parent] => good
            [knot] => morm
            [name] => Мормышки
            [some] => 0
            [branch] => 2
        )

    [popl] => Array
        (
            [number] => 5
            [parent] => good
            [knot] => popl
            [name] => Поплавки
            [some] => 0
            [branch] => 2
        )

    [hooks] => Array
        (
            [number] => 6
            [parent] => good
            [knot] => hooks
            [name] => Крючки
            [some] => 0
            [branch] => 2
        )

    [requis] => Array
        (
            [number] => 7
            [parent] => about
            [knot] => requis
            [name] => Реквизиты
            [some] => 0
            [branch] => 3
        )

    [map] => Array
        (
            [number] => 8
            [parent] => about
            [knot] => map
            [name] => Схема проезда
            [some] => 0
            [branch] => 3
        )
)

Теперь массив строк, выбранных из файла, можно уничтожить, он больше не нужен. Всю необходимую информацию о любом разделе мы получим, обратившись к массиву разделов по алиасу. Номер раздела дает возможность собрать имя файла, в котором лежит контент страницы раздела. По пустому элементу parent (предок) легко отфильтровать разделы верхнего уровня, из которых состоит главное меню. Если в текущий раздел входят подразделы, их можно отфильтровать по совпадению элемента parent с алиасом текущего раздела.

Внимание! в массивах-описателях разделов встречается элемент some – ранее (в статье «Структура данных, часть II») он упоминался как статус страницы. Пора его расшифровать. В этом элементе будет храниться битовая маска особых признаков для каждого раздела. Значения битов соответствуют следующим особым случаям:
Разр.NСтатус
01Не показывать раздел в меню
12Содержит скрипт (плагин или форму)
24(Резерв)
38Вынос ленты новостей
416Скрипт стороннего разработчика

Единичное значение каждого бита этой маски задает определенные действия движку. Например, взведенный в 1 бит «Не показывать в меню» исключит раздел при формировании меню. Это дает возможность не включать в меню, например, карту сайта, ссылка на которую часто стоит под пиктограммой в шаблоне страницы. Или временно скрыть какую-то страницу сайта, исключив ее из навигации, но не удаляя.