[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 */
                      );