Материалы будующего

Прислано: Wincert

чт, 08/10/2009 - 19:39

Другие статьи по теме:

Нет, этот пост не про нано технологии, а про материалы создаваемые в друпале (page, story и т.д.).
Если в друпале создать материал и поставить ему будущую дату, то такой материал будет отображаться вместе с остальными. Мне такое поведение кажется не логичным. По моему мнению такие материалы не должны отображаться пока не наступит заданная дата.
Какой в этом смысл?
Смысл прост... Можно в один день набить с десяток материалов и они будут появляться в указанные дни в будущем.

Предлагаю внести эти изменения в ядре стандартной поставки друпала.

А пока предлагаю решение этой задачи кустарными методами, которые я смог придумать..

Метод 1 - правка модуля node
Как ни прискорбно, но в друпале куда проще залезть в файл модуля и сделать все что вам нужно, чем часами разбираться с его API. Именно так мы сейчас и поступим.
Врываемся в папку 'modules/node', хватаем... то есть открываем файл node.module и тупо жмем заменить (во всех редакторах есть такая кнопка)
вот это:
n.status = 1
заменяем на вот это:
n.status = 1 AND n.created < '.time().'
Заменяем все найденное!
И вот у нас не отображаются материалы на главной и в терминах таксономии пока не наступит их дата. Но это очень грубое решение, и в нем есть много минусов. Например надо будет не забывать учесть это в сниппетах, а стандартные блоки (свежие материалы, популярное содержимое и т.д.) все равно будут отображать будущий материал в прошлом. Как их хукать\хакать я уже не стал разбираться т.к. другие модули под это тоже не заточены.

Метод 2 - через cron.php
Этот вариант более грамотный, я именно так и сделал. При создании материала указываем ему будущую дату и снимаем флажок публикации, то есть не публикуем материал. В cron.php дописываем в конце следующие строки:

<?php
$sql 
"SELECT n.nid, n.title FROM {node} n WHERE n.status = 0 AND n.created < ".time();
$result db_query($sql);
while (
$id db_fetch_object($result)) {
    
$sql2 "UPDATE {node} SET status = 1 WHERE nid = ".$id->nid;
    
$result2 db_query($sql2);
    echo 
"Publish Post: ".$id->title." (".$id->nid.")\n";
}
?>

Теперь материалы будут становиться в статус "опубликован", когда придет их время. Не забываем настроить cron на сервере\хостинге и радуемся результату.

Кто, что думает насчет внесения этого в стандартную поставку друпала?

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано WiseMan в чт, 08/10/2009 - 20:59.

Модуль scheduler решает данный вопрос вполне удобно и "кошерно".


Опубликовано kosilko в чт, 08/10/2009 - 21:06.

А зачем вам db_rewrite_sql ?


Опубликовано WiseMan в чт, 08/10/2009 - 21:16.

"Wincert" написал(а):

Кто, что думает насчет внесения этого в стандартную поставку друпала?

Не учтено что будет с материалами которые сохранены, например, как черновики, т.е. не опубликованы. Функция не публиковать теряет в таком случае часть своих возможностей, ИМХО.


Опубликовано Wincert в пт, 09/10/2009 - 00:46.

«Модуль scheduler решает данный вопрос вполне удобно и "кошерно".»
Вообще не понял как он работает.

«А зачем вам db_rewrite_sql ?»
Действительно незачем, убрал.

«Не учтено что будет с материалами которые сохранены, например, как черновики, т.е. не опубликованы. Функция не публиковать теряет в таком случае часть своих возможностей, ИМХО.»
Не опубликованные так и останутся не опубликованными пока их не опубликуют. А опубликованные будут публиковаться только когда придет их время.
Зачем публиковать материал с будущей датой?

P.S. В хроме кнопочка цитаты не работает.


Опубликовано vectoroc в пт, 09/10/2009 - 01:00.

'.time().' можно заменить на встроенную функцию NOW()


Опубликовано WiseMan в пт, 09/10/2009 - 09:06.

"Wincert" написал(а):

«Модуль scheduler решает данный вопрос вполне удобно и "кошерно".»
Вообще не понял как он работает.

Требуется дополнительно включить опцию в типах материала.


Опубликовано Химический Али в пт, 09/10/2009 - 09:25.

Проверку можно делать в node.tpl.php. Тогда у этого решения появляется дополнительный функционал, знакомый некоторым под рабочим названием "Анонс поста" или "Пост на заказ". Т.е. можно показывать заголовки поста, но не сам пост, а также дату его появления на сайте. Пользователи будут видеть анонсированные посты (можно высунуть в отдельный блок) и в случае заинетресованности спланируют посещение.

Никаких хаков ядра для этого не надо.

если (время публикации еще не наступило) {
не_показывать_ноду();
} иначе {
показать();
}


Ссылки партнёров

Самое главное - выбрать климатическую камеру, а тут купить инкубатор лабораторный (или термокамеру).