Проверка по условию

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

Аватар пользователя barbarian77 barbarian77 16 декабря 2020 в 6:07

Подскажите в какую сторону смотреть. Есть в ноде термин таксономии техника, к примеру камаз, есть поле дата со временем, есть часы. Как сделать так, что бы я не мог создать другую ноду с термином таксономии камаз, если в поле дата стоит такая же дата и время как в предыдущей, плюс часы. К примеру я создаю ноду с термином таксономии камаз, ставлю дату 16.12.2020 8:00, в поле часы стоит 4 ч. Следующую ноду что бы блокировалось создание с термином камаз на время 16.12.2020 8:00+4 часа, в любое другое время или с термином таксономии урал можно было.

Комментарии

Аватар пользователя OldWarrior OldWarrior 16 декабря 2020 в 12:44

Конкретный код навскидку сложно привести. Но общая механика выглядит как-то так:

1. Пишем простейший модуль с единственной имплементацией хука (одно из двух): hook_form_FORM_ID_alter, ИЛИ ЖЕ hook_entity_presave

Кстати, вот пример, запрещающий сохранение ноды по условию: https://drupal.stackexchange.com/questions/223140/prevent-node-from-bein...

2. Если использовали  hook_form_FORM_ID_alter , то в этом хуке:

2.1 Добавляете свою функцию валидации, в которой считываете выбранный термин (Урал, Камаз. ..etc).

2.2 Далее - EntityQuery, с параметрами  'type' = "node",  'bundle' = 'ваш_тип_материала', 'field_term' = (выбранный термин: Камаз или Урал) .

2.3 Если найдено 1 или более нод по этим условиям, то загрузить найденное и вторым проходом foreach находить разницу во времени с текущим временем: при условии  ($node->created + field_time_hours < t_current) триггерить ошибку (FormState::setError).

Возможно второй проход и не понадобится, я просто навскидку не помню, можно ли в  EntityQuery воткнуть такие запросы с использованием арифметики над другими полями.

3. Если использовать  hook_entity_presave , то в нём также выполнить  EntityQuery (п.2.2) и загрузку найденного + второй проход по нодам (2.3), только сравнивать разницу во времени не с текущим временем, а с временем создания сохраняемой ( $node_current ) ноды : при условии  ($node->created + field_time_hours < $node_current->created) выбрасывать PHP-исключение  throw new \Exception('Ещё не прошло время!')

Но п.2 ( hook_form_FORM_ID_alter ) как бы правильнее, хоть и чуток длиннее.

Ну, это так, механика в общих чертах.

Аватар пользователя OldWarrior OldWarrior 20 декабря 2020 в 11:49

В п.1 выше ссылки на API с информацией по обоим хукам.

Но мне кажется в вашем случае проще заплатить специалисту за практическое решение вопроса. Т.е. за написание необходимого функционала.