Материалы будующего
Прислано: 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 на сервере\хостинге и радуемся результату.
Кто, что думает насчет внесения этого в стандартную поставку друпала?
- Wincert's blog
- Для комментирования войдите или зарегистрируйтесь
Модуль scheduler решает данный вопрос вполне удобно и "кошерно".
- Для комментирования войдите или зарегистрируйтесь
А зачем вам db_rewrite_sql ?
- Для комментирования войдите или зарегистрируйтесь
Кто, что думает насчет внесения этого в стандартную поставку друпала?
Не учтено что будет с материалами которые сохранены, например, как черновики, т.е. не опубликованы. Функция не публиковать теряет в таком случае часть своих возможностей, ИМХО.
- Для комментирования войдите или зарегистрируйтесь
«Модуль scheduler решает данный вопрос вполне удобно и "кошерно".»
Вообще не понял как он работает.
«А зачем вам db_rewrite_sql ?»
Действительно незачем, убрал.
«Не учтено что будет с материалами которые сохранены, например, как черновики, т.е. не опубликованы. Функция не публиковать теряет в таком случае часть своих возможностей, ИМХО.»
Не опубликованные так и останутся не опубликованными пока их не опубликуют. А опубликованные будут публиковаться только когда придет их время.
Зачем публиковать материал с будущей датой?
P.S. В хроме кнопочка цитаты не работает.
- Для комментирования войдите или зарегистрируйтесь
'.time().' можно заменить на встроенную функцию NOW()
- Для комментирования войдите или зарегистрируйтесь
«Модуль scheduler решает данный вопрос вполне удобно и "кошерно".»
Вообще не понял как он работает.
Требуется дополнительно включить опцию в типах материала.
- Для комментирования войдите или зарегистрируйтесь
Проверку можно делать в node.tpl.php. Тогда у этого решения появляется дополнительный функционал, знакомый некоторым под рабочим названием "Анонс поста" или "Пост на заказ". Т.е. можно показывать заголовки поста, но не сам пост, а также дату его появления на сайте. Пользователи будут видеть анонсированные посты (можно высунуть в отдельный блок) и в случае заинетресованности спланируют посещение.
Никаких хаков ядра для этого не надо.
если (время публикации еще не наступило) {
не_показывать_ноду();
} иначе {
показать();
}
- Для комментирования войдите или зарегистрируйтесь





Комментарии