Нужно дать возможность пользователю устанавливать срок публикации материала (у ноды есть поле типа селект со значениями: 1 день, 2 дня... и т.д). Посмотрел модуль Auto Expire, там одно правило применяется ко всем нодам выбранного типа, а не для каждой отдельной ноды, как нужно мне.
Решил сделать с помощью Sheduler и Rules. Но возникла проблема с составлением правила.
Собственно, как в rules указать, что после сохранения материала, следует заполнить поле Unpublish on в свойствах ноды? Желательно с возможностью php кода, так как значение нужно вычислять на основе значения другого поля. Я просто не нашел в экшене rules параметров для sheduler.
Комментарии
Гляньте модуль http://drupal.org/project/scheduler
Я думаю, что ТС упомянул стандартную связку Sheduler+Rules из базового ф-ционала, которая позволяет делать много чего автоматически по расписаниям, но даже написание скрипта по публикации/снятию этим методом будет требовать гораздо больше времени и знаний, нежели чем использование готового модуля, который предложил я.
а зачем после сохранения материала что то делать - тут надо по крону к примеру проверять опубликованные ноды и смотреть
if (текущее время - время создания ноды > значения селект поля , переведенного unix формат ) выполнить действие - $node->status = 0
и вот это тоже должно помочь - там не совсем по такому принципу делают но глаза на суть решения откроет
Дело в том, что я как раз и использую модуль Scheduler. Он добавляет в настройки материала поле Unpublish on, а затем сам по крону снимает материалы, где эта дата меньше текущей.
Просто у меня есть поле материала (Срок публикации), которое заполняет пользователь, и мне каким-то образом нужно перенести значение этого поля в поле Unpublish on.
Я думал, это можно сделать через Rules, чтобы не писать свой модуль. Но не смог разобраться как.
Сделал через hook_node_presave().
расскажи как.
Да, тоже интересно.
Создаем новый модуль. В нем пишем:
<?php
/**
* Implementation hook_node_presave()
*/
function MODULE_node_presave($node) {
$node->unpublish_on = 'timestamp нужной даты';
}
?>Так как у меня была задача сделать зависимость от другого поля, я написал так:
<?php
// если поле заполнено
/**
* Implementation hook_node_presave()
*/
function MODULE_node_presave($node) {
if (!empty($node->field_lifetime['und'][0]['value'])) {
// получаем его значение
$field = $node->field_lifetime['und'][0]['value'];
// преобразоваем в timestamp и записываем в поле Unpublish on
$node->unpublish_on = strtotime('+' . $field, $node->created);
}
}
?>Поле field_lifetime обычный список вида:
1 day|1 день
1 week|1 неделя
1 month|1 месяц
[quote=Cristian]Создаем новый модуль. В нем пишем:
<?php
// если поле заполнено
function MODULE_node_presave($node) {
if (!empty($node->field_lifetime['und'][0]['value'])) {
// получаем его значение
$field = $node->field_lifetime['und'][0]['value'];
// преобразоваем в timestamp и записываем в поле Unpublish on
$node->unpublish_on = strtotime('+' . $field, $node->created);
} ?>
У меня почему то по крону, материал снимается с публикации, но данная операция идет по кругу, т.е. unpublish_on увеличивается на предидущие значение.
а поле-селект имеет тип date ?
Нет, у меня просто список вида "1 day|1 день". Но это не принципиально. Поскольку, мы сами в php обрабатываем данные, тип поля может быть любым.
если что интерсует как раз это как и где вы это обрабатываете...
решение то приведите работающие...
Что не понятно в функции, которую я привел несколькими комментариями выше?
Ну как текстовое поле превращается в timestamp и потом еще сравнивается?
Почитайте описание функции [url=http://php.net/strtotime]strtotime[/url].
Мой самый простой вариант решения через Views + Date.
iNFerNo, решение работающее