Показать форму редактирования ноды Drupal на произвольной странице

13 Окт 2009
Опубликовано Гость
Задача: 

Нужно вывести (внедрить) форму создания ноды на странице, которая не совпадает со стандартным URL для создания нод (node/add/[тип нод]). То есть на произвольной странице показать ноду создания контента одного из типов. При этом нужно сохранить весь функционал этой формы - AHAH, валидацию и корректное сохранение.

Иногда бывает нужно встроить (embed) форму редактирования ноды.

Drupal 5

Для 5й версии можно использовать модуль subform element (http://drupal.org/project/subform_element), который позволяет это легко сделать.

Drupal 6

В 6й версии Drupal формы стали сложнее (активно используется AHAH), поэтому при при неаккуратном использовании формы могут перестать работать. Создадим модуль, который будет показывать внедрённую форму на произвольной странице.
Чтобы не нарушить работу AHAH нужно просто не менять структуру массива $form.

  • Создать файл example.info и добавить в него код:
    name = Embeded form for node creation
    description = Embeded form for node creation
    core = 6.x
  • Создать файл example.module

Форма создания ноды

Добавить в файл модуля хук hook_menu, который укажет Drupal какая функция должна выполяться при запросе URL "http://example.com/example_url":

/**
 * Реализация hook_menu().
 */

function example_menu() {
  $items['example_url'] = array(
    'title' => t('Embeded form'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('example_embed_node_form'),
    'access callback' => TRUE,
    'file' => 'node.pages.inc',
    'file path' => drupal_get_path('module', 'node'),
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

Если модуль будет называться не 'example', то нужно изменить название функции и параметр 'page arguments'.
Также поменяйте параметр 'title', а ключ $items['example_url'] должен соответствовать тому пути, который вы хотите использовать.

Добавляем функцию, которая и выводит форму создания ноды:

function example_embed_node_form(&$form_state) {
  global $user;
  $form = array();
  $type = 'page';
  if (node_access('create', $type)) {
    // Инициализация новой ноды:
    $node = array('uid' => $user->uid, 'name' => $user->name, 'type' => $type);
    $form += drupal_retrieve_form($type .'_node_form', $form_state, $node);
    //Нужно как-то указать кнопки формы - иначе при рендере формы
    //они будут где попало:
    $form["buttons"]['submit']['#weight'] = 100;
    $form["buttons"]["preview"]['#weight'] = 100;
    drupal_prepare_form($type .'_node_form', $form, $form_state);
  }

  //Массив формы теперь изменён всеми реализациями hook_form_alter().
  // Теперь форму можно использовать.
  return drupal_render($form);
}

Переменная $type содержит машинное название типа материалов.

Теперь модуль нужно установить и открыть "http://example.com/example_url" для проверки.

Форма редактирования существующей ноды

Добавить хук hook_menu():

function example_menu() {
  $items['example_url/%node/edit'] = array(
    'title' => 'Edit',
    'page callback' => 'node_page_edit',
    'page arguments' => array(1),
    'access callback' => 'node_access',
    'access arguments' => array('update', 1),
    'weight' => 1,
    'file' => 'node.pages.inc',
    'file path' => drupal_get_path('module', 'node'),
    'type' => MENU_LOCAL_TASK,
  );
  return $items;
}

Теперь модуль нужно установить и открыть "http://example.com/example_url/[nid]/edit" для проверки, где nid - ID существующей ноды.

Полезные ссылки

Использованные материалы: 
 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>