Разработка скрипта карты сайта - PullRequest
0 голосов
/ 28 апреля 2011

Я пытаюсь добавить скрипт генерирования карты сайта в свое PHP-приложение, которое я использую для создания своего локально размещенного веб-сайта, и я немного застрял при разборе каталогов во вложенном дереве.Для начала, я не уверен, что рекурсивная или итеративная реализация была бы более полезной, учитывая, что я уже сгенерировал каталоги и файлы, которые я могу использовать для построения карты.

Конструктор длякласс Sitemap выглядит следующим образом:

public function __construct($base_dir = null) {
    if($base_dir === null) {
        $base_dir = Application::getPublicContentDir();
    }

    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($base_dir), RecursiveIteratorIterator::SELF_FIRST);
    foreach($files as $file) {
        $name = $file->getFilename();
        if($name !== '..' && $name !== '.') {
            $path = $file->getPathname();
            $ext = '.' . $file->getExtension();
            $path = substr($path, strlen($base_dir));
            $path = str_ireplace($ext, null, $path);
            $is_index = strrpos($path, '/index');
            $is_menu = strrpos($path, '/menu');
            $is_sitemap = strrpos($path, '/sitemap');
            if($is_index === false && $is_menu === false && $is_sitemap === false) {
                $this->site_tree[] = $path;
            }
        }
    }

    $this->site_tree = array_unique($this->site_tree);
}

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

/home
/miscellaneous
/miscellaneous/texy_test
/music
/music/samples
/about
/sitemap
/railways
/railways/signalling
/railways/signalling/menu
/railways/signalling/victoria
/railways/signalling/victoria/mckenzie_holland_1873_frames
/railways/signalling/victoria/double_wire_frames
/railways/signalling/uk
/railways/signalling/uk/midland_rotary_interlocking_block
/railways/signalling/uk/lms_speed_signalling
/railways/signalling/germany
/railways/signalling/germany/block_interlocking_principles

Я хочу превратить вывод во что-то похожее на это:

- "Home":[/home]
- "Miscellaneous":[/miscellaneous]
    - "Texy test":[/miscellaneous/texy_test]
- "Music":[/music]
    - "Samples":[/music/samples]
- "About":[/about]
- "Sitemap":[/sitemap]
- "Railways":[/railways]
    - "Signalling":[/railways/signalling]
        - "Victoria":[/railways/signalling/victoria]
            - "McKenzie & Holland 1873 Patent Frames":[/railways/signalling/victoria/mckenzie_holland_1873_frames]
            - "Double-Wire Frames":[/railways/signalling/victoria/double_wire_frames]
        - "United Kingdom":[/railways/signalling/uk]
            - "Midland Rotary Interlocking Block":[/railways/signalling/uk/midland_rotary_interlocking_block]
            - "LMS Speed Signalling":[/railways/signalling/uk/lms_speed_signalling]
        - "Germany":[/railways/signalling/germany]
            - "Block and Interlocking Principles":/railways/signalling/germany/block_interlocking_principles]

Фактическая обработка текста для генерации каждого элемента списка проста;Я уже написал это, и я могу использовать его повторно, поскольку я часто заменяю одни и те же фразы, когда они встречаются в путях (т. Е. В сценарии с хлебными крошками "uk" → "United Kingdom").То, что я застрял, является отступом списка;Единственное решение, которое я могу придумать, - это разбить каждую строку на '/' и использовать счетчики массива, но это неуклюже.

В настоящее время я хочу вывести разметку в стиле Texy, потому что я использую Texy дляобрабатывать мои отдельные страницы;но, вероятно, было бы менее сложно вычислить вложенный список из HTML, если бы это можно было сделать так же просто, как разметку Texy.

...