Изменение поля ноды без обновления даты node:changed через Rules

Аватар пользователя eos3d eos3d 7 ноября 2020 в 18:24

Добрый день!
У ноды есть поле типа Список - "Устаревшее/Актуальное" (это про объявление пользователя). Через Правила хочу устанавливать галочку "Устаревшее".
- Идет проверка по времени "если объявление не обновлялось пользователем более 6 месяцев", после чего пользователю отправляется письмо с напоминанием "Обновите информацию в объявлении" + выставляется галочка "Устаревшее".

Проблема: У ноды при этом меняется дата обновления.
Задача: Не трогать дату обновления ноды.

Как правилах устанавливать поля для нод, не трогая дату обновления?
Спасибо!

Лучший ответ

Аватар пользователя madt madt 9 ноября 2020 в 10:45

Можно через дополнительное поле для хранения даты обновления пользователем.

- добавить собственное поле для хранения даты обновления пользователем
- при помощи модуля field_permissions установить запрет на отображение/изменение поля для пользователей с определенной ролью
- сделать рулс, который при создании и обновлении пользователями определенной роли будет сохранять в это поле значение ядреной даты обновления (создания) ноды
- во вьюсах переделать сортировку с системного значения даты обновления ноды на значение из собственного поля с датой обновления

Комментарии

Аватар пользователя adano adano 7 ноября 2020 в 20:10

емнип, никак.
Через рулз дергается node_save, поэтому дата обновления будет изменяться.
Только кастом, если нужно просто сменить значение поля.
А лучше логику поменять, т.к. это частая ошибка, когда пытаются строить функционал через changed/created.

Аватар пользователя correptum correptum 7 ноября 2020 в 22:13

а как вариант повесить свой скрипт на крон, который напрямую изменяет значение в БД?
ПС. да, писалось об этом выше про кастом

Аватар пользователя madt madt 9 ноября 2020 в 10:45

Можно через дополнительное поле для хранения даты обновления пользователем.

- добавить собственное поле для хранения даты обновления пользователем
- при помощи модуля field_permissions установить запрет на отображение/изменение поля для пользователей с определенной ролью
- сделать рулс, который при создании и обновлении пользователями определенной роли будет сохранять в это поле значение ядреной даты обновления (создания) ноды
- во вьюсах переделать сортировку с системного значения даты обновления ноды на значение из собственного поля с датой обновления

Аватар пользователя eos3d eos3d 12 ноября 2020 в 17:51

Вобщем, все равно не работает как надо.
Это первое правило, которое заполняет Собственное поле "Обновлено new"

А это второе правило, которое выполняет целевую задачу - установить значение "Устаревшее", при этом не трогать дату в "Обновлено new".

Что происходит по факту:
Любой пользователь сайта кроме админа, заходит на ноду. Срабатывают оба правила, в итоге дата все равно обновляется. Тупик.
(правильно работает, только если админ заходит на ноду, но должно правильно работать на любого пользователя).

Аватар пользователя eos3d eos3d 9 ноября 2020 в 10:48

Что значит ядреной даты обновления?

На сколько я сейчас понял - мы скроем от пользователя системное поле "Дата обновления" и покажем созданное нами. Но по факту дата и в скрытом и во вновь созданном будет одна и та же. Или я что-то не понял?

Аватар пользователя madt madt 9 ноября 2020 в 10:55

От пользователя будет скрыто собственное поле для хранения даты обновления, чтобы он в нее не мог вручную что-то ввести. Системное поле итак недоступно для просмотра.

Дата создания/обновления в системном и собственном поле будут одинаковы тогда, когда пользователь будет создавать ноду или сам будет обновлять ее. Если ты как админ внесешь изменения, то рулс не обновит собственное поле. Чтобы так работало, в рулсе должен быть condition на проверку не обладания пользователем определенной ролью пользователя, например, ролью «administrator».

Аватар пользователя eos3d eos3d 9 ноября 2020 в 11:59

Я все равно не до конца понял, но попытаюсь воспроизвести))
Спасибо! Напишу, если не получится

Аватар пользователя eos3d eos3d 9 ноября 2020 в 12:54

Все сделал, но пока не срабатывает как нужно.
1) Создал Правило, которое проверяет, не админ ли юзер, обновивший материал https://yadi.sk/i/0DKzzFFndA9N5g
+ устанавливает Собственную дату обновления такой же как системная https://yadi.sk/i/xhtsTZJDqDdUSQ
2) Для Собственного поля Обновлено выставил разрешения https://yadi.sk/i/f196SUnX-vEa8w

3) Другое правило выполняя свою работу, все равно обновляет Собственную дату обновления материала.
+ При ручной проверке - я, как админ обновляю ноду, и у нее также меняется дата обновления в новом собственном поле.

Аватар пользователя madt madt 9 ноября 2020 в 16:10

В Conditions нужно использовать токен [site:current-user] вместо [node:author], так как проверка должна происходить для текущего авторизованного пользователя. А токен [node:author] хранит данные об авторе ноды.

Аватар пользователя eos3d eos3d 10 ноября 2020 в 17:24

madt wrote: - во вьюсах переделать сортировку с системного значения даты обновления ноды на значение из собственного поля с датой обновления

Столкнулся с тем, что для 99% имеющихся нод Собственное поле Обновлено - не заполнено. Оно получит значение только когда автор обновит его. А значит и сортировку по этому полю во views ставить бессмысленно.

Аватар пользователя ivnish ivnish 10 ноября 2020 в 18:24

Сделайте в кастомном модуле hook_update и заполните это поле из даты ноды, если оно пустое

Аватар пользователя madt madt 12 ноября 2020 в 0:31

Во views сделай сортировку и по системному и по собственному полю.

Ноды без заполненного собственного поля будут сортироваться по системному Updated и будут опускаться. Обновленные пользователями ноды будут сортироваться по собственному Updated и будут подниматься.

Аватар пользователя eos3d eos3d 12 ноября 2020 в 15:32

madt wrote:
Думаю, надо его сделать «indexed».

Можно подробнее, как это сделать?

Аватар пользователя marassa marassa 12 ноября 2020 в 15:51
1

Похоже у Вас вьюха построена по поисковому индексу. Чтобы нужное поле стало доступным вьюхе его нужно сначала добавить в этот индекс. Это где-то тут: /admin/config/search/search-api

Аватар пользователя eos3d eos3d 13 ноября 2020 в 16:26

Вобщем, все равно не работает как надо.
Это первое правило, которое заполняет Собственное поле "Обновлено new"

А это второе правило, которое выполняет целевую задачу - установить значение "Устаревшее", при этом не трогать дату в "Обновлено new".

Что происходит по факту:
Любой пользователь сайта кроме админа, заходит на ноду. Срабатывают оба правила, в итоге дата все равно обновляется. Тупик.
(правильно работает, только если админ заходит на ноду, но должно правильно работать на любого пользователя).