Joomla! Україна

Блоги — цікаві статті та записи про Joomla, програмування, верстку та інше.
  • Версія Joomla! 5.2.2 від 26.11.2024
  • 60 записи в блогах
  • 791 новини та статті
     

Додаємо підтримку множинного вибору в JElementList для Joomla 1.5

27.11.2011, 11:30  |  Прочитано: 8704 раз  |  Для розробників  |  Автор: smart

(0 голоси)

При розробці модулів періодично потрібно параметр, який дозволяє обрати зі списку одразу декілька значень. В 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.

Написати коментар