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

denism300

  • Захожу иногда
  • 209
  • 5 / 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

  • Живу я здесь
  • 3370
  • 168 / 4
Re: Переопределение поля типа list
« Ответ #1 : 11.10.2016, 20:10:14 »
Задачу по полю полностью, для тех кто не хочет выискивать это в другой теме. А вообще есть куча статей по созданию типа поля.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: Переопределение поля типа list
« Ответ #2 : 11.10.2016, 20: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

  • Живу я здесь
  • 3370
  • 168 / 4
Re: Переопределение поля типа list
« Ответ #3 : 11.10.2016, 20: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 тип. Он вполне гибкий
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Re: Переопределение поля типа list
« Ответ #4 : 11.10.2016, 20: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

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

AlekVolsk

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

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Re: Переопределение поля типа list
« Ответ #7 : 11.10.2016, 23:49:36 »
ТС хотел знать, как писать свои поля - он получил ответ, все остальное - уже ответвление от темы и вариации
ТС не хотел знать, как писать поля в общих чертах. ТС хотел узнать, как сделать, по сути, клон поля list

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

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Re: Переопределение поля типа list
« Ответ #8 : 12.10.2016, 23:03:13 »
разобрался
« Последнее редактирование: 13.10.2016, 12:50:38 от denism300 »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Условия вывода блока div, поля пользователя?

Автор warlocksp

Ответов: 28
Просмотров: 555
Последний ответ 10.12.2020, 14:05:36
от gartes
Переопределение getItems()

Автор denism300

Ответов: 6
Просмотров: 1604
Последний ответ 06.12.2016, 14:37:32
от denism300
Друзья почему поля формы приходят пустыми

Автор maxpolsky

Ответов: 2
Просмотров: 1151
Последний ответ 28.11.2015, 19:50:18
от passer
Переопределение системного layout

Автор AlekVolsk

Ответов: 1
Просмотров: 820
Последний ответ 22.06.2015, 10:36:00
от AlekVolsk