[EVO] Автоматическое перемещение документа в другой контейнер

Возник вопрос можно ли автоматически переместить документ из одного контейнера в другой, после того как документ снимается с публикации.
Например: у новости дата отмены публикации подошла и она стала неопубликованная, и после этого необходимо автоматически сменить ее контейнер на Архив новостей

Может у кого была подобная проблема?

13 комментариев

avatar
Попробовал так, но толку нету
с публикации снимается, но переноса не происходит и на всех страницах на сайте сбивается шаблон, просто белая страница
$e=&$modx->Event;
switch ($e->name){
	case "OnDocUnPublished":
		$result = $modx->db->update(`parent` = '19', `modx_site_content`, 'id` = "'.$docid.'"' AND '`template` = '13'');
	break;
 
	default:
		return;
}
Комментарий отредактирован 2013-12-12 10:35:56 пользователем jDeuterium
avatar
Немного ошиблись с $modx->db->update и с синтаксисом php.
Должно получиться что-то типа:
$table_content = $modx->getFullTableName('site_content');
$update = $modx->db->update("`parent` = '19'", $table_content, "`id`= ".$docid." AND `template` = '13'");
avatar
Спасибо, но все равно не работает((
avatar
А проверяете вы снимая галочку «Публиковать» или выжидаете время отмены публикации?
Ошибок никаких не выскакивает?
Может в Отчеты-Просмотр событий появляются какие-то ошибки на этот счет?
avatar
ошибок не было
ставил время и ждал
avatar
$e=$modx->Event;
switch ($e->name){
	case "OnDocUnPublished":
		$table_content = $modx->getFullTableName('site_content');
		$update = $modx->db->update("`parent` = '19'", $table_content, "`id`= ".$docid." AND `template` = '13'");
	break;
 
	default:
		return;
}
avatar
Немного тут поколупался в файлах evo (не знаю зачем мне это нужно) и что выяснилось:
Событие OnDocUnPublished вызывается только если отмена публикации происходит через контекстное меню в дереве ресурсов. Можете проверить с выше-представленным плагином, документ перемещается.
Если отмена публикации происходит снятием галочки при редактировании ресурса, то событие не вызывается, т.к. не сравнивается был ли до этого опубликован ресурс, хотя в коде ядра есть возможность проверить это в одну строчку (разработчикам на заметку ;) ).
Если отмена публикации установлена в качестве даты в документе, и по прошествии этой даты документ снимается с публикации то событие тоже не вызывается.
Такие вот дела.
avatar
Пока разбирался почему плагин не срабатывает, разобрался как вообще modx с расписанием сайта работает. Раз уж время потрачено, так решил статью написать про очереди публикаций в Evo, чтобы было не зря. Там и описано почему плагины на события связанные с публикацией ресурсов теряют смысл.
Надо вашу задачу с другого бока решать.
avatar
И всё-таки, есть какая-то возможность решить эту проблему? (встала похожая задача)
avatar
$e = $modx->Event;
switch ($e->name) {
    case 'OnWebPageInit' : case 'OnPageNotFound' :
        $template = 1; //id шаблона "новость"
        $parent = 2; //id папки "новости"
        $new_parent = 5; //id новой папки "архив"
        $q =  $modx->db->query("UPDATE modx_site_content SET parent={$new_parent} WHERE template={$template} AND published=0 AND parent={$parent}");
        if ($modx->db->getAffectedRows() > 0) {
            $modx->clearCache("full");
        }
        break;
    default:
        break;
}
avatar
Огромное спасибо, переносит в другую папку. Единственное, можно ли ещё сделать так, чтобы в новой папке новость была опубликована, а дата отмены публикации пуста?
Хотела отправить благодарность на Яндекс.Деньги, но пишет, что пользователя с таким емейлом не сушествует)) (емейл отсюда: github.com/webber12/evoSearch :) )
avatar
$q =  $modx->db->query("UPDATE modx_site_content SET parent={$new_parent}, published=1, unpub_date=null WHERE template={$template} AND published=0 AND parent={$parent}");
avatar
Обновлённый вариант этого решения. Который работает когда снимаем галочку внутри ресурса.
/* Необходимо включить системные события OnDocUnPublished и OnDocFormSave*/
$table = $modx->getFullTableName( 'site_content' ); 
$new_parent = 4; //Тут число подменить на id нового родителя
$templates = array(3,4); //Спиоск шаблонов
$fields = array('parent'  => $new_parent);  //Новые данные для тех которые снимаем с публикации
$e = $modx->event;
if ($e->name == 'OnDocUnPublished') {
	$data = $modx->getDocumentObject('id',$id);
	if(in_array($data['template'],$templates)) {
		$result = $modx->db->update( $fields, $table, 'id = "' . $docid . '"' );   
	}
}
if ($e->name == 'OnDocFormSave') {
	$data = $modx->getDocumentObject('id',$id);
	if($data['published']==0 && in_array($data['template'],$templates)) {
		$result = $modx->db->update( $fields, $table, 'id = "' . $id . '"' );   
	}
	
}
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.