[Решено] Проблема с созданием собственного типа поля

  • 2 Ответов
  • 124 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн batiskaf

Для собственного компонента создаю собстенное поле формы. На выходе должно получиться поле SELECT и один из OPTION должен иметь атрибут SELECTED.

Что я делаю:
1) создаю класс, расширяемый от JFormFieldList
2) переопределяю метод getOptions(), в нем получаю выборку из БД
3) там же проганяю выборку в цыкле чтоб сформировать нужный массив
4) при формировании массива добавляю для нужного элемента $options[$i]->selected = true, т.е. OPTION с этим элементом получит атрибут SELECTED
5) отрабатываю родительский функционал

В результате нужный мне OPTION поля SELECT получается без SELECTED. Почему-то $options[$i]->selected = true не дает нужный результат, хотя $options[$i]->disable = true добавляет атрибут DISABLED вполне нормально.

Код приложил ниже.
<?php 

defined
('_JEXEC') or die('Restricted access');

// подключаем функционал класса JFormFieldList
JFormHelper::loadFieldClass('list');

// JFormFieldSectionparent - клас поля sectionparent XML-формы. Этот класс должен наследовать JFormFieldList
class JFormFieldSectionparent extends JFormFieldList {

// объявляем название пользовательского типа поля
protected $type='sectionparent';

// getOptions() - метод род. класса должен возвращать массив для элементов <option> для поля <select>
protected function getOptions() {

// массив для элементов <option>
$options = array();

// получаем объект подключения к БД
$db JFactory::getDbo(); 

// формируем запрос
$query $db->getQuery(true); 
$query->select('s.id as value, s.title AS text, s.level');
$query->from('#__zagotovka_sections AS s');
$query->order('lft ASC');

// назначаем запрос в качестве текущего
$db->setQuery($query);

// пробуем выполнить запрос
try 
{
// выполняем запрос. Получаем массив объектов с данными
$options $db->loadObjectList();
}
// если  не удалось выполнить запрос
catch(RuntimeException $e
{
// выводим ошибку ($e->getMessage())
JFactory::getApplication()->enqueueMessage($e->getMessage(),'error');
return false;
}

// получаем id текущего редактируемого элемента
$app  JFactory::getApplication();
$jinput  $app->input;
$currentId  $jinput->get('id'0);

/*
// если создается новый элемент, и в фильтре был выбран родитель
if ($currentId == 0)
{
$filterParent = $session->get('registry.data.com_zagotovka.elements.filter.catid', NULL);
}
*/

// формируем массив с элементами для <option> 
if($options
{
for($i 0;$i count($options);$i++) 
{
// какое-то условие, при котором элемент формы должен получить атрибут SELECTED
if ($i == 7)
{
$options[$i]->selected true;
}

// обозначаем главного родителя
if ($options[$i]->level == 0)
{
$options[$i]->text JText::_('JGLOBAL_ROOT_PARENT');
}

// отменяем возможность выбрать родителем самого себя
if ($options[$i]->value == $currentId)
{
$options[$i]->disable true
}

// добавляем отступы для отображения в виде дерева
$options[$i]->text str_repeat('- '$options[$i]->level). $options[$i]->text;

}
}

return array_merge(parent::getOptions(), $options);
}
}

« Последнее редактирование: 04.05.2017, 19:38:49 от batiskaf »

*

Оффлайн fsv

В ваш код не вникал.
Пример:
Спойлер
[свернуть]
, где $formData['district_id'] - то, что будет selected
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

Оффлайн batiskaf

Спасибо. Помогло.