Додаємо підтримку множинного вибору в JElementList для Joomla 1.5
27.11.2011, 11:30 | Прочитано: 8704 раз | Для розробників | Автор: 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
.