FAQ з використанням PHP-jQuery і текстових файлів. Частина 3 (заключна)

11

Від автора: Ласкаво просимо в третю частину уроку по створенню FAQ з використанням текстових файлів БД. Ця частина буде заключною, і тут ми реалізуємо другий пункт меню адміністративної частини — видалення пари питання-відповідь. Заодно ми познайомимося ще з кількома новими функціями PHP, які і будемо використовувати при написанні заключній частині проекту.

Отже, приступимо…

План уроку:

1. Читаємо вміст файлу (11:17)

2. Виводимо посилання для видалення (09:40)

3. Видаляємо обрану пару питання-відповідь (11:31)

4. Записуємо у файл (08:15)

FAQ з використанням PHP-jQuery і текстових файлів. Частина 3 (заключна)FAQ з використанням PHP-jQuery і текстових файлів. Частина 3 (заключна)

 

1. Читаємо вміст файлу

Працювати тут ми будемо з файлом add.php, а тому відкрийте його в зручному для Вас редакторі і приступимо до кодування. Але, як завжди, перш ніж приступити до написання коду — нам необхідно зрозуміти для себе, що ж ми хочемо в підсумку одержати, тобто побудувати алгоритм… ну а потім реалізувати його.

Отже, нам потрібно вивести в будь-якому зручному вигляді першу частину кожної з рядків файла base.txt, тобто питання і надати користувачеві можливість вибрати питання для видалення. Висновок можна реалізувати, наприклад, разом з радіокнопками або чекбоксами, або просто вивести питання посиланнями. Ми виберемо останній варіант — виведемо питання посиланнями, і при натисканні на конкретну посилання буде видалена рядок з обраним питанням і відповіддю на нього. Також необхідно зробити так, щоб після видалення файл знову считывался і список питань виводився, відповідно, без вилученого на попередньому кроці питання. Ось і весь алгоритм вратце.

Реалізуємо його тепер в коді.

Перш за все, потрібно прочитати файл в масив. Раніше ми робили це, використовуючи функцію fgets(), і порядково зчитуючи файл в масив. При цьому перед зчитуванням файлу його потрібно було відкрити функцією fopen(). Тепер ми розширимо наші знання і спробуємо скористатися іншою функцією — функцією file(). Для роботи цієї функції не потрібно вже відкривати файл за допомогою fopen(), і функція file() зчитує вміст необхідного файлу в масив. Перевіримо, чи отримаємо ми масив:

Тут можна видалити пару питання-відповідь. Для цього просто клікніть по тому питанню, яке потрібно видалити.

Роздрукувавши масив $file, ми побачимо, що отримали дійсно масив, елементами якого є рядки файлу base.txt.

Чудово! Продовжимо…

2. Виводимо посилання для видалення

Отже, масив у нас є. Тепер потрібно вивести його елементи посиланнями. Але вся рядків нам не підійде — нас потрібна тільки перша її частина, т. е. питання. Для того, щоб отримати тільки питання ми можемо зробити все також, як і в першій частині уроку, тобто скористатися функцією explode() і в циклі пройтися по всім елементам масиву, щоб розділити питання і відповідь… Але можна зробити і набагато простіше. Допоможе нам символьна функція strtok().

Її синтаксис:

strtok(оброблювана рядок, роздільник);

Робота функції полягає в тому, що вона повертає підрядок до роздільника, тобто саме те, що нам і потрібно — питання (частина рядка до роздільника «//»). Пройдемося по масиву в циклі:

‘;
}
?>

Чудово!

Ми отримали тільки питання. Тепер необхідно вказати посилання для кожного з них. Як ми і домовлялися, по кліку на питання буде видалена відповідний рядок з файлу. Все просто… але як нам зрозуміти з якого саме питання стався клік? Щоб відповісти на це питання, давайте його трохи перефразуємо. Як нам зрозуміти, з якого саме елементу масиву стався клік? Якщо все ж хтось ще не здогадався, то все дуже просто. У кожного елемента є ключ. Ось цей ось ключ ми і будемо додавати в якості параметра до заслання, а по кліку по посиланню він і буде передаватися далі в скрипт. Передаватися цей параметр буде через адресний рядок (адже він приєднується до ссылке), тобто методом GET. А отримати ключ можна трохи дописавши цикл foreach, в якому зараз ми отримуємо тільки значення елементів. Зазначимо, що нам потрібні не тільки значення, але і їхні ключі:

