We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 28814 ☆ A M B ☆
    • 1,086 Posts
    Quote from: racoon at Jan 26, 2010, 02:59 PM

    Да, вполне доходчиво, спасибо smiley Из-за необходимости сортировки думаю остановиться на варианте с доп. таблицей.
    А я бы рассмотрел еще вариант, предложенный AKots’ом. Имею ввиду написание плагина, который будет отслеживать событие "Добавление нового документа" и, при выполнении заданных условий, создавать точно такие же документы в нужных рубриках сайта. Мне кажется это более элегантное решение, чем использовать дополнительный модуль.
      Разработка сайтов и программных модулей на MODX.
      Опыт работы на MODx с 2005 года. Высокое качество.
      Компания Baltic Design Colors: http://www.bdcolors.ru.
      • 22301
      • 1,084 Posts
      идеальный вариант именно с отдельной таблицей. по-большому счёту ни мои варианты не подходят на все 100%, ни AKots’а, так как это не более, чем костыли, в предложенном виде.

      а если нужно завести несколько новых, не документарных, разделов, а туда напихать документов или ссылок? это надо ручками будет ковырнуть настройки плагина, потом ручками же поправить tv’ари, а может быть, и ещё что-то...

      всего этого можно избежать, если клиент изначально грамотно спроектирует структуру. но если судить по вопросу racoon’а, делать он этого не собирается:)


      хорошо бы посмотреть на конечно решение racoon’а wink
        [img]http://jurist-info.ru/pic/rrr.jpg[/img]

        Безжалостный пияр!
        Artima -- неуч!
        Осторожно: преступная локализация -- modx-cms.ru
        Баштанник Андрей -- мегапрограммер из Белоруссии и поедатель говна, очень критично настроенный молодой человек!

        Дисклеймер для общительных: даю сам себе право транслировать в открытый эфир содержание лички, just for fun
        • 24301
        • 55 Posts
        Я подумал и решил сделать плагином, который работает по событию OnFormDocSave. Код вот такой получился:

        // получаем информацию о разделе, в котором находится сохраняемый документ и о самом документе
        $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);
             		}
        	}
        }
          • 6623
          • 127 Posts
          А как ты повесил исполнение этого кода на OnFormDocSave?
            • 24301
            • 55 Posts
            Quote from: DAS at Jan 31, 2010, 11:49 PM

            А как ты повесил исполнение этого кода на OnFormDocSave?
            Когда создаешь новый плагин, нужно перейти на вкладку Системные события и поставить галочки около событий, к которым необходим привязать плагин.