Управление свойствами ресурсов через родителя

Здравствуйте. Скажите пожалуйста, как можно изменить, допустим, шаблон у ресурса через его родителя?
Опишу подробнее, что имею ввиду:
У категории есть TV
Параметры вывод:
Список(множественный выбор)
Возможные значения:
@SELECT `pagetitle`, `id` FROM `[[+PREFIX]]site_content` WHERE `template` IN  (3) AND `parent` = "[[+id]]"
Это позволяет в его значения получить вложенные в эту категорию ресурсы

Теперь же у выбраных ресурсов должен изменятся шаблон с 3 на 4, допустим, и обратно, если ресурс удалить из списка, то он должен вернуться с шаблона 4 на шаблон 3.
Понимаю что это это необходимо реализовать через плагин, который будет делать это при сохранении родителя. Подскажите пожалуйста примерный код такого плагина для дальнейшего колупания, к сожалению знания не позволяют написать самому с нуля
Dolce
21 апреля 2018, 07:29
modx.pro
1
1 823
+1

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

Dolce
21 апреля 2018, 14:30
0
Получилось написать сниппет для теста, теперь буду делать плагин, вот код — навернякак кривой и избыточный, но знаний пока мало, может кто-нибудь сможет поправить:
<?php
$page_id = 1623; //id страницы категории
$workTv = 62; //id tv списка

//Все дети в категории
$docs = $modx->getCollection('modResource', array(
    'parent' => $page_id
));

// Если дети есть
if($docs){
  $arrAllchildren = []; //Массив с id детей в категории
  foreach($docs as $doc){
      $id = $doc->get('id'); //Получаем id ребенка
      array_push($arrAllchildren, $id); //добавляем id  в конец массива
  };
}else{
    return;
}

//Получаем объект  tv детей категории
$outStock = $modx->getObject('modTemplateVarResource', array(
      'tmplvarid' => $workTv,
      'contentid' => $page_id
));

// Если TV выбраны
if ($outStock) {

    $stringValue = $outStock->get('value'); //Получаем строку id выбраных в tv детей категории 
    $arr = explode("||", $stringValue); //Массив с id tv выбранных в категории

    $dif = array_diff($arrAllchildren, $arr); //сравниваем массивы и записываем отличающиеся id

    foreach($arr as $k){
            $res = $modx->getObject('modResource',$k);
            echo "($k)";
            $res->set('template', 21);
            $res->save();
         }

    foreach($dif as $k){
            $res = $modx->getObject('modResource',$k);
             echo "[$k]";
            $res->set('template', 3);
            $res->save();
         }

}else{
    return;
};
    Dolce
    21 апреля 2018, 15:37
    0
    Рабочий плагин, вроде проблем нет
    <?php
    switch($modx->event->name){
        case 'OnDocFormSave':
        $currency_resTpl = $resource->get('template'); //Шаблон текущего ресурса
        $cat_template = 2;//Шаблон категории
    
    
        // Если шаблоны совпадают
        if($currency_resTpl == $cat_template){
            $currency_id = $resource->get('id'); // получаем id текущего ресурса
            $listTv = 62; //id tv списка
            $activTpl = 21;//id активного шаблона, выбранного в TV
            $passivTpl = 3;//id пассивного шаблона, присваеваемого ресурсу, если он не выбран в tv у родителя
            //Все дети в категории
            $docs = $modx->getCollection('modResource', array(
                'parent' => $currency_id
            ));
            
            // Если дети есть
            if($docs){
              $arrAllchildren = []; //Массив с id детей в категории
              foreach($docs as $doc){
                  $id = $doc->get('id'); //Получаем id ребенка
                  array_push($arrAllchildren, $id); //добавляем id  в конец массива
              };
            }else{
              return;
            }
            
            
            
            //Получаем объект  tv детей категории
            $outStock = $modx->getObject('modTemplateVarResource', array(
                  'tmplvarid' => $listTv,
                  'contentid' => $currency_id
            ));
            
            // Если TV выбраны
            if ($outStock) {
            
                $stringValue = $outStock->get('value'); //Получаем строку id выбраных в tv детей категории 
                $arr = explode("||", $stringValue); //Массив с id tv выбранных в категории
            
                $dif = array_diff($arrAllchildren, $arr);
            
                foreach($arr as $k){
                        $res = $modx->getObject('modResource',$k);
                        $res->set('template', $activTpl);
                        $res->save();
                     }
            
                foreach($dif as $k){
                        $res = $modx->getObject('modResource',$k);
                        $res->set('template', $passivTpl);
                        $res->save();
                     }
            
            }else{ //Если невыбран ни один ребенок      
                foreach($arrAllchildren as $k){
                                $res = $modx->getObject('modResource',$k);
                                $res->set('template', $passivTpl);
                                $res->save();
                        }
            }
        }
    
    
           
    }
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2