$item){
$question = strtok($item, ‘//’);
echo » .$question. ‘
‘;
}
?>

У зазначеної змінної $key на кожному проходженні циклу (на кожній ітерації) і буде ключ поточного елемента масиву. Залишилося розібратися з адресою посилання. Посилання буде вести на цю сторінку, тобто на del.php. Додати до ссылке параметр можна через знак запитання. Після адреси вказуємо знак запитання, а після нього пишемо потрібний параметр і його значення. Параметр назвемо «question», а значенням його, як уже говорилося, буде поточний ключ:

$item){
$question = strtok($item, ‘//’);
echo » .$question. ‘
‘;
}
?>

Якщо тепер подивитися на рядок стану в браузері при наведенні на посилання, то можна помітити, що у різних посилань буде різне значення параметра question — від нуля і далі в порядку збільшення на одиницю. Також можна убезпечити роботу програми від випадкових кліків по посиланнях, тобто додати підтвердження видалення — при кліку на посилання буде виведено модальне вікно, де користувач повинен підтвердити бажання видалити, якщо буде підтвердження — перейдемо за посиланням, інакше — перехід скасовується:

$item){
$question = strtok($item, ‘//’);
echo » .$question. ‘
‘;
}
?>

3. Видаляємо обрану пару питання-відповідь

Відмінно!

Тепер ми можемо дізнатися яка саме рядок файлу обрана для вилучення, ми отримуємо ключ елемента масиву. А якщо ми знаємо який елемент масиву користувач бажає видалити, то нам не складе особливої праці видалити шуканий елемент з масиву. Для цього ми повинні перевірити передано GET-параметр (тобто був клік по посиланню). Цей параметр буде, як вже говорилося, ключем елемента масиву. Якщо такий параметр є, то ми вважаємо файл в масив, а наступним кроком просто вилучимо елемент масиву, ключ якого буде дорівнює отриманому GET-параметру. Все просто. В самому верху сторінки перевіряємо чи є елемент question в глобальному масиві GET:

Якщо такий елемент є, то будемо виконувати обумовлені дії в операторних дужках. Якщо ж параметра немає, то зазначений блок дій буде ігноруватися.
Отже, якщо параметр є, ми створимо змінну $question і присвоїмо їй значення елемента question з глобального масиву GET. Далі прочитаємо файл і отримаємо масив. Ну а потім видалимо відповідний елемент масиву. Видалити елемент можна за допомогою вже знайомої Вам функції unset():

Тепер якщо ми протестуємо код і роздрукуємо масив після видалення елемента, то побачимо, що після кліка по посиланню виводиться масив на екран, але вже без вибраного елемента масиву.

4. Записуємо в файл

Отже, масив без вибраного елемента ми вже отримали. Що ж нам з ним тепер робити? Все просто… залишилося його тільки записати у файл base.txt. При цьому слід враховувати, що ми повинні замінити вказаний файл — для цього досить відкрити у відповідному режимі, а саме — в режимі «w». Тут нічого нового для нас немає:

Чудово все працює так, як ми і хотіли. Залишився останній штрих — нам потрібно прописати редирект відразу після закриття файлу. Для чого це потрібно? Досить поглянути на адресний рядок і побачити, що там зберігся адреса разом з GET-параметром. Це не є добре, оскільки, якщо ми видалили елемент з середини масиву, то всі елементи зрушаться на одиницю вниз, тобто, якщо ми видалимо, наприклад, елемент з ключем 3, 3-їм після видалення стане елементи, який до видалення мав ключ 4. Чим це погано? Та тим, що якщо буде оновлено сторінку, то вийде ще один елемент. Щоб цього не допустити — просто зробимо редирект на сторінку del.php і тепер оновлення нам не страшно:

От і все.

Висновок

Протягом 3-х уроків ми реалізували всі поставлені нами цілі — створили систему FAQ і як сховища інформації використовували вже не БД, а текстові файли. Крім того, ми написали простеньку адміністративну частину, завдяки якій можемо додавати і видаляти пари запитання-відповідь вже через неї.

На цьому наш урок закінчено. Чекаємо від Вас запитань і нових ідей!

З повагою Андрій Кудлай