ФАЙЛ ZAPROS.PHP

Сценарії цього файлу запрошують від відвідувача додаткову інформацію для проведення дії. Початок сценарію:

<html><?php

Відразу ж виведемо заголовок форми, загальний для всіх чотирьох варіантів запитів. У нім так само передамо тому, що виконує власне дії сценарію на сторінці do.php ім'я поточної теки:

echo ("<formaction=do.php?folder=$folder method=post>");

Безперечно, можна було б і не передавати ім'я поточної теки, а повідомляти обробникові конкретні імена файлів, над якими здійснюється дія, з повним дорогою до них, проте так усе-таки простіше.

ВИДАЛЕННЯ, ЗАПИТ ІНФОРМАЦІЇ

Якщо на основній сторінці файлового менеджера - index.php - натискувала кнопка "Видалити", ім'я якої - "udal", те значення змінної $udal' у сценарії на сторінці-обробнику буде відмінним від нуля (вірніше, воно буде значенням атрибуту value кнопки "Видалити" на основній сторінці -^собственно слово "Видалити"). Якщо натискувала яка-небудь інша кнопка, то значення змінної $udal визначено не буде. Тому для того, щоб взнати, чи було відвідувачем вибрано як бажана дія видалення, перевіримо вміст цієї змінної:

if ($udal!="")

Виведемо невелике пояснення відвідувачеві...

echo ("Видалити файли?<bг>");

і список файлів, які планується видалити. Їх список переданий у форму в масиві $fl. У цей масив включені параметри value тих checkbox'ob, які були відмічені відвідувачем на основній сторінці менеджера файлів перед тим, як натискувати кнопку з назвою дії (а в ці параметри, як ви напевно пам'ятаєте, були поміщені імена файлів і тек, що відображувалися на основній сторінці файлового менеджера, - дорога до них передана через змінну Sfolder в адресному рядку). Переберемо всі елементи масиву $ f 1...

foreach ($fl as $i)
{

і виведемо їх значення - імена файлів, що підлягають видаленню. Разом з ім'ям теки, в якій вони розташовані, - його сценарій на цій сторінці отримав через адресний рядок.
Ну а для того, щоб мати можливість ці імена передати сценарію на наступній сторінці, що виконує власне дію
Строго кажучи, замість імен змінних, рівних іменам елементів форми, що обробляється сценарієм на цій сторінці, слід було б використовувати імена відповідних елементів масивів Shttp_post_vars[] і (у РНР починаючи з версії 4.1) $_POST[]. Проте для легшого розуміння коди вибраний перший варіант. При використанні справжнього сценарію на практиці ви можете самі замінити імена змінних на імена елементів згаданих масивів.
поряд з кожним ім'ям файлу, що видаляється, помістимо приховане поле, в яке помістимо це саме ім'я. Сценарію, що виконує видалення, залишиться лише зробити цю операцію над тими файлами, імена яких йому будуть передані.
Ім'я ж теки, в якій ці файли розташовуються, передається сценарію - виконавцеві дії через адресний рядок, вказаний в заголовку форми запиту інформації, - точно так, як і воно було передане даному сценарію, що запрошує додаткову інформацію. Ви могли бачити цей заголовок декількома абзацами вище.

Мал. 11.6. Видалення файлів і тек. Запит підтвердження

Як і на першій сторінці, всі ці приховані поля зробимо масивом, для зручності - навіть привласнимо йому те ж ім'я flf ]:

echo ("<input type=hidden name=fl[] value=$i>$i з теки $folder<br>");
}

І нарешті, виведемо кнопку, що запускає власне видалення. Назвемо її точно так, як і розташовану на основній сторінці - для одноманітності:

