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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Мой первый компонент
« Ответ #90 : 13.08.2016, 18:11:10 »
С JDatabaseQuery-объектом - никак. Используйте строковый запрос:
Код: php-brief
$db->setQuery('DELETE t1 FROM table1 as t1 ... blahblahblah')->execute();

P.S. Не понимаю, что мешало добавить еще 1 аргумент в функцию delete()?
Спойлер
[свернуть]
« Последнее редактирование: 13.08.2016, 18:38:45 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Re: Мой первый компонент
« Ответ #91 : 25.08.2016, 00:29:24 »
возникло небольшое непонимание принципа работы модели MVC
мне нужно в форме редактирования записи моего компонента вывести имя товара, взятое из таблицы VirtueMart.
я думаю это сделать так:
в файле модели product.php написать функцию, которой будет передаваться id, и которая на основе этого id будет брать запросом имя,
а в файле редактирования записи edit.php вызывать эту функцию, передавая ей id
это будет работать? или нужно по другому?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Мой первый компонент
« Ответ #92 : 25.08.2016, 09:45:02 »
В файле модели есть метод getItem который должен получать данные вашей формы, в нем сделать в нем запрос и получить тайтл, присоединить к item
$item->product_title = $this->getDbo()->setQuery($query)->loadResult();
В шаблоне вывести echo $this->item->product_title;
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Re: Мой первый компонент
« Ответ #93 : 26.08.2016, 00:34:24 »
так, с этим разобрался. но возникла проблемка при попытке получить 2 параметра.
я объединил два запроса через union и возвращаю ObjectList
Код: php
$db 	= 	JFactory::getDBO();
$query = $db->getQuery(true);
$query -> select($db->quoteName('pl.product_name'));
$query -> from($db->quoteName('#__virtuemart_products_' . VmConfig::$vmlang, 'pl'));
$query -> where($db->quoteName('pl.virtuemart_product_id'). ' = ' . $item->virtuemart_product_id);
$q2 = $db->getQuery(true);
$q2 -> select($db->quoteName('m.file_url'));
$q2 -> from($db->quoteName('#__virtuemart_medias', 'm'));
$q2 -> join('LEFT', $db->quoteName('#__virtuemart_product_medias', 'pm'). ' ON (' . $db->quoteName('m.virtuemart_media_id'). ' = ' . $db->quoteName('pm.virtuemart_media_id'). ')');
$q2 -> where($db->quoteName('pm.virtuemart_product_id'). ' = ' . $item->virtuemart_product_id);
$query -> union($q2);
$item->productParams = $this->getDbo()->setQuery($query)->loadObjectList();
по идее, ObjectList должен вернуть объект, где поля совпадают с названиями столбцов, т.е.
product_name => название_товара
file_url => путь_к_изображению

однако, он возвращает в таком виде:
product_name => название_товара
product_name => путь_к_изображению
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Re: Мой первый компонент
« Ответ #94 : 26.08.2016, 00:58:03 »
$this->getDbo()->setQuery($query)->loadObjectList(); возвращает массив объектов!
что бы получить одну запись в объект используйте $this->getDbo()->setQuery($query)->loadObject();
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Re: Мой первый компонент
« Ответ #95 : 28.09.2016, 22:35:15 »
возник такой вопрос:
если у элемента только один статус (опубликовано/нет), то в представлении списка он переключается с помощью строки
Код: php
<?php echo JHTML::_('jgrid.published', $item->state, $i, 'products.', $canChange); ?>
а как реализовать несколько статусов?
к примеру, у меня подразумеваются такие статусы, как наличие доставки и самовывоза.
я сделал такой вариант, но работает только изменение state
Код: php
<td>
<?php echo JHTML::_('jgrid.published', $item->state, $i, 'products.', $canChange); ?>
</td>
<td>
<?php echo JHTML::_('jgrid.published', $item->is_shipping, $i, 'products.', $canChange); ?>
</td>
<td>
<?php echo JHTML::_('jgrid.published',$item->use_pickup, $i, 'products.', $canChange); ?>
</td>
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Мой первый компонент
« Ответ #96 : 28.09.2016, 23:00:07 »
 ;D Все еще верите в волшебство, да? Чудес не бывает, конструкция JHTML::_('jgrid.published') всего лишь вызывает функцию JHtmlGrid::published(), выводящую ссылку, при нажатии на которую исполняется одна из 2 команд: publish или unpublish.
Функция находится в файле /libraries/cms/html/grid.php, почитайте и делайте по аналогии.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Re: Мой первый компонент
« Ответ #97 : 29.09.2016, 23:40:42 »
robert, в принципе, разобрался. Даже работает :)
Такой вопрос: правильно ли я сделал, или же можно было упростить?
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::_('jgrid.published', $item->is_shipping, $i, 'products.', $canChange); ?>
заменил на:
Код: 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;
}

это все работает. но есть 2 вопроса:
1. правильно ли это все написано?
2. получается, что для каждого изменяемого состояния надо повторять все эти конструкции изменяя лишь параметры и названия функций?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Мой первый компонент
« Ответ #98 : 30.09.2016, 09:36:29 »
1. правильно ли это все написано?
2. получается, что для каждого изменяемого состояния надо повторять все эти конструкции изменяя лишь параметры и названия функций?
1. Раз все работает, значит правильно написано. А вот подход неправильный: вы хакнули и контроллер, и модель. Лучше создайте свой тип поля.
2. Если единственное различие в коде - названия метода, то не нужно: сделайте их аргументами или в случае со своим типом поля - атрибутами.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Taatshi

  • Глобальный модератор
  • 5259
  • 481 / 2
  • Верстаем и кодим. Обращайтесь ;)
Re: Мой первый компонент
« Ответ #99 : 30.09.2016, 09:49:10 »
denism300, Ваша тема нарушает правила форума.


Цитировать
Условия создания новых тем и ответов на существующие темы

5. При создании новой темы руководствуйтесь правилом: один вопрос — одна тема. Если есть несколько вопросов — создайте соответствующее количество тем.

Будьте добры на каждый вопрос создавать новую тему. Название каждой темы должно быть осмысленным и отображать суть возникшей у Вас проблемы.
« Последнее редактирование: 30.09.2016, 09:52:34 от Taatshi »
ВЕРСТКА, САЙТЫ ПОД КЛЮЧ, УДАЛЕНИЕ ВИРУСОВ, МИГРАЦИЯ НА JOOMLA 3, ОБНОВЛЕНИЕ  |  ОТЗЫВЫ 
Связь: telegram - Taatshi, почта - Taatshi на яндексе, Skype - Taatshi
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Только первый абзац

Автор warlocksp

Ответов: 0
Просмотров: 529
Последний ответ 28.11.2017, 15:24:15
от warlocksp