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

Главные вкладки

Аватар пользователя Alex_R Alex_R 12 января 2012 в 18:01

Пишу фильтр и что то никак не могу найти где можно получить дату последнего редактирования (или создания, если редактирования не было) ноды или комментария. Фильтр должен обрабатывать документы только измененные (или созданные) после определенной даты. Что то уже все перепробовал - ничего не получается. Как правильно?

Комментарии

Аватар пользователя Lotar Lotar 12 января 2012 в 18:19

Не знаю какой фильтр, где, и как вы пишите. Но в views можно выбрать фильтр -
Материал: Дата обновления
Материал: Дата обновления/комментирования

Аватар пользователя Alex_R Alex_R 12 января 2012 в 19:53

Lotar wrote:
Не знаю какой фильтр, где, и как вы пишите.

В друпале пишу свой модуль-фильтр, который затем добавляется в фильтры формата ввода. Сорри, если изначально непонятно написал. Так вот фильтр написан и работает, но как выяснилось уже после того как он был написан работает он "слишком глобально", сайт существует давно и новый фильтр должен обрабатывать не все, а только тексты изменения которых произошли после установки данного фильтра (дата выставляется в настройках фильтра).
ilyin.eugene wrote:
в нодах дата создания и редактирования хранится в полях created и changed соответственно

Это я знаю. Спасибо! Только совсем непонятно как до них достучаться. У меня не получается даже определить, что в данный момент фильтр обрабатывает ноду, коммент или что то другое...
т.е. если я правильно понимаю вопрос делится на три части:
1. Как определить что обрабатывается фильтром (нода или коммент).
2. Далее видимо нужно загрузить весь массив с помощью node_load или _comment_load. Но для этого нужны входные параметры (если нода, то nid, если коммент, то cid.) Тоже не понимаю где их можно узнать.
3. Обратиться в массиве к нужной ячейке и сравнить с заданной датой - с этим все понятно.

Может я не тем путем иду? Может можно как то проще, потому как таким образом пока не понятно.
Заранее Спасибо!

Аватар пользователя ilyin.eugene ilyin.eugene 12 января 2012 в 20:39

а что за фильтр вообще? хук фильтр? в какой момент от перехватывает контент для фильтрации. А то непонятно что вы используете.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 12 января 2012 в 20:39

"Alex_R" wrote:
Пишу фильтр и что то никак не могу найти где можно получить дату последнего редактирования (или создания, если редактирования не было) ноды или комментария. Фильтр должен обрабатывать документы только измененные (или созданные) после определенной даты. Что то уже все перепробовал - ничего не получается. Как правильно?

нет такого, в фильтры не передаётся контекст, только выцеплять nid по arg()

Аватар пользователя Alex_R Alex_R 12 января 2012 в 21:01

RxB wrote:
только выцеплять nid по arg()

Можно чуть поподробнее? Я правильно понимаю, что до того как выцеплять nid, еще нужно понять, что это нода, а в комменте соответственно выцеплять cid?

Аватар пользователя boneg boneg 12 января 2012 в 21:21
<?php
if (arg(0) == 'node' && is_numeric(arg(1))) {
$query db_fetch_object(db_query("SELECT n.changed FROM {node} n WHERE n.nid == %d"arg(1)));
}
?>

$query->changed будет дата последнего изменения в формате unixstamp. Если ноду не редактировали - равна дате создания. Работать будет на странице просмотра и редактирования ноды.

Ну а сами условия показа варианта фильтра для элемента формы делайте через hook_form_alter(), в качестве одного из аргументов он принимает ID формы. Сможете решить в каких именно полях какой формы ваш фильтр показывать.

Аватар пользователя Alex_R Alex_R 14 января 2012 в 5:26

Спасибо! Через arg() получить номер, а затем и время ноды на конкретной странице можно, но вот незадача, на этой же странице помимо самой ноды есть и комментарии к ней и у них своя дата и у каждого своя... либо я не понял всего изящества данного решения, либо оно неприемлемо к поставленной задаче. Либо я не совсем доходчиво объяснил задачу, потому как половину того, что мне тут написали я не понимаю куда в моей задаче можно приложить.
Попробую написать что мне надо на примере.
на странице /admin/settings/filters/1 есть список фильтров, я к нему добавляю еще один свой, который, допустим, в текстах заменяет слово "редиска" на словосочетание "нехороший человек". Но должен он это делать не во всех текстах, а допустим, только в текстах измененных после 1 января 2012 года,и во всех местах, где используется данный формат ввода (в моем случае как в нодах, так и в комментариях). т.е. если нода создана в декабре прошлого года, то слово "редиска" в ней остается без изменений, а в комменте к этой ноде, написанном 2го января оно должно замениться.
Есть решение данной задачи или это в принципе противоречит хитрой логике Друпала и в нем невозможно?

Аватар пользователя Alex_R Alex_R 14 января 2012 в 16:02

Хорошенько поразмыслив пришел к выводу, что данный путь не является оптимальным для решения поставленной задачи, намного более правильный путь логически понятен, но совсем непонятно как его реализовать, а именно:
Все роли до даты "Х" используют одни форматы ввода, а после данной даты другие (с этим фильтром).
т.е. не просто поменять форматы ввода для ролей, а чтобы при обнулении кэша старые документы обрабатывались старым набором фильтров,а новые новым. Такое реально?

Аватар пользователя boneg boneg 14 января 2012 в 22:46

"Alex_R" wrote:
чтобы при обнулении кэша старые документы обрабатывались старым набором фильтров,а новые новым. Такое реально?

Можно сделать в шаблоне ноды. Выводить содержимое любого поля / body в зависимости от даты создания/изменения. В node-тип.tpl.php вывести что-то в духе:

<?php
if ($node->changed 234534535) {
print 
check_markup($node->field_нужноеполе[0]['value'], 1)
} else {
print 
check_markup($node->field_нужноеполе[0]['value'], $node->field_нужноеполе[0]['format'])
}
?>

Ну и соответственно вместо 1 поставить ID нужного формата ввода, а в настройках отображения поля отключить вывод в переменную $content. В таком случае выбранный формат а форме создания/редактирования ноды будет игнорироваться для нод с датой изменения ранее 234534535, т.к. вы выводите его в нужном формате принудительно. И это нужно проделать для всех полей ноды, для которых нужно изменить этот самый формат без ручного переключения.

Хотя не совсем понимаю, как у вас возникла такая странная задача. Опишите детальней зачем вам это нужно, может есть более простое решение.