Подскажите в какую сторону смотреть. Есть в ноде термин таксономии техника, к примеру камаз, есть поле дата со временем, есть часы. Как сделать так, что бы я не мог создать другую ноду с термином таксономии камаз, если в поле дата стоит такая же дата и время как в предыдущей, плюс часы. К примеру я создаю ноду с термином таксономии камаз, ставлю дату 16.12.2020 8:00, в поле часы стоит 4 ч. Следующую ноду что бы блокировалось создание с термином камаз на время 16.12.2020 8:00+4 часа, в любое другое время или с термином таксономии урал можно было.
Комментарии
Имхо, такие вещи только кодом решаются.
Я тоже так думаю, ну мне бы хоть примерный код, для решения этой задачи.
Конкретный код навскидку сложно привести. Но общая механика выглядит как-то так:
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
) как бы правильнее, хоть и чуток длиннее.Ну, это так, механика в общих чертах.
А в чем разница между этими хуками, и где об этом можно подробнее почитать?
В п.1 выше ссылки на API с информацией по обоим хукам.
Но мне кажется в вашем случае проще заплатить специалисту за практическое решение вопроса. Т.е. за написание необходимого функционала.
Тут я согласен, но нужно с чего то начинать писать самому, а на кошечках тренироваться не хочется