19. Класс HTML-формы (form)
Представляет из себя генератор HTML-форм. Его использование облегчает написание кода, помогает привести HTML-код к единому виду, а также избавляет от необходимости вставлять в поля данные из $_POST (если форма была заполена неверно). Особо полезно использовать генератор в административной части сайта.
Данный класс можно использовать в роли MVC-представления, для этого MVC-действие контроллера (подробнее о контроллере и действиях) должно вернуть (return) экземпляр класса.
Типичный пример кода (файл /controller/example.php):
public function actionTest() { //действие контроллера
$f=core::form(); //получение экземпляра класса
$f->text('name','Введите что-нибудь');
$f->submit();
return $f; //использовать форму в роли представления
}
public function actionTestSubmit($data) {
// В $data будут находиться данные формы
}
Создание экземпляра класса form: $form=core::form(string $namespace=null);
Тут $namespace — область для POST-данных формы (если не задано, то будет использовано имя текущего контроллера). В приведённом выше примере поле name HTML-формы имеет вид:
<input name="example[name]" type="text" />
namespace определяет для кого предназначаются данные. В submit-действие контроллера попадают только те данные, имя namespace для которых такое же, как имя контроллера. Тоесть: $_POST['example']. В приведённом выше примере в функцию actionTestSubmit() будет передано содержимое $_POST['example']. Такая группировка данных нужна чтобы, например, позволить виджету обрабатывать данные форм - контроллер при этом никак не должен реагировать на эти данные.
Если HTML-форма содержит поля для загрузки файлов, то они также будут переданы в submit-действие. Тоесть $_POST и $_FILES будут объединены в один массив $data.
Если при вызове core::form() namespace не задан, то будет подставлено имя текущего контроллера.
Список возможных полей представлен на этой странице ниже.
Существует два метода добавления HTML-поля к форме:
-
Использовать функции, возвращающие HTML-код поля: getLabel(), getText(), getEmail() и т.д. Используя возвращаемый код, нужно самостоятельно сформировать HTML-форму. Использование этих функций лучше непосредственного написания HTML-кода тем, что вам не нужно заботиться о том, чтобы подставить нужные данные в форму из $_POST (если форма была заполнена неверно и её нужно отобразить вновь).
Пример:
<?php $form=core::form(); ?> <form action="" method="post"> <?=$form->text('name','Ваше имя','значение по умолчанию')?><br /> <?=$form->submit()?> </form>
-
Вызывать методы label(), text(), email() и т.д. Эти методы добавят поля к форме. Затем при помощи метода form::render() можно сгенерировать HTML-форму целиком. Это проще, чем первый вариант, но не подходит, если требуются нестандартные элементы вёрстки.
Пример:
$form=core::form(); $form->text('name','Имя','значение по умолчанию'); $form->render();
Форма, сгенерированная таким образом будет "обёрнута" тегом <dl> и будет выглядеть следующим образом:
<form action="example/test" method="post" name="example" class="example">
<dl class="form">
<dt class="text name">Имя</dt>
<dd class="text name">
<input type="text" name="example[test]" value="значение по умолчанию" />
</dd>
<dd class="submit">
<input type="submit" class="button submit" />
</dl>
</form>
Атрибуты и методы класса
form::$action;
URL-адрес, на который будет отправлена форма (атрибут "action" тега <form>). Дополнительно "оборачивать" при помощи core::link() не требуется. Если этот атрибут нигде не был задан, то форма будет отправлена на ту же страницу, где она отображена.
form::$method;
Метод отправлки формы (POST/GET). По умолчанию "POST".
form::hidden(), form::label(), form::text(), form::email(), form::select(), form::listBox(), form::radio(), form::checkbox(), form::password(), form::textarea(), form::editor(), form::date(), form::file(), form::captcha(), form::reset(), form::submit()
Добавляют к форме соответствующие поля. Подробнее ниже.
form::field($type, $data1, $data2, $data3, $data4=null, $data5=null);
Добавляет к форме одно из полей, тип которого указан в $type, значения других аргуметнов зависят от типа поля.
form::html($html);
Добавляет к форме произвольный HTML-код. Этот метод может быть вызван между добавлениями полей к форме.
form::render($action=null, $html='');
Выводит в поток HTML-код формы (рендеринг). $action - URL, куда будет отправлена форма (атрибут "action" тега <form>). Оборачивать адрес при помощи core::link() не требуется. $html - произвольный HTML-код, добавляемый к тегу <form>.
form::getHidden(), form::getText(), form::getEmail(), form::getSelect(), form::getListBox(), form::getRadio(), form::getCheckbox(), form::getPassword(), form::getTextarea(), form::getEditor(), form::getDate(), form::getFile(), form::getCaptcha(), form::getReset(), form::getSubmit()
Возвращает HTML-код поля формы. Подробнее ниже.
Типы полей
Оба варианта функций (с "get" и без "get") имеют одинаковые аргументы, только у методов с приставкой "get" нет атрибута $label (порядок следования атрибутов одинаков). Они зависят от типа полей, которые представлены ниже.
-
form::label($name, $label);
Визуально отображаемая надпись, не является полем формы. $name - имя поля, $label - значение. В форме отображается примерно так:
Ваш логин: my_login -
form::hidden($name, $value, $html='');
Скрытое поле (<input type="hidden">). $name - имя поля, $value - значение, $html - произвольный HTML-код, добавляемый к тегу <input>. -
form::text($name, $label, $value='', $html='');
Текстовое поле (<input type="text">). $name - имя поля, $label - отображаемый заголовок поля, $value - значение по умолчанию, $html - произвольный HTML-код, добавляемый к тегу <input>. -
form::email($name, $label, $value='', $html='');
Поле для ввода адреса электронной почты (<input type="email">). $name - имя поля, $label - отображаемый заголовок поля, $value - значение по умолчанию, $html - произвольный HTML-код, добавляемый к тегу <input>. -
form::select($name, $label, $items, $value=null, $nullTitle=null, $html='');
Выпадающий список (<select>...</select). $name - имя поля, $label - отображаемый заголовок поля, $items - список элементов выпадающего списка, $value - значение по умолчанию, $nullTitle - заголовок для "пустого" значения, $html - произвольный HTML-код, добавляемый к тегу <input>.
Атрибут $items может быть либо массивом (каждый элемент - это двумерный массив: [0] => значение, [1] - заголовок), либо SQL-запросом, возвращающим два поля: первое - значение поля, второе - заголовок.
Если $nullTitle не задан (null), то в списке не будет "пустого" значения. -
form::listBox($name, $label, $items, $value=null, $nullTitle=null, $html='');
Многострочный список. Смысл полей такой же как у form::select(). -
form::radio(($name, $label, $items, $value=null);
Группа переключателей (<input type="radio">). Смысл полей такой же, как у form::select(). -
form::checkbox($name, $label, $value='', $html='');
Флажок (<input type="checkbox">). $name - имя поля, $label - отображаемый заголовок поля, $value - значение по умолчанию, $html - произвольный HTML-код, добавляемый к тегу <input>. -
form::password($name, $label, $html='');
Поле для ввода пароля (<input type="password">). $name - имя поля, $label - отображаемый заголовок поля, $html - произвольный HTML-код, добавляемый к тегу <input>. -
form::textarea($name, $label, $value='', $html='');
Многостраничное поле ввода текста (<textarea>). $name - имя поля, $label - отображаемый заголовок поля, $value - значение по умолчанию, $html - произвольный HTML-код, добавляемый к тегу <textarea>. -
form::editor($name, $label, $value='', $html='');
Многостраничное поле ввода текста с визуальным редактором (<textarea>). $name - имя поля, $label - отображаемый заголовок поля, $value - значение по умолчанию, $html - произвольный HTML-код, добавляемый к тегу <textarea>.
Редактор имеет возможность загружать файлы мультимедиа на сервер, однако такая возможность отключена, если пользователь не является администратором. -
form::date($name, $label, $value='', $html='');
Поле для ввода даты (<input type="date">). $name - имя поля, $label - отображаемый заголовок поля, $value - значение по умолчанию, $html - произвольный HTML-код, добавляемый к тегу <input>.
Атрибут $value может содержать дату в формате UNIX TIMESTAMP, YYYY-MM-DD или DD-MM-YYYY. -
form::file($name, $label, $multiple=false, $html='');
Поле для загрузки файла (<input type="file">). $name - имя поля, $label - отображаемый заголовок поля, $multiple - разрешено ли выбрать несколько файлов, $html - произвольный HTML-код, добавляемый к тегу <textarea>.
Если $multiple=true, то в submit-действие это поле будет передано ввиде массива. -
form::captcha($name, $label, $html='');
Поле для ввода текста с картинки (<img src="/captcha.php">...<input type="text">). $name - имя поля, $label - отображаемый заголовок поля, $html - произвольный HTML-код, добавляемый к тегу <input>. -
form::reset($label, $html='');
Кнопка сброса формы (<input type="reset">). $label - отображаемый заголовок поля, $html - произвольный HTML-код, добавляемый к тегу <input>. -
form::submit($label=LNGContinue, $name=null, $html='');
Кнопка отправки формы. $label - отображаемый заголовок поля, $name - имя поля, $html - произвольный HTML-код, добавляемый к тегу <input>.