echo ("<input type= submit value= \"Удалить" name=udal>");

В результаті в тому випадку, якщо відвідувач на основній сторінці відзначить файли і теки і натискуватиме кнопку "Видалити", то на сторінці запиту підтвердження (мал. 11.6) йому буде виданий список вибраних ним файлів і запропоновано натискувати одну з двох кнопок - "Видалити" або "Відміна" (код, що виводить останню, розміщений в кінці сторінки -смотріте нижче).

КОПІЮВАННЯ, ЗАПИТ ІНФОРМАЦІЇ

Для того, щоб виробити копіювання файлів і тек з однієї теки в іншу, проста згоди користувача на цю дію мало. Потрібно ще взнати, а в яку теку необхідно виробляти копіювання.
А що потрібне, щоб це взнати? Необхідно видати запит на здобуття імені цієї теки у користувача. Можна, звичайно, надати користувачеві можливість просто ввести нову дорогу в поле введення тексту, як при використанні команди сміттю в командному рядку MS-DOS. Але це представляється вельми незручним. Краще, напевно, вивести користувачеві список тих, що всіх є його аккаунте тек, з яких він зможе вибрати потрібну. Помітити ім'я кожної теки радіокнопкою (кружком з групи єдиного вибору, див. мал. 11.1, 11.7) - і для вибору теки призначення копіювання досить буде лише ткнути мишею в потрібному місці).
Але як вивести список всіх тек? Адже вони можуть бути вкладені один в одного, так що просте сканування кореневої директорії не допоможе... А команд в нашому розпорядженні для досягнення даної мети не так і багато. Рахувати список вмісту каталога, визначити, чи є той або інший елемент, що міститься в каталозі, так само директорією, - ось, власне, і все, що нам може запропонувати РНР.
І тут прийде на допомогу принцип рекурсії.
Під рекурсією розуміється запуск програми з самої цієї програми. Іншими словами - ось програма запускається, виконується, виконується - а потім чергова команда є не що інше, як виклик цієї самої програми! і знов програма виконується з початку, виконується... і знову доходить до виклику самої програми, і знову виконується з початку.
Зрозуміло, для того, щоб програма з рекурсією мала якийсь сенс, а не вдавала із себе нескінченно повторювані дії, на якомусь етапі даний процес повинен урватися. Іншими словами, запуск програми зсередини самої програми повинен відбуватися не кожного разу при її роботі, а залежно від того, чи виконується певна умова. Природно, рано чи пізно в ході роботи програми умова повинна перестати виконуватися, і тоді рекурсія урветься - вихідна програма зсередини її самої запущена при невиконанні умови не буде.
Як же принцип рекурсії можна використовувати для побудови списку всіх тек на аккаунте? А алгоритм побудови цього списку при використанні рекурсії простий:

  • Отримати список файлів і тек в поточній директорії.
  • Перебирати елементи з цього списку поодинці.
  • Якщо черговий елемент - директорія, то вивести на сторінку її ім'я і виконати цей алгоритм по відношенню до цієї директорії, порахувавши її поточною.

Цей алгоритм слід реалізувати в спеціальній функції - підпрограмі, яку можна викликати по імені, передавши їй при цьому необхідну для роботи інформацію.
До даної послідовності дій можна зробити лише одне доповнення: якщо в списку копійованих об'єктів є теки, то із списку директорій, що виводиться, мають бути виключені як самі ці теки, так і всі вкладені в них. Дана вимога задоволена зрозуміло - скопіювати теку у вкладену в неї теку неможливо. Ну і, природно, в список тек для копіювання не повинна попасти та тека, в якій копійовані файли знаходяться, - як можна файл скопіювати сам на себе?
Останні ж дії коди, присвяченої запиту підтвердження копіювання файлів, ті ж самі, що і для коди видалення файлів і тек: вивести список копійованих об'єктів і кнопку підтвердження вибору дії.
Початок коди:

if ($copy!="")
{

Для зручності запишемо в змінну назву кореневої теки аккаунта користувача. Згодом ми будемо її неодноразово використовувати в коді.

$begin="files";

Виводимо запит користувачеві...

echo ("Об'єкти для копіювання:<br>");

і, точно так, як і в блоці коди, присвяченому видаленню файлів, виводимо список об'єктів, що підлягають копіюванню (порівняєте - код практично такий же):

foreach ($fl as $i)
{
echo ("<input type=hidden name=fl[] value=$i>$folder/$i<br>") ;

Ще один запит...

echo ("<bг>виберіте теку для копіювання :<br>") ;
і починаємо виведення дерева тек - викликаємо функцію tree.
tree($begin);

РЕКУРСИВНА ФУНКЦІЯ ВИВЕДЕННЯ СПИСКУ ДОСТУПНИХ ДЛЯ КОПІЮВАННЯ ТЕК НА АККАУНТЕ

У реальному сценарії ця функція повинна знаходитися на його початку або у будь-якому випадку до місця її первинного виклику (див. повний текст даних сценаріїв в кінці глави). Тому при створенні програми, подібної до цього файлового менеджера, краще всього поставити таку функцію відразу перед блоком команд видачі запиту додатковій інформації для копіювання.
Функції передається один параметр - ім'я теки, список вкладених тек в якій вона повинна видати.

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)

то з'ясуємо:

  • чи немає дана тека одночасно і об'єктом копіювання? Якщо є - те, по-перше, в списку тек вона з'явитися не повинна - теку не можна скопіювати саму в себе, а, по-друге, сканувати її вкладені теки теж немає чого - копіювати одну теку в іншу, вкладену в неї, ще нікому не удавалося;
  • чи не в цій самій теці знаходиться копійований файл? Якщо в цій же самій теці - те виводити її ім'я безглуздо: копіювання файлу на своє ж місце можливо, але жодних за собою наслідків не вабить.

Спершу порівняємо повне ім'я (разом з дорогою від кореневої директорії аккаунта) чергової знайденої в сканованій директорії теки зі всіма іменами копійованих об'єктів (природно, теж повними). Якщо хоч одне таке ім'я збіжиться з ім'ям теки - те виводити ім'я цієї теки в список доступних для копіювання не можна.

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

Змінна $по набуде значення 0, якщо збігів не було, і 1, якщо були.

Коментар:
Звернете увагу на спосіб фіксації збігу імен тек при їх переборі - за допомогою зміни значення раніше встановленій змінній: в даному випадку - $nо.
Використовуйте такий же спосіб, якщо вам треба взнати, чи сталося те або інша подія усередині якого-небудь циклу - встановите до циклу змінну в нуль, а усередині циклу в разі здійснення події привласніть їй значення 1. Тоді після закінчення циклу змінна дорівнюватиме 1, якщо подія сталася, і 0, якщо немає.

Отже - якщо чергова тека із сканованої директорії не є об'єктом копіювання...

if ($no==0)

{ і ці об'єкти копіювання розташовані не в ній...

if ($fllnm!=$folder)

то її ім'я можна вивести як можливий пункт призначення копіювання, забезпечивши його radio button - тобто "кружком" для єдиного вибору. (Після відправки форми результат вибору виявиться в змінній $rd у сценарії виконання дії.)

echo ("<input name=rd type=radio value=$fllnm>$fllnm<br>");

Коментар:
При відправці форми, що містить radio buttons, сценарію-обробникові передається та, що всього одна відноситься до цих елементів форми змінна, ім'я якої збігається з ім'ям відміченої radio button, а значенням є вміст параметра value відміченою radio button.
При розміщенні у формі radio buttons їм всім дається одне і те ж ім'я - те ім'я, яке матиме в сценарії-обробнику змінна із значенням вибраного radio button. Плутанини тут не буде - оскільки зі всіх radio buttons у формі відміченим може бути лише один елемент, то змінна у будь-якому випадку передасться всього одна.

Те, що тека містить копійовані файли, є перешкодою до виводу імені цієї теки на екран як возможнего пункту призначення копіювання. Але це зовсім не означає, що в даній теці не повинні скануватися вкладені теки. Тому оператор i f визначає, чи не містить дана тека копійованих файлів, завершуємо...

} і ось він - рекурсивний виклик функції tree:

tree ($fllnm);

Залишилося закрити всіх незавершених операторів і цикли

}
}
}
}

