Иллюстрированный самоучитель по PHP

Файл zapros.php

Рекурсивная функция вывода списка доступных для копирования папок на аккаунте

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

Функции передается один параметр – имя папки, список вложенных папок в которой она должна выдать.

function tree($fId)

Поскольку в функции будут использоваться переменные еще и из других частей программы на странице, такие как Sfolder (путь к текущей папке) и массив $fl (список копируемых объектов; имена тех папок, что перечислены в нем, выводиться на страницу не будут, так как папку нельзя скопировать саму в себя или в свою же вложенную папку), то эти переменные необходимо объявить как глобальные в самой функции, указав их в ее начале после слова global:

global $folder; global $fl;

Комментарий
Массив Sfl был передан сценарию запроса дополнительной информации с помощью формы на основной странице файлового менеджера – методом POST. Поэтому он также доступен через массив $HTTP_POST_VARS – как его элемент $HTTP_POST_VARS['fl'J (если в файле конфигурации РНР установлен в on параметр track_vars). Для использования этого массива в функции его надо также объявить глобальным – командой global $HTTP_POST_VARS;
.

В РНР 4.1 версий и выше массив Sfl доступен и через массив $_POST. В отличие от $HTTPJPOST_VARS этот массив автоглобальный – т. е. для использования в функциях его элементов объявление самого массива в функциях производить не надо.

Если вы пожелаете заменить в рассматриваемой программе все вхождения переменной-массива Sfl на соответствующие им элементы массивов SHTTPPOSTVARS или SPOST, то помните, что последние нельзя для вставки их значений в строку указывать в тексте строки – для этого следует использовать оператор конкатенации (точку).

Начинаем сканировать папку, имя которой было передано в вызове функции, при помощи того же сценария, который мы уже неоднократно использовали, он разбирался еще в главе "Папкопотрошилка". При первом вызове функции ей передается имя корневой папки аккаунта, с нее функция и начинает свою работу.

$hdl=opendir($fld);
while ($file = readdir($hdl)) if (($file!=°.")&&($file!=".."))

Для удобства запишем полное имя – вместе с путем – очередного взятого из папки объекта в переменную $f llnm:

$fllnm=$fld."/".$file;

Если этот объект – тоже папка…

if (is_dir($fllnm)==True)

…то выясним:

  • не является ли данная папка одновременно и объектом копирования? Если является – то, во-первых, в списке папок она появиться не должна – папку нельзя скопировать саму в себя, а, во-вторых, сканировать ее вложенные папки тоже незачем – копировать одну папку в другую, вложенную в нее, еще никому не удавалось;
  • не в этой ли самой папке находится копируемый файл? Если в этой же самой папке – то выводить ее имя бессмысленно: копирование файла на свое же место возможно, но никаких за собой последствий не влечет.

Для начала сравним полное имя (вместе с путем от корневой директории аккаунта) очередной найденной в сканируемой директории папки со всеми именами копируемых объектов (естественно, тоже полными). Если хоть одно такое имя совпадет с именем папки – то выводить имя этой папки в список доступных для копирования нельзя.

$nо=0;
foreach ($fl as $i)
if ($fllnm==$folder."/".$i) $no=1;

Переменная $nо примет значение 0, если совпадений не было, и 1, если были.

Комментарий
Обратите внимание на способ фиксирования совпадения имен папок при их переборе – при помощи изменения значения ранее установленной переменной: в данном случае – $nо
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.