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



Мы будем использовать два файла

📃 create_product.php, который будет нашим кодом / контроллером.
📃 views / cupcakes / form.blade.php, который будет нашим представлением (HTML с использованием аннотации Blade).

Это наше предыдущее упражнение:

А теперь мы хотим создать такую ​​форму:

Это наша логика

Эта блок-схема упрощена, реальная логика, лежащая в основе формы, далека от сложной.

Например, текстовое поле с именем name.

  • Это поле обязательно к заполнению. Если пользователь не добавляет информацию, должно отображаться сообщение об ошибке.
  • Это поле имеет минимальный размер (это пример), если размер имени меньше 2, то в нем должна отображаться ошибка.
  • Это поле имеет максимальный размер, и, опять же, если размер больше значения, в нем должна отображаться ошибка.
  • Можно даже добавить дополнительные проверки.

И это всего лишь одно текстовое поле, наша форма (она простая), имеет 4 ввода текста.

Валидация совсем не простая. Хотя это можно сделать вручную, но эта работа утомительна.

Кроме того, мы создаем не только базовую проверку, но и полную визуальную проверку. Я объясняю.

Базовая проверка

Базовая проверка может быть записана как:

function validation($cupcake) {
   // returns true or false
}

Это просто, но не хватает деталей. Он может возвращать истину или ложь, истину, если модель (называемую $ cupcake) верна, или терпит неудачу, если она терпит неудачу. Однако пользовательскому интерфейсу не хватает деталей, что, если пользовательский ввод не удастся ?. Что мы покажем ?. Общее сообщение ?.

Базовая проверка II

Однако мы могли бы добавить больше информации. Что, если вместо возврата логического значения мы вернем сообщение об ошибке?

function validationV2($cupcake) {
   // returns a message with the error (or empty if there is not error)
}

Это намного лучше. Но что, если пользовательский ввод не работает более чем один раз одновременно?

Лучшая проверка

Мы могли показывать более одного сообщения одновременно.

Хорошо, это правильно, но визуально мы показываем сразу одни и те же сообщения.

Расширенная проверка

Вот этот:

Теперь мы говорим. Эта проверка должна позволять показывать каждое сообщение отдельно или показывать их все вместе.

Для этой работы мы будем использовать следующую библиотеку.



В чем преимущество этой библиотеки:

  • Это просто и бесплатно.
  • Это масштабируемое.
  • Он минималистичный, но завершенный.

Давай работать

Во-первых, нам нужно установить библиотеку. Если мы используем composer. мы могли бы использовать следующую команду:

›Композитору требуется eftec / validationone

И мы могли бы использовать валидацию как:

$validaton=new \eftec\ValidationOne("frm_");

Где $ validaton - наш класс проверки.

«frm_» - необязательный префикс. Это происходит от имени значения POST. Это наш «вводимый текст»: (вы можете видеть, что имя ввода - «frm_name»

<input type="text" class="form-control"
       name="frm_name" id="frm_name">

ValidationOne выполняет множество задач.

  • Он позволяет читать вводимые пользователем данные (POST / GET / FILE), но также позволяет добавлять ввод вручную (переменная или константа). В этом случае нам нужно читать из POST и FILE.
  • Это позволяет добавить проверку к каждому входу.
  • Каждая ошибка хранится внутри контейнера. Таким образом, можно отображать каждое сообщение для каждого контейнера или все вместе.

Итак, ValidationOne ломает концепцию SRP, но это делается для профессионалов в удобстве использования. Он работает на бизнес-уровне и на визуальном уровне нашего проекта.

Это наша полная проверка для поля / текстового поля с именем name

$cupcake['Name'] = $validaton
   ->def("")
   ->ifFailThenDefault(false)
   ->type("varchar")
   ->condition("req", "this value (%field) is required")
   ->condition("minlen", "The minimum lenght is 3", 3)
   ->condition("maxlen", "The maximum lenght is 100", 100)
   ->post('name'); 

Базовая версия выглядит следующим образом

$cupcake['Name'] = $validaton
   ->post('name');

Эта версия не проверяет информацию, она просто считывается из POST, но нам нужны все проверки.

Шаги

  1. Начнем использовать наш класс валидации.
$cupcake['Name'] = $validaton

2. (необязательно) мы определили значение по умолчанию. Это значение используется, если ввод не введен.

->def("")

3. (необязательно). Если операция не удалась, мы могли бы присвоить значение по умолчанию. В этом случае нет.

->ifFailThenDefault(false)

4. (необязательно) Тип данных. Мы могли бы указать, является ли значение числом, текстом (varchar) и т. Д. По умолчанию каждое условие считается varchar.

->type("varchar")

5. (проверка). Здесь мы могли бы добавить нашу проверку. Он допускает различные виды проверки (включая пользовательские функции). В этом случае мы добавляем проверку, где поле обязательно. Сообщение об ошибке (если условие не выполнено) необязательно.

->condition("req", "this value (%field) is required")

Например, если мы хотим показать сообщение на итальянском языке, тогда.

->condition("req", "questo valore (%field) è richiesto")

% field - это имя поля (в данном случае «name»), есть другие переменные, которые можно использовать.

Или, если мы хотим использовать сообщение по умолчанию, мы могли бы использовать

->condition("req")

Для некоторых проверок требуется значение, это значение может быть простым значением или массивом. Например, предположим, что мы добавляем проверку между двумя значениями

->condition("between", "The price must be between %first and %second", [0,1000])

6. Завершите нашу цепочку проверки (прочтите ввод пользователя)

Наконец, мы читаем вводимые пользователем данные и завершаем цепочку проверки (чтобы система проверяла значение).

->post('name');

Он прочитает значение «frm_name» из POST.

он также создает «контейнер сообщений» под названием «имя».

Показать ошибки (если есть)

Есть несколько способов получить сообщения об ошибках. Он показывает все сообщения из всех контейнеров.

$validaton->getMessages()

Однако, если мы хотим показать ошибку из одного контейнера, мы могли бы использовать следующую команду

$validaton->getMessageId("name")

где «имя» - это имя контейнера. Эта операция не завершится ошибкой, если контейнера не существует или он пуст.

Мы можем показать первую ошибку (если есть), все ошибки, все сообщения (ошибки, предупреждения) и другие альтернативы.

Например, показывает первую ошибку

$validaton->getMessageId("name")->firstError()

И мы могли бы показать валидацию прямо на уровне представления.

<div class="col-sm-9">
    <input type="text" class="form-control"
           name="frm_name" id="frm_name" 
           value="{{$cupcake['Name']}}">
    <small class="form-text text-danger">
        {{$validaton->getMessageId("name")->firstError()}}
    </small>
</div>

Наконец, наши два файла

create_product.php

просмотр / form.blade.php

И конечный код здесь



Это результат

Примечание:

$cupcake['Image'] = $validaton
   ->def("")
   ->ifFailThenDefault(false)// if fails then we show the same value however it triggers an error
   ->type("file")
   ->condition("image", "The file is not a right image")
   ->condition("ext", "The file is incorrect", ['jpg', 'png'])
   ->condition("req", "this value (%field) is required")
   ->getFile('image', false); // it returns an array [filename,filetmp]

Эта проверка ожидала ввода файла.

  • $ cupcake [‘Image’] = [имя нового файла, временное имя файла]
->condition("image", "The file is not a right image")

Он проверяет, является ли файл изображением. Он использует getimagesize ($ fileNameTmp), но также проверяет расширение.