- •Оглавление
- •I. Инструментарий
- •II. Шаблоны проектирования
- •1. Простой
- •2. Шаблонная функция
- •3. Метод буферизации
- •III. Фрэймворк Kohana
- •1. Знакомство с Kohana
- •2. Роутинг
- •7. Взаимодействие модели, контроллера и шаблона
- •8. Создание новых классов и подключение сторонних библиотек
- •9. Конфигурирование
- •10. Языковые файлы
- •11. Системные сообщения
- •12. Хелперы
- •Мы можем использовать любые строковые функции php, добавляя к ним класс utf8
- •13. Этапы создания проекта
- •14. Виджеты
- •Сложные запросы
- •17. Модуль orm
- •Т.Е. Если мы вторым параметромне указываем идендификатор, мы добавляем запись, если указываем – мы обновляем строку с указанным идентификатором.
- •Но если мы попытаемся удалить запись, которой не существует, то увидим сообщение об ошибке. Чтобы избавиться от этой ошибки, есть специальный метод, который проверяет, возвращает ли запрос результат.
- •Если метод возвращает true, то происходит удаление записи.
- •Если таблица userimage связана стаблице user связью belongs_to, то таблица user связана с таблицей userimage связью has_many.
- •19. Использование orm в виджетах
- •20. Модуль Auth
- •21. Модуль Image
- •22. Совместное использование модуля Image и js-скриптов, об-рабатывающих изображения.
- •Далее в контроллер добавим функцию для работы с изображениями.
- •В контроллере произведем вставку изображений в папку и запись в таблицу.
- •Чтобы вывести постраничную навигацию, например, на страницу пользователей, нам сперва нужно узнать общее количество пользователей, которое впоследствии нужно передать в параметр total_items.
- •А вот и сам экшн:
- •Как видно из листинга в шаблон мы передали переменную pagination, в которой будет находиться шаблон вывода ссылок на страницы. Осталось только вывести данную переменную в шаблоне.
- •Если в роуте используются параметры controller, action, directory либо id, то их необходимо передавать в класс pagination в метод route_params().
- •24. Операции crud. Разработка системы администрирования.
- •25. Модуль кэширования
- •В kohana также имеется отдельный модуль cache. Для его подключения необходимо раскомментировать нужную строку в файле bootstrap.Php
- •После подключения модуля необходимо скопировать из папки с модулем конфигурационный файл и переместить его в папку config/ в конфигурационном файле cache.Php имеется несколько групп настроек.
- •Каждая группа настроек работает со своим драйвером для кэширования. В зависимости от выбранного типа настроек, закэшированные файлы будут храниться либо в памяти компьютера, либо в других файлах.
- •28. Многоуровневые комментарии. Алгоритм NestedSets. Модуль orm-mptt
- •29. Модальное окно на ajax
- •30. Парсинг
- •31. Отладка
- •32. Профилирование
- •33. Документация kohana, модуль Userguide
- •34. Модуль Codebench
- •36. Другие модули Kohana
- •37. Состояние проекта
- •38. Дополнительное конфигурирование
- •39. Уязвимость Kohana
- •Установка yii
- •2. Структура yii
- •3. Конфигурирование yii, файл config/main.Php
- •4. Маршрутизация
- •7.Подключение шаблонов
- •8. Полезное.
- •9. Модель. Работа с базой данных.
- •11. Валидация
- •1. Определение класса модели
- •2. Определение правил проверки
- •4. Стандартные правила валидации
- •12. Конструктор форм
- •13. Хелперы форм
- •14. Обработка изображений
- •15. Постраничная навигация и cActiveDataProvider
- •16. Виджеты
- •17. Создание виджета круговой диограммы
- •18. Виджет cMenu
- •19. Хлебные крошки. Виджет cBreadcrumbs
- •20. Виджет cDetailView
- •21. Виджет chml, хелперы html
- •22. Виджет cListView
- •23. Виджет cGridView, таблица администратора
- •25. Модули
- •26. Авторизация
- •27. Контроль доступа на основе ролей
- •V. Краткий обзор и сравнение фрэймворков yii и Kohana
- •VI. Система контроля версий
- •Синхронизация локальных файлов с репозиторием
- •Открытие проекта Mercurial в среде ide
- •Получение файлов из репозитория
- •Импорт файлов в репозиторий
- •Изменение файлов исходного кода
- •Просмотр изменений в редакторе исходного кода
- •Просмотр информации о состоянии файла
- •Метки и условные цвета
- •Ярлыки состояния файлов
- •Окно контроля версий
- •Сравнение редакций файлов
- •Внесение изменений в локальную рабочую копию
- •Переходы между различиями в сравниваемых файлах
- •Изменение критериев просмотра
- •Слияние редакций файлов
- •Фиксация исходных файлов в репозитории
- •Обновление локальных копий
- •Выполнение фиксации
- •Обновление проблем
- •Выгрузка локальных изменений в общий репозиторий
- •Клонирование репозитория Git из GitHub с использованием протокола ssh
- •VI. Обзор рынка
- •VII. Программа курса php для продвинутых
- •Обзор рынка.
- •Php для продвинутых
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>
