Задачу по полю полностью, для тех кто не хочет выискивать это в другой теме. А вообще есть куча статей по созданию типа поля.
ок. хотя, там особо ничего выискивать не надо - последние 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
в моем случае, это да/нет