Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP для продвинутых.docx
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
12.54 Mб
Скачать

12. Конструктор форм

Конструктор форм использует объект CForm для описания параметров, необходимых для создания HTML формы, таких как модели и поля, используемые в форме, а также параметры построения самой формы. Разработчику достаточно создать объект CForm, задать его параметры и вызвать метод для построения формы.

Параметры формы организованы в виде иерархии элементов формы. Корнем является объект CForm. Корневой объект формы включает в себя две коллекции, содержащие другие элементы: CForm::buttons и CForm::elements. Первая содержит кнопки (такие как «Сохранить» или «Очистить»), вторая — поля ввода, статический текст и вложенные формы — объекты CForm, находящиеся в коллекции CForm::elements другой формы. Вложенная форма может иметь свою модель данных и коллекции CForm::buttons и CForm::elements.

Когда пользователи отправляют форму, данные, введённые в поля ввода всей иерархии формы, включая вложенные формы, передаются на сервер. CForm включает в себя методы, позволяющие автоматически присвоить данные полям соответствующей модели и провести валидацию.

Создание формы входа на сайт

Сначала создадим экшн login

Экшн формы. Листинг 12.1

public function actionLogin()

{

$model = new LoginForm;

$form = new CForm('application.views.site.loginForm', $model);

if($form->submitted('login') && $form->validate())

$this->redirect(array('site/index'));

else

$this->render('login', array('form'=>$form));

}

Здесь мы создали объект CForm, используя конфигурацию, найденную по пути, который задан псевдонимом application.views.site.loginForm. Объект CForm, как описано в разделе «Создание модели», использует модель LoginForm.

Если форма отправлена, и все входные данные прошли проверку без ошибок, перенаправляем пользователя на страницу site/index. Иначе выводим представление login, описывающее форму.

Псевдоним пути application.views.site.loginForm указывает на файл PHP protected/views/site/loginForm.php. Этот файл возвращает массив, описывающий настройки, необходимые для CForm:

Файл loginForm.php, возвращающий массив настроек для формы. Листинг 12.2

return array(

'title'=>'Пожалуйста, представьтесь',

'elements'=>array(

'username'=>array(

'type'=>'text',

'maxlength'=>32,

),

'password'=>array(

'type'=>'password',

'maxlength'=>32,

),

'rememberMe'=>array(

'type'=>'checkbox',

)

),

'buttons'=>array(

'login'=>array(

'type'=>'submit',

'label'=>'Вход',

),

),

);

Свойство elements является массивом, каждый элемент которго соответствует элементу формы. Это может быть поле ввода, статический текст или вложенная форма.

Поле ввода

Поле ввода, главным образом, состоит из заголовка, самого поля, подсказки и текста ошибки и должно соответствовать определённому атрибуту модели. Описание поля ввода содержится в экземпляре класса CFormInputElement. Приведённый ниже код массива CForm::elements описывает одно поле ввода:

Элемент массива для поля ввода. Листинг 12.3

'username'=>array(

'type'=>'text',

'maxlength'=>32,

),

Любое доступное для записи свойство CFormInputElement может быть настроено приведённым выше способом.

К примеру, можно задать свойство hint для того, чтобы показывать подсказку или свойство items, если поле является выпадающим списком или группой элементов checkbox или radio. Если имя опции не является свойством CFormInputElement, оно будет считаться атрибутом соответствующего HTML-тега input. Например, так как опция maxlength не является свойством CFormInputElement, она будет использована как атрибут maxlength HTML-элемента input.

Следует отдельно остановиться на свойстве type. Оно определяет тип поля ввода. К примеру, тип text означает, что будет использован элемент формы input, а password — поле для ввода пароля. В CFormInputElement реализованы следующие типы полей ввода:

text

hidden

password

textarea

file

radio

checkbox

listbox

dropdownlist

checkboxlist

radiolist

Отдельно следует описать использование "списочных" типов dropdownlist, checkboxlist и radiolist. Для них необходимо задать свойство items соответствующего элемента input. Сделать это можно так:

Использование свойства items. Листинг 12.4

'gender'=>array(

'type'=>'dropdownlist',

'items'=>User::model()->getGenderOptions(),

'prompt'=>'Выберите значение:',

),

class User extends CActiveRecord

{

public function getGenderOptions()

{

return array(

0 => 'Мужчина',

1 => 'Женщина',

);

}

}

Данный код сгенерирует выпадающий список с текстом «Выберите значение:» и опциями «Мужчина» и «Женщина», которые мы получаем из метода getGenderOptions модели User.

Статический html-код

HTML-код можно вписать в CForm::elements.

Вставка статического html-кода. Листинг 12.5

return array(

'elements'=>array(

......

'password'=>array(

'type'=>'password',

'maxlength'=>32,

),

'<hr />',

'rememberMe'=>array(

'type'=>'checkbox',

)

),

......

);

В приведённом коде мы вставили горизонтальный разделитель между полями password и rememberMe.

Статический html-код лучше всего использовать в том случае, когда разметка и её расположение достаточно уникальны. Если некоторую разметку должен содержать каждый элемент формы, лучше всего переопределить непосредственно построение разметки формы.

Доступ к элементам формы

Обращаться к элементам формы так же просто, как и к элементам массива. Свойство CForm::elements возвращает объект CFormElementCollection, наследуемый от CMap, что позволяет получить доступ к элементам формы как к элементам массива. Таким образом, чтобы обратиться к элементу username формы login из вышеприведённого примера, можно использовать следующий код:

Рассмотрим шаблон login.php

Файл шаблона login.php. Листинг 12.6

<h1>Вход</h1>

<div class="form">

<?php echo $form; ?>

</div>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]