Переопределение поля типа list

  • 8 Ответов
  • 305 Просмотров

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

*

denism300

  • Осваиваюсь на форуме
  • ***
  • 134
  • 0
Данная тема является ответвлением этой по просьбе модератора создавать по каждому вопросу отдельную тему

Цитировать
1. Раз все работает, значит правильно написано. А вот подход неправильный: вы хакнули и контроллер, и модель. Лучше создайте свой тип поля.
не могу понять, как его создать.
создал файл /administrator/components/com_vmgtx/models/fields/changestate.php с содержимым:
Код: php
<?php defined('_JEXEC') or die('Restricted access');
 
// Подключаем тип поля list.
JFormHelper::loadFieldClass('list');

class JFormFieldChangeState extends JFormFieldList {

/**
* Тип поля.
* @var string
*/
protected $type = 'ChangeState';

public function getOptions() {

}

}
не знаю, как написать функцию getOptions(), по идее, у меня тоже самое поле типа list без каких-либо расширенных функций. в других компонентах функцию getOptions() переопределяют для выборки из БД, примера, где выбор значений происходит из заранее заданных опций в макете я не нашел.

*

Septdir

  • Практически профи
  • *******
  • 2144
  • 108
  • JoomlaZen
Re: Переопределение поля типа list
« Ответ #1 : 11.10.2016, 22:10:14 »
Задачу по полю полностью, для тех кто не хочет выискивать это в другой теме. А вообще есть куча статей по созданию типа поля.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты | JoomlaZen

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Переопределение поля типа list
« Ответ #2 : 11.10.2016, 22:18:21 »
Пример поля с получением данных из базы:

Код: php
<?php defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('list');

class JFormFieldClients extends JFormFieldList
{

public $type = 'clients';

protected static $options = array();

protected function getOptions()
{
$hash = md5($this->element);

if (!isset(static::$options[$hash])) {
static::$options[$hash] = parent::getOptions();
$options = array();
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('id AS value, name AS text')
->from('#__users')
->order('name');
$db->setQuery($query);
if ($options = $db->loadObjectList())
static::$options[$hash] = array_merge(static::$options[$hash], $options);
}
return static::$options[$hash];
}

}

Краткое разъяснение: в итоге вы возвращаете массив из двух полей: value (атрибут value для select->option) и text (отображаемое пользователю значение)
в конце идет объединение выборки данных из басы с теми параметрами, которые (если) указаны в xml-описании формы

Выборка из базы может быть сколь угодно сложной, но на выходе всегда должно быть всего лишь 2 конкретно именованных поля, строго

*

Septdir

  • Практически профи
  • *******
  • 2144
  • 108
  • JoomlaZen
Re: Переопределение поля типа list
« Ответ #3 : 11.10.2016, 22:20:55 »
Пример поля с получением данных из базы:

Код: php
<?php defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('list');

class JFormFieldClients extends JFormFieldList
{

public $type = 'clients';

protected static $options = array();

protected function getOptions()
{
$hash = md5($this->element);

if (!isset(static::$options[$hash])) {
static::$options[$hash] = parent::getOptions();
$options = array();
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('id AS value, name AS text')
->from('#__users')
->order('name');
$db->setQuery($query);
if ($options = $db->loadObjectList())
static::$options[$hash] = array_merge(static::$options[$hash], $options);
}
return static::$options[$hash];
}

}

Краткое разъяснение: в итоге вы возвращаете массив из двух полей: value (атрибут value для select->option) и text (отображаемое пользователю значение)
в конце идет объединение выборки данных из басы с теми параметрами, которые (если) указаны в xml-описании формы

Выборка из базы может быть сколь угодно сложной, но на выходе всегда должно быть всего лишь 2 конкретно именованных поля, строго
Если без излишеств то проще юзать sql тип. Он вполне гибкий
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты | JoomlaZen

*

denism300

  • Осваиваюсь на форуме
  • ***
  • 134
  • 0
