Форум русской поддержки Joomla!® CMS
09.12.2016, 19:25:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

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

 (Прочитано 113 раз)
0 Пользователей и 1 Гость смотрят эту тему.
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« : 11.10.2016, 18:32:43 »

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

Цитировать
1. Раз все работает, значит правильно написано. А вот подход неправильный: вы хакнули и контроллер, и модель. Лучше создайте свой тип поля.
не могу понять, как его создать.
создал файл /administrator/components/com_vmgtx/models/fields/changestate.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
Живу я здесь
******

Репутация: +36/-3
Offline Offline

Пол: Мужской
Сообщений: 841


Skype: septdir


« Ответ #1 : 11.10.2016, 21:10:14 »

Задачу по полю полностью, для тех кто не хочет выискивать это в другой теме. А вообще есть куча статей по созданию типа поля.
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #2 : 11.10.2016, 21:18:21 »

Пример поля с получением данных из базы:

Код
<?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
Живу я здесь
******

Репутация: +36/-3
Offline Offline

Пол: Мужской
Сообщений: 841


Skype: septdir


« Ответ #3 : 11.10.2016, 21:20:55 »

Пример поля с получением данных из базы:

Код
<?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 тип. Он вполне гибкий
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #4 : 11.10.2016, 21:24:23 »

Задачу по полю полностью, для тех кто не хочет выискивать это в другой теме. А вообще есть куча статей по созданию типа поля.
ок. хотя, там особо ничего выискивать не надо - последние 3 сообщения.
суть: у объекта есть несколько свойств, имеющих значение да/нет. необходимо в представлении списка сделать возможность ими управлять по типу свойства "статус" (опубликовано/не опубликовано).
я сделал следующим образом:
1. создал и подключил файл /helpers/html/filters.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 echo JHTML::_('vmgtxhtml.filters.shipped', $item->is_shipping, $i, 'products.', $canChange); ?>


3. в файл /controllers/products.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 добавил функцию:
Код
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
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #5 : 11.10.2016, 21:26:37 »

Если без излишеств то проще юзать sql тип. Он вполне гибкий
ТС хотел знать, как писать свои поля - он получил ответ, все остальное - уже ответвление от темы и вариации
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6460



« Ответ #6 : 11.10.2016, 21:28:15 »

AlekVolsk мне не надо получать данные из БД. Необходимо получить свойства поля, описанные в файле administrator/com_name/models/forms/name.xml
в моем случае, это да/нет
легко: вам поможет именованный массив $this->element, не забывайте про isset($this->element[attrname])
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #7 : 12.10.2016, 00:49:36 »

ТС хотел знать, как писать свои поля - он получил ответ, все остальное - уже ответвление от темы и вариации
ТС не хотел знать, как писать поля в общих чертах. ТС хотел узнать, как сделать, по сути, клон поля list

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

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #8 : 13.10.2016, 00:03:13 »

разобрался
« Последнее редактирование: 13.10.2016, 13:50:38 от denism300 » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet