Задание 1: Создание многошаговой формы
Создайте произвольную форму с двенадцатью элементами управления. Напишите такой PHP код, чтобы посетитель мог заполнять форма частями по 3-4 элемента. Т.е. должно быть 4 или 3 шага заполнения.
- PHP-скрипт и форма должны быть реализованы в рамках одного файла
- На всех шагах форма должна «помнить» введённые прежде значения
- После отправки формы на последнем шаге заполнения, все заполненные данные должны выводиться в тег
<pre>
- На каждом шаге заполнения над формой должен быть заголовок
<h2>
с фразой отображающей номер шага. Например, «Шаг 1 из 3» - Во всех заданиях код нужно снабжать комментариями
- Для организации используйте скрытое поле со счетчиком шага (input type=hidden)
- У полей ввода, которые не должны быть видны также должен иметься type=hidden
- В задаче нельзя использовать сессии (мы ведь их изучаем позже!)
Задание 2: Создание формы логина
Создайте форму для ввода логина и пароля. Параметры полей должны называться login и psw. Если логин и пароль вводятся правильно (значения «admin» и «Fs~j4Ms|Go») — выводить «секретное» меню для менеджера сайта, иначе сообщение о некорректном вводе
- Это тренировочное задание: оно не требует работы с сессиями или базой.
- Пароль при вводе не должен быть виден в поле ввода
- Используйте для работы Bootstrap
- Укажите метод POST в элементе
<form>
- Форма должна отправляться на саму себя
- Для удобства проверки решения, поместите логин и пароль в константы (admin: Fs~j4Ms|Go, psw: Fs~j4Ms|Go)
- Секретное меню представляет собой 4 гиперссылки, которые должны быть видны только при условии правильного ввода логина/пароля
Задание 3: Проверка полей формы
Напишите скрипт, который по заданному многомерному массиву создаст разметку формы с полями внутри. А при обработке пробежит по всем элементам массива и отфильтрует данные в зависимости от их типа.
Например, для PHP массива $elements:
$elements = [
[
"element" => "input",
"htmltype" => "text",
"name" => "firstname",
"type" => "string",
"placeholder" => "Введите имя"
],
[
"element" => "input",
"htmltype" => "text",
"name" => "age",
"type" => "integer",
"placeholder" => "Введите возраст"
],
[
"element" => "input",
"htmltype" => "radio",
"name" => "gender",
"type" => "boolean",
"value" => "male",
"label" => "мужской"
],
[
"element" => "input",
"htmltype" => "radio",
"name" => "gender",
"value" => "female",
"type" => "boolean",
"label" => "женский"
],
[
"element" => "input",
"htmltype" => "submit",
"value" => "Отправить"
],
];
Нужно получить HTML форму приблизительно такого содержания:
<form action="/" method="POST">
<div class="row">
<input type="text" placeholder="Введите имя" name="firstname" />
</div>
<div class="row">
<input type="text" placeholder="Введите возраст" name="age" />
</div>
<div class="row">
<input type="radio" name="gender" value="male" />
<label for="">мужской</label>
</div>
<div class="row">
<input type="radio" name="gender" value="female" />
<label for="">женский</label>
</div>
<div class="row">
<input type="submit" value="Отправить" />
</div>
</form>
- После выполнения задания и проверки его мной, поиграйтесь с набором ключей массива и вариантами вывода формы
- После отправки формы, в полях должны оставаться отправленные значения
- При нажатии на label радиокнопка должна отмечаться (вспомните как это сделать на чистом HTML)
Задание 4: Нахождение частоты встречаемости слов
Создайте форму из <textarea>
и <input type="submit">
. При вводе произвольного текста и отправки формы, скрипт обработки должен выводить ниже список слов в порядке уменьшения частоты встречаемости каждого слова. Например, так
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>Слово</th>
<th>Частота</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>php</td>
<td>12</td>
</tr>
<tr>
<th scope="row">2</th>
<td>javascript</td>
<td>9</td>
</tr>
<tr>
<th scope="row">3</th>
<td>html</td>
<td>5</td>
</tr>
</tbody>
</table>
При обработке формы и выводе таблицы исходный текст в <textarea>
должен сохраняться.
Изначально в поле тоже должен содержаться текст: 100 слов из lorem
Задание 5: Сортировка массива анонимной функцией
Напишите PHP-код сортировки массива с использованием анонимной функции (https://www.youtube.com/watch?v=IhPkWLRCjvQ)
- массив должен быть отсортирован по любому ключу
- [ [ «title» => «Lenovo», «price» => 9e3, «reviews» => 107, «rating» => 11], [ «title» => «iPhone», «price» => 9e4, «reviews» => 120, «rating» => 12], [ «title» => «Samsung», «price» => 5e4, «reviews» => 110, «rating» => 14], [ «title» => «Lenovo», «price» => 2e4, «reviews» => 130, «rating» => 15], [ «title» => «Xiaomi «, «price» => 7e3, «reviews» => 110, «rating» => 13], ]
Задание 6: Разработка постраничного разбиения
Рано или поздно вы столкнётесь с необходимостью вывода большого количества материала с разбиением его на отдельные страницы/фрагменты. Pagination — термин, который используется для обозначения ссылок на наборы товаров или материалов на странице. Напишите PHP код, который реализует постраничное разбиение материала. (http://htmllab.ru/php-pagination/)
- выведите массив данных так, чтобы на каждой странице показывалось три товара
- массив данных [ [ «title» => «Lenovo», «price» => 9e3, «reviews» => 107, «rating» => 11], [ «title» => «iPhone», «price» => 9e4, «reviews» => 120, «rating» => 12], [ «title» => «Samsung», «price» => 5e4, «reviews» => 110, «rating» => 14], [ «title» => «Lenovo», «price» => 2e4, «reviews» => 130, «rating» => 15], [ «title» => «Xiaomi «, «price» => 7e3, «reviews» => 110, «rating» => 13], ]
- посмотрите как реализовано постраничное разбиение в Яндекс и Гугл
Задание 7: Работа с пространством имен
Познакомьтесь с понятием пространства имён в PHP (http://htmllab.ru/php-namespace/) и напишите свою реализацию функции print_r(), которая будет выводить содержимое сразу в <pre>
<code class="PHP">...</code></pre>
Задание 8: Создание PHP-приложения
Создайте PHP-приложение так, чтобы основной точкой входа в приложение был файл index.php.
- Рядом с index.php создайте папку pages с HTML и PHP страницами
- Подключайте страницы в зависимости от входного параметра q
- Настройте работу чистых ссылок и проверьте, что в зависимости от URL адресной строки подключаются различные файлы
- Примечание: вспомните работу с
.htaccess
и посмотрите функциюfile_exists()
Задание 9: Сортировка товаров
Выведите массив товаров в виде таблицы. Создайте ссылки для сортировки каждого параметра ( «по цене», «по рейтингу», «по отзывам»)
- При первом нажатии на ссылку «по цене», должна выполняться сортировка по возрастанию параметра «📈»; при повторном нажатии — по убыванию параметра «📉»
- GET-параметр для сортировки должен называться «how»
- Значения how: aprice — возрастание цены, dprice -убывание цены, reviews — по убыванию отзывов, rating — по убыванию рейтинга
- Ссылка с выбранным порядком сортировки должна обёртываться в
<strong>
- Ссылки для сортировки должны находится ячейках
<th>
(раздела<thead>
) таблицы - Когда выводятся товары, «цена» должна быть без значков сортировки. А при нажатии — показывать как отсортированы товары (т.е. в один момент времени может быть только одна стрелка). При повторном нажатии стрелка должна меняться на противоположную
[ [ "title" => "Lenovo", "price" => 9e3, "reviews" => 107, "rating" => 11], [ "title" => "iPhone", "price" => 9e4, "reviews" => 120, "rating" => 12], [ "title" => "Samsung", "price" => 5e4, "reviews" => 110, "rating" => 14], [ "title" => "Lenovo", "price" => 2e4, "reviews" => 130, "rating" => 15], [ "title" => "Xiaomi ", "price" => 7e3, "reviews" => 110, "rating" => 13], ]
Задание 10: Фильтрация товаров
Создайте массив из товаров (ассоциативных массивов) с ключами «название», «производитель», «цена», «цвет» и форму фильтрации по названию товара (input type text — ищем даже по части названия), диапазону цены, флажкам (checkbox) по производителям и множественному выбору цвета (<select>
)
[ [ "title" => "Lenovo Vibe Shot", "manufacturer" => "Lenovo", "price" => 9e3, "color" => "black"], [ "title" => "Apple iPhone 7 128GB", "manufacturer" => "Apple", "price" => 9e4, "color" => "white" ], [ "title" => "Samsung Galaxy S8", "manufacturer" => "Samsung", "price" => 5e4, "color" => "grey" ], [ "title" => "Lenovo P2", "manufacturer" => "Lenovo", "price" => 2e4, "color" => "grey" ], [ "title" => "Xiaomi Mi6 128GB", "manufacturer" => "Xiaomi", "price" => 7e3, "color" => "white" ], [ "title" => "Xiaomi Mi Note 3 64Gb", "manufacturer" => "Xiaomi", "price" => 2e4, "color" => "black" ], ]
- При вводе данных в форму и отправке запроса, должны показываться только товары отвечающие всем условиям одновременно
- Если форма не заполнена — показывать все товары
- Форма и товары должны быть организованы в двух столбцах (форма в правом столбце)