Дубликаты документа в разных родителях. Evo

Встала задача один и тот же товар отображать в разных родителях. Самое простое решение — задавать родителя через тв-параметр. Но оно не годилось, ибо в шаблоне каталога есть фильтр который смотрит вниз по каталогу. Да и просто разработчику 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-ой строчке, из-за чего сохранялось только со второго раза.

comments powered by HyperComments