А я бы рассмотрел еще вариант, предложенный AKots’ом. Имею ввиду написание плагина, который будет отслеживать событие "Добавление нового документа" и, при выполнении заданных условий, создавать точно такие же документы в нужных рубриках сайта. Мне кажется это более элегантное решение, чем использовать дополнительный модуль.
Да, вполне доходчиво, спасибоИз-за необходимости сортировки думаю остановиться на варианте с доп. таблицей.
// получаем информацию о разделе, в котором находится сохраняемый документ и о самом документе
$parent = $modx->getParent($id);
$currentDocInf=$modx->getDocument($id);
// получаем идентификаторы разделов, которым должен принадлежать документ
$result = "SELECT `value` FROM `".$modx->dbConfig['table_prefix']."site_tmplvar_contentvalues` WHERE `contentid` = $id AND `tmplvarid`=10";
$sql = $modx->db->query($result);
$myrow = mysql_fetch_row($sql);
// преобразуем последовательность идентификаторов из строки в массив
$selectedCategories=split("\|{2}", $myrow[0]);
// находим разделы, в которых есть ссылка на документ
$result = "SELECT `parent` FROM `".$modx->dbConfig['table_prefix']."site_content` WHERE `type` = 'reference' AND `content` = ".$id;
$sql = $modx->db->query($result);
while ($myrow = mysql_fetch_row($sql))
{
$alreadyHasLink[] = $myrow[0];
}
// цикл определяет, из каких разделов нужно удалить ссылки
foreach($alreadyHasLink as $AHS)
{
$i=0;
foreach($selectedCategories as $SC)
{
if($SC==$AHS) { $i=1; break; }
}
if($i==0) $categoriesToBeDeleted[]=$AHS;
}
// цикл определяет, в какие разделы нужно добавить ссылки
foreach($selectedCategories as $SC)
{
$i=0;
foreach($alreadyHasLink as $AHS)
{
if($AHS==$SC) { $i=1; break; }
}
if($i==0) $categoriesToBeAdded[]=$SC;
}
// начинаем добавлять, если есть что
if(count($categoriesToBeAdded!=0))
{
foreach($categoriesToBeAdded as $category)
{
$inf=$modx->getDocument($category);
// в разделе, где находится оригинал документа ничего не делаем
if($inf['id']!=$parent['id'])
{
// подсчитываем количество ссылок на документ в разделе
$result = "SELECT COUNT(id) FROM `".$modx->dbConfig['table_prefix']."site_content` WHERE `parent` = ".$inf['id']." AND `type` = 'reference' AND `content` = ".$id;
$sql = $modx->db->query($result);
$result_array = mysql_fetch_array($sql);
// если в разделе ссылок на документ не обнаружено...
if($result_array[0]==0)
{
// ...создаем новую ссылку
$newLink= "INSERT INTO `".$modx->dbConfig['table_prefix']."site_content` (type, pagetitle, alias, published, parent, content, menutitle) VALUES ('reference', '".$currentDocInf['pagetitle']."', '".$currentDocInf['alias']."', 1, ".$category.", ".$currentDocInf['id'].", '".$currentDocInf['menutitle']."')";
$sql = $modx->db->query($newLink);
}
}
}
}
// начинаем удалять, если есть что
if(count($categoriesToBeDeleted)!=0)
{
foreach($categoriesToBeDeleted as $category)
{
$inf=$modx->getDocument($category);
// в разделе, где находится оригинал документа ничего не делаем
if($inf['id']!=$parent['id'])
{
// подсчитываем количество ссылок на документ в разделе
$result = "SELECT id FROM `".$modx->dbConfig['table_prefix']."site_content` WHERE `parent` = ".$inf['id']." AND `type` = 'reference' AND `content` = ".$id;
$sql = $modx->db->query($result);
$result_row = mysql_fetch_row($sql);
// удаляем ссылку
$removeLink= "DELETE FROM `".$modx->dbConfig['table_prefix']."site_content` WHERE `id`=".$result_row[0];
$sql = $modx->db->query($removeLink);
}
}
}Когда создаешь новый плагин, нужно перейти на вкладку Системные события и поставить галочки около событий, к которым необходим привязать плагин.
А как ты повесил исполнение этого кода на OnFormDocSave?