Упрощение связки двух материалов в Drupal

Опубликовано 2014.05.14

Предположим у вас на сайте есть два типа материала. Пусть это будет "Автор" и "Статья". В статье есть поле типа "Ссылка на материал", через которое к статье привязывается автор. Задача следующая: на странице автора нужна ссылка на добавление статьи. При переходе по этой ссылке поле автора должно быть заполнено соответствующим автором. Реализуется это достаточно просто. Для этого понадобятся:
  • собственный модуль
  • знание Form API
  • понимание hook_form_alter
  • немного знаний по PHP
Скачиваем и включаем модуль References Node Reference должен быть включён Создаём материал типа "Автор". В материале типа article добавляем соответствующее поле. Разрешаем прикреплять через него авторов Материал готов Затем создадим(если их ещё нет) несколько авторов. Я создал пока трёх. Вот теперь можно создать нужную нам ссылку. Самый простой и топорный способ - создать блок. Так как у него очень легко задать настройки видимости. В этом случае нам потребуется включить модуль PHP Filter, так что имейте это ввиду. Если не хотите его включать - обыграйте этот момент по-другому. Например пропишите ссылку в шаблоне автора. Я постарался уместить страницу создания блока на скриншоте. Заголовок блока можно написать так, чтоб вам было понятно. Я написал "Ссылка на статью с автором" В Block body я написал следующий код:
  1. print l('Add article', 'node/add/article', array('query' => array('a' => arg(1))));
Поясняю. Функция l создаёт ссылку. Первый аргумент - анкор ссылки, второй - путь ссылки(атрибут href), а третий прикрепляет GET переменную a, которая будет передавать NID просматриваемой ноды, то есть автора. Функция arg подтягивает этот NID. Даже если у вас настроены ЧПУ(красивые адреса) - идентификатор материала всё равно подтянется. Сразу же разместил блок в регионе Sidebar first. В настройках видимости дал права только админу и на страницах материала типа Article. Не забывайте кавычки в боди, а также выставить формат ввода. Никаких визуальных редакторов, естественно. Если теперь открыть страницу автора - увидите блок со ссылкой. Например на Лермонтове ссылка у меня выглядела так /node/add/article?a=4 А у самого автора NID=4. Если у вас всё работает так-же - значит всё сделали правильно. Можете нажать на эту ссылку, у вас откроется обычая страница добавления материала типа article. Вот сейчас уже можно создавать свой модуль. Как его сделать написано тут и тут. Размещаем в нём hook_form_alter: На начальном этапе я узнаю идентификатор формы следующим образом.
  1. function mymodule_form_alter(&$form, &$form_state, $form_id){
  2. debug($form_id);
  3. }
Я заранее вынес поле автора повыше, чтоб было видно. Дебаг показал мне, что айдишник формы добавления статьи article_node_form Тогда я поальтерю ранее созданное поле автора. В моём случае оно называется field_node_author. Если у вас так-же то копируйте текст. Иначе - меняйте на своё.
  1. function mymodule_form_alter(&$form, &$form_state, $form_id){
  2. if($form_id == 'article_node_form') {
  3. if(isset($_GET['a'])) {
  4. $form['field_node_author']['und'][0]['nid']['#default_value'] = (int) $_GET['a'];
  5. }
  6. }
  7. }
Я всё сделал верно, поле заполнено. У вас должно получиться точно так-же. Модуль вышел на 7 строчек кода;)