Встала задача один и тот же товар отображать в разных родителях. Самое простое решение — задавать родителя через тв-параметр. Но оно не годилось, ибо в шаблоне каталога есть фильтр который смотрит вниз по каталогу. Да и просто разработчику Modx хотелось бы чтобы логика иерархической структуры сохранялась.
В итоге написал плагин, который использует один ТВ параметр для копирования документа и последующей синхронизации. Т.е. чтобы обновляя цену в одной карточке, она менялось и во второй.
У решения есть два косяка:
Не работает для нового товара.
Синхронизация пока идет по названию. Т.е. можно менять все, кроме названия.
Над этими двумя пунктами еще поработаю но не сейчас.
So…
Порядок действий:
Создаем ТВшку для поля, в котором будут у нас родители для документов. Можно к ними прилепить плагин PickDocsInTree от Андрея Чирко, у которого сегодня, кстати, день рождения) Запоминаем id онной тв-шки
Создаем плагин. Ставим галочку на событие «OnDocFormSave» и вставляем код:
//<?
$tv=23; // id тв-параметра с родителями
$ttv= $modx->getFullTableName('site_tmplvar_contentvalues');
$tc = $modx->getFullTableName('site_content');
if ($modx->Event->name=="OnDocFormSave") {
if ($_POST[id]!='')
{
$adds = array();
$docs = $_POST['tv'.$tv];
if ($docs)
{
$da = explode(',',$docs);
if (!in_array($_POST[parent], $da))
{
$da[]=$_POST[parent];
$val = array('value'=>implode(',',$da));
$_POST['tv'.$tv]=implode(',',$da);
$modx->db->update($val,$ttv,' `contentid`='.$_POST[id].' and `tmplvarid`='.$tv);
}
$ids = explode(',',$_POST['tv'.$tv]);
foreach ($ids as $id)
{
$sql = 'Select `id` from '.$tc.' where `parent`='.$id.' and `pagetitle`="'.$_POST[pagetitle].'"';
$yes = $modx->db->getValue($sql);
if ($yes)
{
//Обновление записи
$sql = 'Select * from '.$tc.' where `id`='.$_POST[id];
$doc_arr = array();
$result = $modx->db->query($sql);
while($row = $modx->db->getRow($result)) $doc_arr = $row;
unset($doc_arr[id]);
$doc_arr[parent]=$id;
$modx->db->update($doc_arr,$tc,'id='.$yes);
$sql = 'Select `tmplvarid`,`value` from '.$ttv.' where `contentid`='.$_POST[id];
$result = $modx->db->query($sql);
while($row = $modx->db->getRow($result))
{
$val = array('value'=>$row[value]);
$modx->db->update($val,$ttv,' `contentid`='.$yes.' and `tmplvarid`='.$row[tmplvarid]);
}
}
else
{
//Добавляем запись
$sql = 'Select * from '.$tc.' where `id`='.$_POST[id];
$doc_arr = array();
$result = $modx->db->query($sql);
while($row = $modx->db->getRow($result)) $doc_arr = $row;
unset($doc_arr[id]);
$doc_arr[parent]=$id;
$modx->db->insert($doc_arr,'modx_site_content');
$did = $modx->db->getInsertId();
//exit($did);
$adds[]=$did;
$sql = 'Select `tmplvarid`,`value` from '.$ttv.' where `contentid`='.$_POST[id];
$result = $modx->db->query($sql);
while($row = $modx->db->getRow($result))
{
$row[contentid]=$did;
$modx->db->insert($row,$ttv);
}
}
}
}
}
}
И все. Теперь при выборе дополнительных родителей документ будет автоматически копироваться, а при изменении данных в любом их документов — будет менятся везде)
Это решение половинчатое, есть над чем работать, но, ребят, не стесняйтесь выкладывать свои костыли. Выкладывайте свои решения и в конечном мы сможем сделать на движок лучше!)
P.S. Этот плагин был написан для одного из проектов компании vooa.ru
UPD: Была ошибка в 15-ой строчке, из-за чего сохранялось только со второго раза.