PHP 4 на практике

       

Проект 2: построение карты сайта


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

  1. Объявить служебные переменные для хранения родительского каталога, имени графического файла с изображением папки, названия страницы и флага серверной ОС (Windows или другая система).
  2. Объявить функцию display_directory( ), которая читает содержимое каталога и форматирует его для вывода в браузере.
  3. Построить путь к каталогу объединением имени, передаваемого в переменной $dir1, с $dir.
  4. Открыть каталог и прочитать его содержимое. Отформатировать имена каталога и файлов и вывести их в браузере.
  5. Если текущий файл является каталогом, рекурсивно вызвать функцию display_di rectory( ) и передать ей имя нового каталога для вывода. Вычислить отступ, используемый при форматировании вывода.
  6. Если файл не является каталогом, он форматируется для отображения в виде гиперссылки (а также вычисляется отступ, используемый при форматировании).

    Листинг 7.10.

    Программа sitemap.php

    // Файл: sitemap.php

    // Назначение: построение карты сайта

    // Каталог, с которого начинается построение карты

    $beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";



    // Файл с графическим изображением папки.

    // Путь должен задаваться Относительно* корневого каталога сервера Apache

    $folder_location = "C:\My Documents\PHP for Programmers\FINAL CHPS\graphics\folder.gif";

    // Текст в заголовке окна $page_name = "PHPRecipes SiteMap";

    // В какой системе будет использоваться сценарий - Linux или Windows?

    // (0 - Windows; 1 - Linux)

    $usingjinux = 0;

    // Функция: display_directory

    // Назначение: чтение содержимого каталога, определяемого параметром

    // $dir1, с последующим форматированием иерархии каталогов и файлов.


    // Функция может вызываться рекурсивно.

    function display_directory ($dir1, $folder_location, $using_linux, $init_depth) {

    // Обновить путь

    $dir.= $dir1;

    Sdh = opendir($dir);

    while($file = readdir($dh)) :

    // Элементы каталогов "." и ".." не выводятся.

    if ( ($file != ".") && ($file != "..") ) :

    if ($using_linux == 0 ) :

    $depth = explode("\\", $dir): else :

    $depth = explode("/", $dir); endif ; $curtent_depth = sizeof( $depth);

    // Построить путь по правилам используемой операционной системы. if ($using_linux == 0) :

    $tab_depth = $current_deptn - $init_depth;

    $file = $dir. "\\", $file; else :

    $file = $dir. "/",$file; endif;

    // Переменная $file содержит каталог? if ( is dir($file) ) :

    $х = 0;

    // Вычислить отступ

    while ( $х < ($tab_depth * 2) ) :

    print "&nbsp;";

    $х++; endwhile;

    print "<img src=\"$folder_location\" alt=\"[dir]\">

    ".basename($file)."<br>";

    // Увеличить счетчик &nbsp;

    // Рекурсивный вызов функции display_directory()

    display_directory($file, $folder_location, $using_linux, $init_depth);

    // He каталог

    else :

    // Построить путь по правилам используемой

    // операционной системы.

    if ($using_linux == 0) :

    $tab_depth = ($current_depth - $init_depth) - 2; $x = 0;

    // Вычислить отступ

    while ( $x < (($tab_depth * 2) + 5) ) :

    print "&nbsp;";

    $x++;

    endwhile:

    print "<a href =\ "" .$dir."\\".basename($file)."\">".basename($file)."</a> <br>";

    else :

    print "<a href = \"".$dir."/".basename($file)."\">".basename($file)."</a> <br>";

    endif:

    endif; // Is_dir(file) endif: // If ! "." or ".."

    endwhile;

    // Закрыть каталог closedir($dh);

    <html >

    <head>

    <title> <? print "$page_name"; ?> </title>

    </head>

    <body bgcolor="#ffffff" text="#000000" link="#000000" vlink="#000000" alink="#000000">

    <?

    // Вычислить начальный отступ

    if ($using_linux == 0) :

    $depth = explode("\\", $beg_path);

    else :

    $depth = explode("/", $beg_path);

    endif:

    $init_depth = sizeof($depth);

    display_directory ($beg_path, $folder_location, $using_linux, $init_depth);

    ?>

    </body>

    </html>

    На рис. 7.1 изображен результат выполнения сценария для каталога с несколькими главами этой книги.



    Рис. 7.1.

    Вывод структуры каталога на сервере с использованием сценария sitemap.php


    Содержание раздела