Обновление параметров родителей при редактировании дочерних ресурсов.

Набросал на коленке маленький сниппет для изменения родительских ТВ при редактировании аналогичных ТВ у дочерних.

СНИППЕТ ПОДХОДИТ ДЛЯ ЛЮБЫХ МНОЖЕСТВЕННЫХ ЗНАЧЕНИЙ ТИПА CHECKBOX!!

Смысл в том что например у вас есть товар — это каталог. А есть расцветки товара — дочерние к этому каталогу. Сделать нормальный фасетный поиск в таком случае задача не тривиальная.

Одним из способов — это при сохранении товара обновлять родителя, чтобы потом безболезненно его фильтровать.

Итак 3 элемента:
Сниппет param_update:

<?php

if ($parent > 0) {
	// Тут прописываем нужные ТВ и их ID
	$tvs = ['color'=> 10, 'tip_risunka'=>7];


	$tvnames = implode(',' , array_keys($tvs) );
	$out = [];

	$data = $modx->runSnippet('DocLister', [
		'parents' => $parent,
		'tvList' => $tvnames,
		'tvPrefix' => '',
		'api' => $tvnames
	]);

	$data = json_decode($data, 1);

	foreach($data as $doc){
		foreach($doc as $key => $val){
			if( isset($tvs[$key]) ){

				if(strpos($val, '||') !== false ){
					$val = explode('||', $val);
					foreach($val as $vv){
						$out[$tvs[$key]][] = $vv;
					}
					
				}else{
					$out[$tvs[$key]][] = $val;
				}
				
			}
		}
	}
	foreach($out as $key => $value){
		$out[$key] = implode('||', array_filter(array_unique($value)) );
		$table_name = $modx->getFullTableName( 'site_tmplvar_contentvalues' );  
		$q = 'INSERT INTO '.$table_name.' (`tmplvarid`, `contentid`, `value`) 
		VALUES ("'.$key.'","'.$parent.'","'.$out[$key].'") 
		ON DUPLICATE KEY UPDATE `tmplvarid`="'.$key.'", `contentid`="'.$parent.'", `value`="'.$out[$key].'"';
		$modx->db->query($qd);


	    //$modx->db->insert( $fields, $table_name);  
	}
	return $out;
}


Основной плагин:


global $modx;
// Тут указываем шаблон дочерних
$tmpl = 3;
// Тут указываем шаблон родителей
$tmpl_p = 2;
switch ($modx->event->name) {
    case 'OnDocFormSave': {
        
      	if(isset($_POST['parent'] ) && $_POST['template'] == $tmpl){
			$modx->runSnippet('param_update', ['parent' => $_POST['parent'] ]);
		}
		if(isset($_POST['parent'] ) && $_POST['template'] == $tmpl_p){
			$modx->runSnippet('param_update', ['parent' => $_POST['id'] ]);
		}

    }

}


Модуль для обновления всех товаров на сайте

<?
// Тут указываем шаблон дочерних
$tmpl = 3;
$data = $modx->runSnippet('DocLister', [
		'parents' => 0,
		'depth' => 10,
		'api' => 'id',
		'showParent' => '1',
		'addWhereList' => 'template = '.$tmpl
	]);

	$data = json_decode($data, 1);

	foreach($data as $id => $doc){
		$out[$id] = $modx->runSnippet('param_update', ['parent' => $id]);
		//$out[$id] = true;
	}

echo '<pre>';
var_dump($out);
echo '</pre>';
?>


Всё слеплено на коленке. Но работает хорошо. Оформлять как-то красиво смысла не вижу. Такие решения допиливаются «под себя», но если кому-то пригодится — берите.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.