Создание ноды с минимальным вводом
Цель: необходимо иметь мини-формы для создания конкретных типов узлов "на лету" из любого места на сайте. Вместо того, чтобы пользователь нажав кнопку "Создать материал", выбрать тип материала "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

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