і "потрошимую" директорію.

closedir($hdl);

Функція виведення списку директорій, - пунктів призначення копіювання завершена.
}
Працювати вона буде так. Спочатку, як ви пам'ятаєте, функція викликається з параметром Sbegin, ім'ям кореневої директорії аккаунта. Функція сканує цю директорію і, як тільки натикається на вкладену теку, перевіряє, чи можна її сканувати, після чого, можливо, ця вкладена тека перетворюється на скановану. І знову: функція сканує вже цю вкладену теку, і, якщо знову натикається на теку, вкладену в цю вкладену теку, то починає сканувати вже її. І так продовжується до тих пір, поки функція не дістанеться до теки, де вкладених тек немає (погодитеся, що така рано чи пізно знайдеться). Дійшовши до такої, функція повертається на крок назад і сканує наступну вкладену теку. Якщо такий не знаходить, то повернення йде далі. Спробуйте собі все це представити - і відразу зрозумієте, якщо ще не зрозуміли.

Як вже було сказано, функція tree () повинна знаходитися в коді перед блоком запиту додаткової інформації для копіювання.

Мал. 11.7. Копіювання. Запит теки призначення

Після виведення списку тек, які можуть служити местомом призначення копіювання, залишилося лише додати до нього кореневу теку аккаунта, якщо, звичайно, копійовані файли знаходяться не в ній (як ви могли відмітити, ім'я цієї теки наведена вище функція не виводить)...

if ($begin!=$folder) {
echo ("<brxinput name=rd type=radio value=$begin>$begin<br>");

і вивести кнопку запуску копіювання.

echo ("<input type=submit value=\"ськопіровать\" name=copy>");

Все.

}

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

ПЕРЕЙМЕНУВАННЯ, ЗАПИТ ІНФОРМАЦІЇ

Для перейменування файлу потрібно взнати у користувача нове ім'я для цього файлу. Саме це і робить та, що виводиться нижченаведеним сценарієм на сторінку форма. Проте сценарію-обробникові даної форми необхідно передати як старе ім'я файлу, так і нове, щоб йому було зрозуміле, який файл необхідно перейменовувати.
Якщо на основній сторінці натискувала кнопка "Перейменувати"...

if ($ren!="") { то виведемо пояснення користувачеві...
echo ("Перейменувати файли?<bг>");

і для кожного файлу або теки, чиє ім'я було відмічене у відповідному checkbox'e на головній сторінці...

foreach ($fl as $i)
{

помістимо у форму приховане поле, в якому запишемо старе ім'я файлу. Адже сценарію-обробникові треба знати, який файл перейменовувати?

echo ("<input type=hidden name=afl[] value=$i>");

Виведемо старе ім'я файлу...

echo ("$i");

і текстове поле для введення нового імені. Для зручності помістимо в це текстове поле старе ім'я - якщо користувачеві треба було його змінити зовсім небагато, то йому зробити це буде легко.

echo ("<input type=text size=30 name=rfl[] value=$ixbr>") ;

Такі поля виведемо для кожного файлу або теки, підмета перейменуванню.
}
І виведемо кнопку, що запускає процес перейменування шляхом переходу на сторінку з сценарієм-обробником з передачею цьому сценарію відмінного від порожнього рядка значення змінної $rеn:

echo ("<input type=submit value=\"перєїменовать\" name=ren>");

Блок запиту додаткової інформації по перейменуванню файлів або тек закінчений.
}
В результаті роботи даного сценарію (а це станеться лише в тому випадку, якщо на основній сторінці файлового менеджера натискувала кнопка "Перейменувати") відвідувачеві відображуватиме список вибраних їм для перейменування файлів, для кожного з яких він зможе ввести нове ім'я (мал. 11.8)
Після натиснення кнопки "Перейменувати" на сторінці запиту додаткової інформації сценарію-виконавцеві дії будуть переданий два масиви - $afl і $rfl - із старими і новими іменами файлів і тек, причому їх елементи, що відносяться до одного і тому ж файлу або теки, матимуть один і той же порядковий номер.
Повні ж дороги до файлів, що перейменовуються, і тек сценарій зможе відновити на основі значення змінної Sfolder, переданої йому в засланні на сторінку з сценарієм-обробником, вказаної в заголовку форми (див. раніше).

Мал. 11.8. Перейменування. Запит нових імен

СТВОРЕННЯ НОВОЇ ТЕКИ, ЗАПИТ ІНФОРМАЦІЇ

Для створення нової теки потрібно отримати від користувача всього одне слово - ім'я цієї найновішої теки.
Якщо на основній сторінці файлового менеджера було вибрано дію "Створення теки"...

if ($md!="")

то виведемо на сторінку поле для його введення (його вміст передасться сценарію-обробникові в змінній Snewname):

echo ("Введіть ім'я теки: <brxinput type=text size=30 name=newname>");

і кнопку, що запускає це саме створення:

echo ("<input type=submit value=\"создать теку \ " name=md>");

Власне, і все.

}
?>

Відвідувач побачить поле введення для імені нової теки (мал. 11.9)

Мал. 11.9. Створення нової теки. Поле введення її імені

КНОПКА ВІДМІНИ

Для того, щоб із сторінки запиту інформації можна було піти без наслідків, якщо відвідувач передумає що-небудь робити зі своїми файлами, помістимо на цю сторінку кнопку "Відміна" (див. мал. 11.6-11.9):

<brxinput type=submit value="otmeha" name=otmena>

Власне, це і є весь текст цієї сторінки:

</form></html>

Графічне оформлення - вже на смак сайтостроїтеля.

 
На правах реклами: 1 2

:: Меню ::

ГОЛОВНА

Введення

Небагато про Web-программировании

PHP: Історія. Місця. Джерела.

PHP: Основи

PHP: Вибіркове завантаження

PHP: Простий інтернет-магазин

PHP: Папкопотрошилка

PHP: Закачування файлів

PHP: Авторизація доступу

PHP: Гостьова книга

PHP: Система оцінки матеріалів

PHP: Файловий менеджер

PHP: Корисні дрібниці

PHP: Способи передачі даних між окремими сторінками

Висновок

Додаток 1. Перетвори свій сайт на портал

Додаток 2. Використовуй те, що під рукою - і не шукай завжди інше

Додаток 3. На сайті - як в "Вінде"


:: Реклама ::

  Настройка і оптимізація комп'ютера Компания предлагает иформацию вышки туры подвижные основы касество дешево

 

:: Статистика ::

  Індекс цитування

:: Навігація ::

Головна

Гостьова книга

Додати у вишукане  

 

 

 


Copyright © Asentli, 2008