Красота JHTML, или создание элементов формы средствами Joomla!
Я недавно сел разбираться, как же всё таки работает JHTML. И появилась мысль всё, чему научусь сам, задокументировать в виде поста.
Порыскал по форуму, нашёл похожую тему. Она и становится отправной точкой.
В указанной теме приведён пример выпадающего списка SELECT. Но там всё расписано не подробно, моей же целью является описать максимальные возможности JHTML по созданию элементов форм. По этому позже я повторюсь и приведу здесь пример создания выпадающего списка с более объёмными и подробными комментариями.
Как работает JHTML::_()?
Практически всегда доступ к объектам JHTML осуществляется через загрузочную функцию JHTML::_().
Первый параметр является строкой, указывающей, какому helper-методу необходимо будет передать все последующие параметры. Параметр имеет вид строки, содержащей название префикса класса хелпера, название самого класса хелпера и название вызываемого метода, разделённые точкой. Первые два (префикс и название класса) являются не обязательными, но чаще всего название класса указывается. Таким образом, если строка состоит из двух частей, разделённых точкой, то указано название класса и метода.
Теперь, увидев в коде
==== CODE ====
$p = JHTML::_("select.genericlist", $params, $value, $text, $attribs);
====/ CODE ====
мы понимаем, что JHTML::_() загрузит класс с префиксом JHTML (этот префикс стоит по умолчанию) и названием Select и вызовет метод genericlist, передав ему все остальные параметры ($params, $value, $text, $attribs).
Сам класс JHTML и функция-загрузчик определены в файле JOOMLA/libraries/html/html.php
Вызываемый в нашем примере класс JHTMLSelect и метод genericlist описаны в JOOMLA/libraries/html/html/select.php
Пример создания выпадающего списка (SELECT)
==== CODE ====
// Получаем объект базы данных
$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();
// Создаём первый элемент выпадающего списка (Выберите категорию)
$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 */
);
====/ CODE ====
Разберём код поподробности.
==== CODE ====
// Формируем запрос
$query = "SELECT c.id AS value, c.title AS text FROM #__categories AS c WHERE c.section='com_qcontacts_details'";
====/ CODE ====
Здесь стоит обратить внимание на то, что поля id и title из таблицы выбираются с параметром AS. Это означает, что впоследствии эти поля будут доступны по псевдонимам (value и text соотв. в нашем случае. Это, кстати, не просто так)). Впрочем, выборку можно было делать и без подобных излишеств. Позже укажу как именно.
==== CODE ====
// Создаём первый элемент выпадающего списка (Выберите категорию)
$categories[] = JHTML::_('select.option', '0', "Выберите категорию", 'value', 'text' );
====/ CODE ====
Здесь я хочу обратить внимание на то, что здесь мы получаем объект. Объект будет иметь поля value и text (их можно определить и по-другому), и содержать значения, соответственно, 0 и «Выберите категорию».
==== CODE ====
// Получаем выпадающий список
$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 */
);
====/ CODE ====
Ну а здесь мы остановимся поподробнее.
Первый парамерт — см. выше.
Второй параметр ($categories) — это обязательно должен быть массив объектов, либо массив ассоциативных массивов. В случае массива объектов каждый объект должен иметь поля value и text, а в случае массива ассоциативных массивов — каждый из последних должен содержать ключи value и text (только в нашем случае, см. пятый и шестой параметры), которые будут содержать значение 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.
Ну и живой пример, в нём я намеренно сделаю названия полей отличными от приведённых в примере выше, а так же проделаю другие шалости.
==== CODE ====
// Получаем объект базы данных
$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();
// Создаём первый элемент выпадающего списка (Выберите категорию)
// Обратите внимание, что мы указываем в параметрах названия полей будущего объекта, 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 */
);
====/ CODE ====