PHP практика: после курса основ PHP

Задание  1: Создание многошаговой формы

Создайте произвольную форму с  двенадцатью элементами управления. Напишите такой PHP код, чтобы посетитель мог заполнять форма частями по 3-4 элемента. Т.е. должно быть 4 или 3 шага заполнения.

  1. PHP-скрипт и форма должны быть реализованы в рамках одного файла
  2. На всех шагах форма должна «помнить» введённые прежде значения
  3. После отправки формы на последнем шаге заполнения, все заполненные данные должны выводиться в тег <pre>
  4. На каждом шаге заполнения над формой должен быть заголовок <h2> с фразой отображающей номер шага. Например,  «Шаг 1 из 3»
  5. Во всех заданиях код нужно снабжать комментариями
  6. Для организации используйте скрытое поле со счетчиком шага (input type=hidden)
  7. У полей ввода, которые не должны быть видны также должен иметься type=hidden
  8. В задаче нельзя использовать сессии (мы ведь их изучаем позже!)

Задание  2: Создание формы логина

Создайте форму для ввода логина и пароля. Параметры полей должны называться login и psw. Если логин и пароль вводятся правильно (значения «admin» и «Fs~j4Ms|Go») — выводить «секретное» меню для менеджера сайта, иначе сообщение о некорректном вводе

  1. Это тренировочное задание: оно не требует работы с сессиями или базой.
  2. Пароль при вводе не должен быть виден в поле ввода
  3. Используйте для работы Bootstrap
  4. Укажите метод POST в элементе <form>
  5. Форма должна отправляться на саму себя
  6. Для удобства проверки решения, поместите логин и пароль в константы (admin: Fs~j4Ms|Go, psw: Fs~j4Ms|Go)
  7. Секретное меню представляет собой 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>
  1. После выполнения задания и проверки его мной, поиграйтесь с набором ключей массива и вариантами вывода формы
  2. После отправки формы, в полях должны оставаться отправленные значения
  3. При нажатии на 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)

  1. массив должен быть отсортирован по любому ключу
  2. [ [ «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/)

  1. выведите массив данных так, чтобы на каждой странице показывалось три товара
  2. массив данных [ [ «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], ]
  3. посмотрите как реализовано постраничное разбиение в Яндекс и Гугл

Задание  7: Работа с пространством имен

Познакомьтесь с понятием пространства имён в PHP (http://htmllab.ru/php-namespace/) и напишите свою реализацию функции print_r(), которая будет выводить содержимое сразу в <pre> <code class="PHP">...</code></pre> 

Задание  8: Создание PHP-приложения

Создайте PHP-приложение так, чтобы основной точкой входа в приложение был файл index.php.

  1. Рядом с index.php создайте папку pages с HTML и PHP страницами
  2. Подключайте страницы в зависимости от входного параметра q
  3. Настройте работу чистых ссылок и проверьте, что в зависимости от URL адресной строки подключаются различные файлы
  4. Примечание: вспомните работу с .htaccess и посмотрите функцию file_exists()

Задание  9: Сортировка товаров

Выведите массив товаров в виде таблицы. Создайте ссылки для сортировки каждого параметра ( «по цене», «по рейтингу», «по отзывам»)

  1. При первом нажатии на ссылку «по цене», должна выполняться сортировка по возрастанию параметра «📈»; при повторном нажатии — по убыванию параметра «📉»
  2. GET-параметр для сортировки должен называться «how»
  3. Значения how: aprice — возрастание цены, dprice -убывание цены, reviews — по убыванию отзывов, rating — по убыванию рейтинга
  4. Ссылка с выбранным порядком сортировки должна обёртываться в  <strong>
  5. Ссылки для сортировки должны находится ячейках <th> (раздела <thead>) таблицы
  6. Когда выводятся товары, «цена» должна быть без значков сортировки. А при нажатии — показывать как отсортированы товары (т.е. в один момент времени может быть только одна стрелка). При повторном нажатии стрелка должна меняться на противоположную
[
 [ "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" ],
]
  1. При вводе данных в форму и отправке запроса, должны показываться только товары отвечающие всем условиям одновременно
  2. Если форма не заполнена — показывать все товары
  3. Форма и товары должны быть организованы в двух столбцах (форма в правом столбце)