Создание форм
Создание форм в MV имеет схожие принципы с созданием моделей. Необходимо задать список полей, после чего вызвать методы для отображения и проверки данных формы. При создании формы есть 2 подхода: вывести форму из готовой модели и создать новую форму отдельно.
Форма из модели
Предположим имеется модель "Вопросы и ответы", на сайте необходимо организовать возможность для посетителей оставлять вопросы, которые затем будут модерироваться в административной части.
Пример
<? class Faq extends Model { protected $name = "Вопросы и ответы"; protected $model_elements = array( array("Активация", "bool", "active"), array("Имя", "char", "name", array("required" => true)), array("Дата", "date_time", "date"), array("Текст вопроса", "text", "question", array("required" => true)), array("Текст ответа", "text", "answer") ); public function display() { ... //Отображение списка вопросов и ответов на сайте } } ?>
Таким образом имеется готовая модель, часть полей которой нужно отобразить на сайте в виде формы. Необходимые нам поля: "Имя" и "Текст вопроса". Предположим наша форма отображается в шаблоне "view-help.php".
<? $content = $mv -> pages -> findContent(array("url" => "help", "active" => 1)); $mv -> display404($content); //Определение страницы в меню $form = new Form("Faq"); //Создание формы из модели ?> ... <form action="?ask" method="post"> <h3>Задать вопрос</h3> <table> <? echo $form -> display(array("name", "question")); //Выводим только 2 поля в нужной последовательности ?> </table> <div class="form-submit"> <input type="submit" value="Отправить" /> </div> </form>
Проверка корректности заполнения полей формы и вывод списка ошибок
<? $form = new Form("Faq"); if(!empty($_POST)) { $form -> getDataFromPost() -> validate(array("name", "question")); ... } ?> ... <form class="regular simple" action="?ask" method="post"> <h3>Задать вопрос</h3> <? echo $form -> displayErrors(); ?> ... </form>
После проверки корректности заполнения полей нам необходимо занести новый вопрос в базу данных и перезагрузить страницу для сброса POST данных.
<? $form = new Form("Faq"); if(!empty($_POST)) { $form -> getDataFromPost() -> validate(array("name", "question")); if(!$form -> hasErrors()) { $mv -> faq -> getDataFromArray($form -> getAllValues()); $mv -> faq -> setValue("date", I18n :: getCurrentDateTime("with-seconds")); $mv -> faq -> create(); $mv -> redirect("help/?send"); } } ?> ... if($form -> hasErrors()) echo $form -> displayErrors(); else if(isset($_GET['send'])) { echo "<p>Ваш вопрос был успешно отправлен.<br />"; echo "В скором времени ответ будет опубликован в данном разделе.</p>"; } if(empty($_GET)) echo $mv -> faq -> display();
Форма также может строиться на основе конкретной записи из модели. Такая потребность возникает например для редактирования записи на frontend части сайта. При этом вторым параметром при создании формы должен выступать id нужной записи из модели, и тогда в полях формы будут выведены значения данной записи.
$form = new Form("Clients", 52); $form -> loadRecord(); //Можно передать массив полей которые необходимо заполнить из данных записи $form -> loadRecord(array("first_name", "last_name", "phone", "email"));
Форма без привязки к модели
Для создания отдельной от модели формы необходимо задать список полей. Методы работы с такой формой аналогичны предыдущему примеру.
<? $fields = array(array("Имя", "char", "name", array("required" => true)), array("Email", "email", "email"), array("Файл", "file", "file", array("files_folder" => "form_files")), array("Сообщение", "text", "message", array("required" => true)) ); $form = new Form($fields); ?>
Внимание! Если форма содержит поля типа file или image, то на страницу необходимо добавить следующий Java Script код (предполагается наличие подключенной библиотеки JQuery). Данный скрипт позволяет удалить выбранный файл и вернуть поле для загрузки нового файла. Также, если форма построена не из модели, то должен быть параметр с названием папки для сохранения файлов, как в примере выше.
$(document).ready(function() { $("form .field-input span.delete").click(function() { $(this).parents("div.file-params").empty().next().show(); }); });
Предыдущий раздел
Специальные методы