Вечер добрый! Цель такая: добавить в форму создания/редактирования материала определенного типа:
- checkbox,
- четыре поля с датами,
checkbox по умолчанию не поставлен, если его поставить -- вываливаются поля с датами.
Планирую вот что: сделать кастомный модуль, в коде реализовать:
- программное создание поля и экземпляра field_create_field и field_create_instanse в .install
- hook_form_node_form_alter
- в сабмите формы сохраняю значения в поля
- в hook_node_prepare будут http запросы, результаты которых запишутся в поля с датами (или не запишутся, если с ответом что-то не то), запросы пойдут при условии, что checkbox не установлен
с таким подходом, на какие я грабли могу наткнуться (чую, что с form_alter)? и что бы вы избрали в качестве решения подобной задачи?
Ответы
если кому интересно -- сообщаю о результате.
-
создается всё на отлично, если возникают ошибки FieldException -- проверять таблицы field_data_field_foo и field_revision_field_foo (иногда они остаются в БД после тестов и т.п.) и field_config + field_config_instance
-
допиливая форму, обнаружил те самые грабли, про которые спрашивал, -- #states (Form API) дружится с полями дат нетривиально — подружил с помощью #after_build (в конструкторе добавил филдсет с заданным #states, в after_build функции перебросил поля в филдсет, unset и вернул форму). И никакой conditional_fields не нужен.
-
в сабмите поля дат сохраняются подобным образом:
$node->field_custom_dates[LANGUAGE_NONE][0]['value']
$node->field_custom_dates[LANGUAGE_NONE][0]['value2'] -- это если используется интервал и нужно задать дату завершения -
hook_node_prepare не понадобился, сделал всё в hook_node_submit
Судя по условию подходит стандартное решение - https://www.drupal.org/project/conditional_fields
это же States API для полей. а остальное? это же две-три строки в коде вы предлагаете обменять на целый модуль
checkbox field + date field + https://www.drupal.org/project/conditional_fields
Почему нельзя создать через админку как обычно?
мне для деплоя всё равно необходимо все движения в БД реализовывать в коде
Странный вопрос. А есть какие то альтернативные решения?
про странный вопрос адресовано мне? решений других я с ходу не вижу, подумал о запасных вариантах и потому спросил
запросы для заполнения полей, правда сделал не в prepare, а в _node_submit, остался alter формы