Параметрический вызов формы добавления нода на разных страницах
Предположим, мы создали модуль и в нем определили новый тип нода. Пусть это будет нод «Город» с внутренним именем 'city'. В форме добавления нашего нода с адреса 'node/add/city', кроме всего прочего, мы сделаем селектор стран, чтобы можно было выбирать, в какой стране находится город:
Теперь предположим, что мы создали страницы с описаниями разных стран. И хотим чтобы пользователь мог добавить город не через меню «Создать материал» — «Город», а со страницы с описанием страны. Что логично: вот пользователь смотрит на страницу «Россия» и сразу хочет добавить свой родной город.
Первое, что мы можем по этому поводу сделать — это разместить ссылку на 'node/add/city'. Но в таком случае пользователю придется в форме добавления города выбирать страну из списка, а ведь он уже сделал этот выбор, нажав «Добавить город» именно на странице с описанием нужной страны. Очевидно, следует учесть выбор пользователя и при создании формы установить заданную страну как дефолтную в списке 'countries'.
Перво-наперво, изменим ссылку на форму добавления нода. Вместо 'node/add/city' будем писать 'node/add/city/<country>', где вместо <country> подставим код страны. Например, 'node/add/city/ru'. Тогда можно просто воспользоваться элементом адреса в функции создания формы:
Довольно простое решение. Теперь усложним задачу. Допустим, что описание каждой страны у нас находится по адресу '/countries/<country>' (например, '/countries/ru'), а города — по адресам 'countries/<country>/cities/<city>'. Тогда ссылка «Добавить город», ведущая на адрес 'node/add/city/<country>' несколько не вписывается в логику адресов. Логичнее было бы разместить форму по адресу 'countries/<country>/cities/new'. Для этого создадим в нашей реализации hook_menu()
Функция node_add('city')arg(3)arg(1)
Оказывается, node_add()drupal_get_form()
Непродолжительное копание в API показало, что у элементов меню, добавляемых в hook_menu()hook_menu()
Тогда все заработает.
В заключение хочется отметить, что процесс решения этой небольшой проблемы лишний раз подчеркивает: поиск и чтение документации — рулит (а задавание вопросов в форумах — нет).

Отправить комментарий