[how to] Красота JHTML, или создание элементов формы средствами Joomla! - 2Я недавно сел разбираться, как же всё таки работает JHTML. И появилась мысль всё, чему научусь сам, задокументировать в виде темы на форуме.
Порыскал по форуму, нашёл похожую
тему. Она и становится отправной точкой, а так же в честь неё названа эта тема.
В указанной теме приведён пример выпадающего списка SELECT. Но там всё расписано не подробно, моей же целью является описать максимальные возможности
JHTML по созданию элементов форм. По этому не в обиду автору, но чуть позже я повторюсь и приведу здесь пример создания выпадающего списка с более объёмными и подробными комментариями.
Как работает JHTML::_()?Практически всегда доступ к объектам
JHTML осуществляется через загрузочную функцию
JHTML::_().
Первый параметр является строкой, указывающей, какому helper-методу необходимо будет передать все последующие параметры. Параметр имеет вид строки, содержащей название префикса класса хелпера, название самого класса хелпера и название вызываемого метода, разделённые точкой. Первые два (префикс и название класса) являются не обязательными, но чаще всего название класса указывается. Таким образом, если строка состоит из двух частей, разделённых точкой, то указано название класса и метода.
Теперь, увидев в коде
$p = JHTML::_("select.genericlist", $params, $value, $text, $attribs);
мы понимаем, что
JHTML::_() загрузит класс с префиксом
JHTML (этот префикс стоит по умолчанию) и названием
Select и вызовет метод
genericlist, передав ему все остальные параметры ($params, $value, $text, $attribs).
Сам класс JHTML и функция-загрузчик определены в файле JOOMLA/libraries/html/html.php
Вызываемый в нашем примере класс JHTMLSelect и метод genericlist описаны в JOOMLA/libraries/html/html/select.php
Пример создания выпадающего списка (<SELECT>)Пример взят из приведённой выше темы и немного дополнен.
// Получаем объект базы данных
$database =& JFactory::getDBO();
// Формируем запрос
$query = "SELECT c.id AS value, c.title AS text FROM #__categories AS c WHERE c.section='com_qcontacts_details'";
// Выполняем запрос
$database->setQuery($query);
// Получаем массив объектов
$categorylist = $database->loadObjectList();
// Создаём первый элемент выпадающего списка (<option value="0">Выберите категорию</option>)
$categories[] = JHTML::_('select.option', '0', "Выберите категорию", 'value', 'text' );
// Добавляем массив данных из базы данных
$categories = array_merge( $categories, $categorylist);
// Получаем выпадающий список
$list = JHTML::_(
'select.genericlist' /* тип элемента формы */,
$categories /* массив, каждый элемент которого содержит value и текст */,
'cid' /* id и name select`a формы */,
'class="inputbox" size="1"' /* другие атрибуты элемента select */,
'value' /* название поля в массиве объектов содержащего ключ */,
'text' /* название поля в массиве объектов содержащего значение */,
0 /* value элемента, который должен быть выбран (selected) по умолчанию */,
'cid' /* id select'a формы */,
true /* пропускать ли элементы полей text через JText::_(), default = false */
);
Разберём код поподробнее.
// Формируем запрос
$query = "SELECT c.id AS value, c.title AS text FROM #__categories AS c WHERE c.section='com_qcontacts_details'";
Здесь стоит обратить внимание на то, что поля
id и
title из таблицы выбираются с параметром AS. Это означает, что впоследствии эти поля будут доступны по псевдонимам (
value и
text соотв. в нашем случае. Они будут использоваться в дальнейшем при работе с классом)). Впрочем, выборку можно было делать и без подобных излишеств. Позже укажу как именно.
// Создаём первый элемент выпадающего списка (<option value="0">Выберите категорию</option>)
$categories[] = JHTML::_('select.option', '0', "Выберите категорию", 'value', 'text' );
Здесь я хочу обратить внимание на то, что здесь мы получаем
объект. Объект будет иметь поля
value и
text (их можно определить и по-другому), и содержать значения, соответственно, 0 и "Выберите категорию".
// Получаем выпадающий список
$list = JHTML::_(
'select.genericlist' /* тип элемента формы */,
$categories /* массив, каждый элемент которого содержит value и текст */,
'name' /* id и name select`a формы */,
'class="inputbox" size="1"' /* другие атрибуты элемента select */,
'value' /* название поля в массиве объектов содержащего ключ */,
'text' /* название поля в массиве объектов содержащего значение */,
0 /* value элемента, который должен быть выбран (selected) по умолчанию */,
'cid' /* id select'a формы */,
true /* пропускать ли элементы полей text через JText::_(), default = false */
);
Ну а здесь мы остановимся поподробнее.
Первый парамерт - см. выше.
Второй параметр (
$categories) - это обязательно должен быть массив объектов, либо массив ассоциативных массивов. В случае массива объектов каждый объект должен иметь поля
value и
text, а в случае массива ассоциативных массивов - каждый из последних должен содержать ключи
value и
text (только в нашем случае, см. пятый и шестой параметры), которые будут содержать значение value, передаваемое каждому элементу <OPTION> (<OPTION value="..." />), и текст, который будет отображаться в выпадающем списке, соответственно.
Третий параметр (
'name') - это, как было сказано,
name и
id select'a формы. Впрочем, id можно задать отличным от name. См. восьмой параметр.
Четвёртый параметр - ясно.
Пятый и шестой параметры - это соответственно названия полей объектов, содержащих значения для value OPTION'a и отображаемого текста, в случае, если $categories - массив объектов, и названия ключей ассоциативного массива в случае, если $categories - массив ассоциативных массивов.
Седьмой параметр - value элемента, который должен быть выбран (selected) по умолчанию(Может быть задан в виде массива значений или массива объектов, что очень удобно. Но такой подход требуется для multiply select)
Восьмой параметр - это
id selecta. Если он не задан,
id будет совпадать с
name, заданным третьим параметром.
Девятый параметр - это флаг, показывающий, нужно ли пропускать элементы полей (в нашем случае)
text через функцию
JText::_(), и имеющий гордое название
$translate. Проще говоря, элемент для мультиязычности. По умолчанию в функции равен
false.
Ну и живой пример, в нём я намеренно сделаю названия полей отличными от приведённых в примере выше, а так же проделаю другие шалости.
// Получаем объект базы данных
$database =& JFactory::getDBO();
// Формируем запрос
$query = "SELECT c.id, c.title FROM #__categories AS c WHERE c.section='com_qcontacts_details'";
// Выполняем запрос
$database->setQuery($query);
// Получаем массив ассоциативных массивов, ключи которых соответствуют полям в базе данных, т.е. id и title
$categorylist = $database->loadAssocList();
// Создаём первый элемент выпадающего списка (<option value="0">Выберите категорию</option>)
// Обратите внимание, что мы указываем в параметрах названия полей будущего объекта, id и title.
// Они должны совпадать с ключами массивов, пришедших из базы данных
$categories[] = JHTML::_('select.option', '0', "Выберите категорию", 'id', 'title' );
// Добавляем массив данных из базы данных
// Обращаю ваше внимание на то, что мы объединяем массив ассоциативных массивов и массив объектов.
// Такая конструкция "прокатит"
$categories = array_merge( $categories, $categorylist);
// Получаем выпадающий список
$list = JHTML::_(
'select.genericlist' /* генерируем выпадающий список */,
/* массив, каждый элемент которого является ассоциативным
массивом с ключами id и title ЛИБО объектом с полями id и title */
$categories,
'name' /* только name select`a формы */,
'class="inputbox" size="1"' /* другие атрибуты элемента select */,
'id' /* название поля в массиве объектов содержащего ключ */,
'title' /* название поля в массиве объектов содержащего значение */,
0 /* value элемента, который должен быть выбран (selected) по умолчанию. */,
'cid' /* id select'a формы */,
true /* пропускать ли элементы полей text через JText::_(), default = false */
);