Додаємо підтримку множинного вибору в JElementList для Joomla 1.5
27.11.2011, 11:30 | Прочитано: 9514 раз | Для розробників | Автор: smart
При розробці модулів періодично потрібно параметр, який дозволяє обрати зі списку одразу декілька значень. В Joomla 1.7 з цим ніяких проблем немає, тип поля форми JFormFieldList, використовуваний для списків, підтримує множинний вибір, а ось в Joomla 1.5, в JElementList, цього немає. Однак це можна виправити.
Для початку невеликий відступ з приводу типів полів в Joomla 1.5 (як це все працює в Joomla 1.7 розповім в одній з наступних статей), звідки вони беруться і як вони працюють.
Всі стандартні типи полів в Joomla 1.5 успадковані від JElement та їх реалізації знаходяться в директорії /libraries/joomla/html/parameter/element/. Коли Joomla, при розборі параметрів (модуля або компонента) знаходить елемент param, вона зчитує значення атрибута type і шукає у вказаній директорії файл з класом, який реалізує цей елемент.
Для того, щоб забезпечити підтримку користувацьких типів параметрів у елемента params існує атрибут addpath, за допомогою якого можна вказати шлях до реалізацій користувацьких типів параметрів. Наприклад, у стандартного компонента com_content є 2 типи параметрів author і article, і для того, щоб вони працювали, в XML-файлі опису форми параметрів статті (/administrator/components/com_content/models/article.xml) використовується addpath:
<params addpath="/administrator/components/com_content/elements">
Так от, якщо ми для елемента params задаємо атрибут addpath, то Joomla 1.5 додає цей шлях в самий верх списку шляхів, де буде шукатися тип параметра (в цьому можна легко переконатися вивчивши код методу addElementPath класу JParameter).
Ось в цій особливості і криється основна хитрість, яку я хочу запропонувати. Ми створюємо альтернативну реалізацію типу параметра list, додаємо його до нашого модулю (або компоненту) і прописуємо шлях до папки з нашим елементом. Після цього, вже в XML-файлі опису параметрів (або XML-маніфеста модуля або компонента) ми можемо використовувати тип параметра list з підтримкою множинного вибору.
Створення альтернативної реалізації JElementList
Створюємо файл list.php такого змісту:
<?php
defined('JPATH_BASE') or die();
class JElementList extends JElement
{
var $_name = 'List';
function fetchElement($name, $value, &$node, $control_name)
{
$ctrl = $control_name . '[' . $name . ']';
$attribs = '';
if ($v = $node->attributes('class')) {
$attribs .= ' class="'.$v.'"';
} else {
$attribs .= ' class="inputbox"';
}
if ($v = $node->attributes('size')) {
$attribs .= ' size="'.$v.'"';
}
if ($m = $node->attributes('multiple')) {
$attribs .= ' multiple="multiple"';
$ctrl .= '[]';
}
$options = array ();
foreach ($node->children() as $option)
{
$val = $option->attributes('value');
$text = $option->data();
$options[] = JHTML::_('select.option', $val, JText::_($text));
}
return JHTML::_('select.genericlist', $options, $ctrl, trim($attribs), 'value', 'text', $value, $control_name.$name);
}
}
?>
Як бачите, ми додали підтримку 2-х додаткових атрибутів: size (для зазначення кількості видимих елементів у списку) і multiple (для підтримки множинного вибору). Тепер, в параметрах нашого модуля (або компонента) для Joomla 1.5 ми можемо використовувати елемент list так само, як в Joomla 1.7:
<param
name="fields"
type="list"
size="5"
multiple="true"
default=""
label="Select Fields"
description="">
<option value="title">Title</option>
<option value="author">Author</option>
<option value="date">Date</option>
</param>
Однак, щоб наші додаткові атрибути працювали, необхідно не забути прописати атрибут addpath у елемента params, вказавши як значення шлях до директорії з нашою реалізацією типу параметрів JElementList.