Здравствуйте, уважаемые читатели сайта shargaev-group.ru! При разработке расширений на Joomla, зачастую приходиться строить большие выпадающие списки. Например – список городов, телефонных баз и пр.
Стандартный тип поля list не позволяет динамически добавлять элементы option, все значения данного типа должны быть явно указаны в xml файле формы.
А что делать, если нужно добавить 1000 значений этому полю? Или эти значения хранятся в базе и по определенному условию нужно сделать выборку, проверку данных и показать пользователю?
Для частичной решения данной задачи в Joomla есть тип поля sql, который позволяет по определенным критериям сделать выборку из базы и полученные данные поместить в форму. Но, данный тип не дает той гибкости, которая бы потребовалась при работе с элементами списка.
Решить эту задачу можно двумя путями
- Написать собственный тип данных
- Расширить существующий тип (добавить функционал)
О втором способе ниже и пойдет речь.
Расширяем класс JFormFieldList
Для расширения функционала типа list создаем файл extendslist.php c кодом:
defined('_JEXEC') or die('@'); jimport('joomla.form.formfield'); jimport('joomla.form.helper'); JFormHelper::loadFieldClass('list'); class JFormFieldExtendslist extends JFormFieldList { protected $type = 'Extendslist'; public function setOption($value, $title) { if($value && $title) { $this->element->addChild('option', $title)->addAttribute('value', $value); return true; } return false; } }
Данный класс расширяет стандартный тип поля list, метод setOption позволяет добавлять значения option в объект JFormField.
Метод принимает два обязательных параметра: значение и имя.
Использование в коде
Созданный файл помещаем в папочку fields своего расширения.
Создаем поле и указываем ему наш тип Extendslist, в addfieldpath обязательно укажите путь до папки с ваши типом:
<fieldset name="basic" addfieldpath="путь до папки с типом/fields"> <field name="имя поля" type="extendslist(тип)" default="Значение по умолчанию (если надо)" label="Название поля" description="Описание поля"> <option value="">Значение по умолчанию (если надо)</option> </field> </fieldset>
При обработке формы в коде, получаем нужный элемент и добавляем в него данные:
$element = $form->getField('имя элемента'); foreach ($data as $d) { $element->Option(value, title); }
На этом все, берегите себя!
Спасибо, долго искал как добавить текст в option через addAttribute, оказывается это в addChild(‘option’, ‘Текст’).
Пожалуйста! Рад, что помог!