Обновление параметров родителей при редактировании дочерних ресурсов.
Набросал на коленке маленький сниппет для изменения родительских ТВ при редактировании аналогичных ТВ у дочерних.
СНИППЕТ ПОДХОДИТ ДЛЯ ЛЮБЫХ МНОЖЕСТВЕННЫХ ЗНАЧЕНИЙ ТИПА CHECKBOX!!
Смысл в том что например у вас есть товар — это каталог. А есть расцветки товара — дочерние к этому каталогу. Сделать нормальный фасетный поиск в таком случае задача не тривиальная.
Одним из способов — это при сохранении товара обновлять родителя, чтобы потом безболезненно его фильтровать.
Итак 3 элемента:
Сниппет param_update:
Основной плагин:
Модуль для обновления всех товаров на сайте
Всё слеплено на коленке. Но работает хорошо. Оформлять как-то красиво смысла не вижу. Такие решения допиливаются «под себя», но если кому-то пригодится — берите.
СНИППЕТ ПОДХОДИТ ДЛЯ ЛЮБЫХ МНОЖЕСТВЕННЫХ ЗНАЧЕНИЙ ТИПА 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 комментариев