Нужно вывести (внедрить) форму создания ноды на странице, которая не совпадает со стандартным 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'] должен соответствовать тому пути, который вы хотите использовать.
Добавляем функцию, которая и выводит форму создания ноды:
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():
$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 существующей ноды.











