Создание ноды с минимальным вводом

Цель: необходимо иметь мини-формы для создания конкретных типов узлов "на лету" из любого места на сайте. Вместо того, чтобы пользователь нажав кнопку "Создать материал", выбрать тип материала "foo", а затем, заполнив форму, сохранять ноду - можно создать форму для этого типа содержимого, которую можно будет отобразить в блоке. Таким образом, создать ноду можно быстро.

Два способа сделать это:

  • Вызвать drupal_get_form('nodetype_node_form'), а затем использовать hook_form_alter() чтобы исключить (unset) некоторые элементы формы
  • Создать собственную форму, а затем drupal_execute() для использования своей формы

1. Вызов формы обработчика типа материала

К примеру, у нас есть тип материала "foo":

<?php
function custom_foo_node_form() {
global $user;
$node = array(
'uid' => $user->uid,
'name' => $user->name,
'type' => 'foo',
);
return drupal_get_form('foo_node_form', $node);
}
 
function custom_form_alter($form_id, &$form) {
if ($form_id == 'foo_node_form') {
if ($_GET['q'] != 'node/add/foo') {
$values = array(
'menu',
'attachments',
'preview',
'options',
'author',
'log',
'body_filter',
'path',
);
foreach($values as $k) {
if (isset($form[$k])) {
unset($form[$k]);
}
}
}
}
} 
?>

Затем вставить это в какой-нибудь блок (используя PHP формат) или куда-нибудь в файл темы (*.tpl.php).

<?php 
print custom_foo_node_form() 
?> 

2. Используя собственную форму с drupal_execute()

Второй способ является более "чистым".
Код будет выглядеть как-то так:

<?php
function custom_foo() {
return drupal_get_form('custom_foo_form');
}
function custom_foo_form() {
$form['title'] = array(
'#type'  => 'textfield',
'#title' => 'foo',
);
$form['taxonomy'] = taxonomy_form(1);
$form['submit'] = array(
'#type'  => 'submit',
'#value' => 'Foo',
);
return $form;
}
function custom_foo_form_submit($form_id, $form) {
global $user;
$form_id = 'foo_node_form';
$node = array(
'uid'  => $user->uid,
'name' => $user->name,
'type' => 'foo',
);
$form_values = array(
'title'    => $form['title'],
'name'     => $user->name,
'taxonomy' => $form['taxonomy'],
);
watchdog('debug', 'Saving foo from mini node form');
drupal_execute($form_id, $form_values, $node);
} 
?>

Примечание: у этого типа материала нет body, но конечно можно его туда легко добавить.
Теперь нужно добавить вывод самой формы. Лучше всего в блок файла темы *.tpl.php:

<?php 
print custom_foo()
 ?> 

Источник: _http://2bits.com/articles/creating-nodes-using-mini-forms-anywhere.html

Комментариев нет

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

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Enter the characters shown in the image.