К содержанию

Добавление и удаление товаров из групп ресурсов.

Доброго времени. После приобретения компонента msDiscount, обнаружил, что нет возможности добавлять целые категории в акции. msDiscount позволяет добавлять в акции группы ресурсов. В итоге набросал плагин для добавления товаров в группы ресурсов при сохранении/публикации.

<?php
if ($modx->event->name != "OnDocFormSave" || $resource->get('template') != 7) {return;}
$category = $modx->getObject('modResource',$resource->get('parent'));
$catGroup = $modx->getObject('modResource',$category->get('parent'));
// у группы ресурсов будет такое же имя как и у родителя товара (pagetitle)
$name = $category->get('pagetitle').'-'.$catGroup->get('pagetitle'); 
// проверяем, сущетвует ли группа ресурсов с таким именем, если нет, то создаем ее
$group = $modx->getObject('modResourceGroup', array('name' => $name));
if (empty($group)) {
	$group = $modx->newObject('modResourceGroup', array('name' => $name));
	$group->save();
}
// записываем в группу элемент-ресурс.
if (!$resource->isMember($group->get('id'))) {
    $resource->joinGroup($group->get('id'));
}
return;
Имя группы ресурсов выглядит так: [имя родителя] — [имя родителя-родителя].

Это работает. Но нужно еще сделать обратное — удалять из группы ресурсов товар при отключении или удалении. Не могу победить, пока это не работает:

<?php
if ($resource->get('template') != 7) return;
$modx->log(1, print_r( 'OnDocUnPublished', 1 ));
$msDiscount = $modx->getService('msDiscount');
$groups = $msDiscount->getProductGroups($resource->get('id'));
if($groups) {
    foreach (array_keys($groups) as $group) {
        if ($resource->isMember($group) ) {
            $resource->leaveGroup($group);
        }
    } 
} $resource->save();
return;
Подскажите где ошибка? И правильно ли выбрано событие: OnDocUnPublished?
Станислав
Станислав
21 октября 2015, 10:36
modx.pro
4 202
Реклама

Комментарии: 7

Володя
Володя Эксперт
21 октября 2015, 14:43
событие хз… хозяин барин. А вот проверить в каком виде отдаются группы в msDiscount нужно было
и сохранять надо конечно ресурс.

$groups = $msDiscount->getProductGroups($resource->get('id'));
foreach (array_keys($groups) as $group ) {
     if ($resource->isMember($group) ) {
        $resource->leaveGroup($group);
      }
}
$resource->save();
    rrrro
    rrrro Старожил
    21 октября 2015, 15:48
    А разве Василий не добавил там добавление товаров целыми категориями? Вот тут — modx.pro/components/5784-msdiscount-1-1-ms2-1-11-one-time-discount-coupons/ у него написано «скидкам можно назначать категории товаров, а не только сами товары».
      Василий Наумкин
      Василий Наумкин Администратор
      21 октября 2015, 15:57
      Верно.

      Но категорию тоже нужно добавить в группу ресурсов.
        Станислав
        Станислав Старожил
        21 октября 2015, 19:27
        То есть создаем группу ресурсов, отправляем туда ресурс-категорию, и при добавлении в акцию группы ресурсов, под нее попадают все товары категории? Если это так, то круто.
          Василий Наумкин
          Василий Наумкин Администратор
          21 октября 2015, 22:16
          Да, так и должно быть — проверяйте.
      Станислав
      Станислав Старожил
      17 января 2016, 21:57
      Случай вернул меня обратно к этому плагину. Захотелось довести его до ума. Повесил его на событие «OnDocFormDelete». По идее товар должен удаляться из группы ресурсов, в которую он попал при создании.
      Однако, после «удаления» товара minishop, ничего не происходит.
      В логах записывается такая строчка:
      (ERROR @ /assets/components/minishop2/connector.php) OnDocFormDelete
      Можно ли ее считать ошибкой?

      Те ли события я использую для плагина? Какие имена событий привязаны к таким операциям с ресурсами minishop2 как: отключить/включить, удалить/восстановить? Да, и как удалить товар окончательно из БД через админку? Он по прежнему висит в таблице товаров.

      Код плагина:
      <?php
      if ($resource->get('template') != 7) return;
      $modx->log(1, print_r( 'OnDocUnPublished', 1 ));
      $msDiscount = $modx->getService('msDiscount');
      $groups = $msDiscount->getProductGroups($resource->get('id'));
      if($groups) {
          foreach (array_keys($groups) as $group) {
              if ($resource->isMember($group) ) {
                  $resource->leaveGroup($group);
              }
          } 
      } $resource->save();
      return;
        Станислав
        Станислав Старожил
        24 января 2016, 13:30
        Вопрос решен. Неправильно соблюден синтаксис в условии:
        if ($resource->isMember($group) )

        Метод isMember() принимает только имя группы в кач-ве параметра: rtfm.modx.com/revolution/2.x/developing-in-modx/other-development-resources/class-reference/

        Так правильно:
        $selGroup = $modx->getObject('modResourceGroup',array('id'=>$group));
        if ($resource->isMember($selGroup->get('name') ) ) {
            ...
        }
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          7