Re: Переопределение поля типа list
« Ответ #4 : 11.10.2016, 22:24:23 »
Задачу по полю полностью, для тех кто не хочет выискивать это в другой теме. А вообще есть куча статей по созданию типа поля.
ок. хотя, там особо ничего выискивать не надо - последние 3 сообщения.
суть: у объекта есть несколько свойств, имеющих значение да/нет. необходимо в представлении списка сделать возможность ими управлять по типу свойства "статус" (опубликовано/не опубликовано).
я сделал следующим образом:
1. создал и подключил файл /helpers/html/filters.php с содержимым:
Код: php
abstract class VMGTXHtmlFilters {
/**
* Метод для получения списка опций состояния.
* @return  array  $options  Массив опций.
*/
public static function shipped($value, $i, $prefix = '') {
JHtml::_('bootstrap.tooltip');
if (is_object($value)) {
$value = $value->is_shipping;
}
$task = $value ? 'unshipped' : 'shipped';
$alt = $value ? JText::_('JPUBLISHED') : JText::_('JUNPUBLISHED');
$action = $value ? JText::_('JLIB_HTML_UNPUBLISH_ITEM') : JText::_('JLIB_HTML_PUBLISH_ITEM');
$icon = $value ? 'publish' : 'unpublish';
 
return '<a href="#" class="btn btn-micro hasTooltip' . ($value == 1 ? ' active' : ''). '" onclick="return listItemTask(\'cb' . $i . '\',\'' . $prefix . $task . '\')" title="' . $action . '">
<span class="icon-' . $icon . '"></span>
</a>';
}

2. в файле /views/products/html/default_body.php
Код: php
<?php echo JHTML::_('vmgtxhtml.filters.shipped', $item->is_shipping, $i, 'products.', $canChange); ?>


3. в файл /controllers/products.php добавил функцию:
Код: php
public function shipped() {
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
$user   = JFactory::getUser();
$ids    = $this->input->get('cid', array(), 'array');
$values = array('shipped' => 1, 'unshipped' => 0);
$task   = $this->getTask();
$value  = JArrayHelper::getValue($values, $task, 0, 'int');
if (empty($ids)) {
JError::raiseWarning(500, JText::_('JERROR_NO_ITEMS_SELECTED'));
}
else {
$model = $this->getModel();
if (!$model->shipped($ids, $value)) {
JError::raiseWarning(500, $model->getError());
}
if ($value == 1) {
$message = JText::plural('COM_VMGTX_N_ITEMS_SHIPPED', count($ids));
}
else {
$message = JText::plural('COM_VMGTX_N_ITEMS_UNSHIPPED', count($ids));
}
}
$this->setRedirect(JRoute::_('index.php?option=com_vmgtx&view=products', false), $message);
}

4. в файл /models/product.php добавил функцию:
Код: php
public function shipped($pks, $value = 0) {
$pks = (array) $pks;
JArrayHelper::toInteger($pks);
if (empty($pks)) {
$this->setError(JText::_('COM_VMGTX_NO_ITEM_SELECTED'));
return false;
}
$table = $this->getTable('Product', 'VMGTXTable');
try {
$db = $this->getDbo();
$query = $db -> getQuery(true);
$query -> update($db->quoteName('#__vmgtx'));
$query -> set('is_shipping = ' . (int) $value);
$query -> where('id IN (' . implode(',', $pks). ')');
$db -> setQuery($query);
$db -> execute();
}
catch (Exception $e) {
$this->setError($e->getMessage());
return false;
}
$this->cleanCache();
return true;
}

товарищ robert посоветовал сделать так:
Цитировать
1. Лучше создайте свой тип поля.
2. Если единственное различие в коде - названия метода, то не нужно: сделайте их аргументами или в случае со своим типом поля - атрибутами.

Собственно, возник вопрос по переопределению типа list в своем типе.

Насчет кучи статей согласен, но вот на тему как создать свой тип, который будет точным клоном существующего, но с другим названием, я не нашел.

AlekVolsk мне не надо получать данные из БД. Необходимо получить свойства поля, описанные в файле administrator/com_name/models/forms/name.xml
в моем случае, это да/нет

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Переопределение поля типа list
« Ответ #5 : 11.10.2016, 22:26:37 »
Если без излишеств то проще юзать sql тип. Он вполне гибкий
ТС хотел знать, как писать свои поля - он получил ответ, все остальное - уже ответвление от темы и вариации

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Переопределение поля типа list
« Ответ #6 : 11.10.2016, 22:28:15 »
AlekVolsk мне не надо получать данные из БД. Необходимо получить свойства поля, описанные в файле administrator/com_name/models/forms/name.xml
в моем случае, это да/нет
легко: вам поможет именованный массив $this->element, не забывайте про isset($this->element[attrname])

*

denism300

  • Осваиваюсь на форуме
  • ***
  • 134
  • 0
Re: Переопределение поля типа list
« Ответ #7 : 12.10.2016, 01:49:36 »
ТС хотел знать, как писать свои поля - он получил ответ, все остальное - уже ответвление от темы и вариации
ТС не хотел знать, как писать поля в общих чертах. ТС хотел узнать, как сделать, по сути, клон поля list

легко: вам поможет именованный массив $this->element, не забывайте про isset($this->element[attrname])
мысль понял. буду пробовать.

*

denism300

  • Осваиваюсь на форуме
  • ***
  • 134
  • 0
Re: Переопределение поля типа list
« Ответ #8 : 13.10.2016, 01:03:13 »
разобрался
« Последнее редактирование: 13.10.2016, 14:50:38 от denism300 »