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

Доброго времени. После приобретения компонента 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
3 652
0

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

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

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

      Но категорию тоже нужно добавить в группу ресурсов.
        Станислав
        21 октября 2015, 19:27
        1
        0
        То есть создаем группу ресурсов, отправляем туда ресурс-категорию, и при добавлении в акцию группы ресурсов, под нее попадают все товары категории? Если это так, то круто.
    Станислав
    17 января 2016, 21:57
    0
    Случай вернул меня обратно к этому плагину. Захотелось довести его до ума. Повесил его на событие «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
      0
      Вопрос решен. Неправильно соблюден синтаксис в условии:
      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