Форма добавления материала с минимальным набором полей

Главные вкладки

Аватар пользователя talgar@drupal.org talgar@drupal.org 4 октября 2010 в 13:23

Какими модулями можно решить следующую задачу:

Надо поднять (например в модальном окне) форму добавления материала определенного типа. При этом для заполнения показать только нужные поля, т.е. не показывать все.
Для примера. Есть тип материала "Клиент". В нем множество полей CCK (различные характеристики). Надо поднять форму добавления, где пользователь должен будет заполнить всего 2-3 CCK поля. Остальные поля он потом может при необходимости отредактировать.

Комментарии

Аватар пользователя Vladimir_VVV Vladimir_VVV 4 октября 2010 в 18:22

нах хук?
можно просто вручную получить данные из любой самодельной формы и записать их через node_save(). Я бы так поступил а не хукил всю форму.

<?php
global $user;// текущий юзер

$new_node = new StdClass();
$new_node->title=$_POST['title'];
$new_node->teaser=$_POST['text'];
$new_node->body=$_POST['text'];
$new_node->taxonomy = array($_POST['term_id']);// таксономия

// далее служебные данные

$new_node->uid $user->uid;
$new_node->name $user->name;
$new_node->status=1;// Опубликовано
$new_node->promote=0;// На главную
$new_node->sticky 0;// Прилеплена
$new_node->type='my_fucking_node'// Тип ноды
$new_node->language 'ru';//язык
//$new_node->format = 1;//Формат ввода Filtred Html
$new_node->format 2;//Формат ввода Full Html
$new_node->created=time();// время создания
$new_node->changed=time();// время обновления
$new_node->validated TRUE;// типа проверенная, вродек как очень обязательная, 
            //а то CCK поля не запишутся простым node_save, нужно будет делать submit

//заполнение полей ноды 

$new_node->field_firma = array(=> array('nid' => $_POST['node_id']));// страница фирмы номер ноды для нодреференса
$new_node->field_director = array(=> array('value' => $_POST['FIO']));// директор текстовое CCK поле

node_save(&$new_node);// Сохранение ноды
?>

Надеюсь все поняли что это пример, и что пихать в ноду не проверенные данные из POST неразумно.

Аватар пользователя jsv jsv 4 октября 2010 в 21:50

И что, пробовал такой вариант и сработало? Или теоретический свист?
PS Действительно, скрыть несколько полей через unset элемента массива $form намного сложнее, чем писать весь этот бред, непонятно ещё в каком месте.

Аватар пользователя Vladimir_VVV Vladimir_VVV 4 октября 2010 в 23:23

"jsv" wrote:
И что, пробовал такой вариант и сработало? Или теоретический свист?
PS Действительно, скрыть несколько полей через unset элемента массива $form намного сложнее, чем писать весь этот бред, непонятно ещё в каком месте.

Я не думаю что у Вас есть желание со мной поспорить но все-же:
На задачу нужно смотреть комплексно, а не с чьей либо колокольни. Я же понимаю что после ансета в формальтере, последует вопрос "а как мне эту самую форму с анситиными полями вывести яваскриптом или во флеш с всплывающим банером". Так вот что бы этого вопроса не было, человек, который не знает апи drupal (а если вчитаться в вопрос он апи точно не знает) создает обычную форму с пост запросом на том на чем может и отсылает по сабмиту в супурпуперимяфайла.php в котором в начале прописано

<?php
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>

а далее то что я привел + личные исправления. Приведеный код создает ноду из данных пришедших пост-запросом из любой внешней формы ( вот здесь Вы можете почитать о суперглобальном массиве $_POST) в которой предварительно настроены cck поля.
Я понял что Вам сложно разобраться в 30-ти строчках простого кода, поэтому расшифрую(хотя в коде есть каменты)
В случае кода указанного выше тип материала должен 'my_fucking_node', поля должны быть: 'field_firma' типа nodereference(ссылается на страницу фирмы), 'field_director' текстовое поле можно типа текстовое поле, можно текстовую строку.

Аватар пользователя jsv jsv 5 октября 2010 в 11:32

"Vladimir_VVV" wrote:
Приведеный код создает ноду из данных пришедших пост-запросом из любой внешней формы ( вот здесь Вы можете почитать о суперглобальном массиве $_POST) в которой предварительно настроены cck поля.

Хамить не надо, сам-то код откуда-то скопипастил, судя по типу ноды. Я предложил нормальное решение в рамках CMS Drupal( а мы вообще то на сайте поддержки Друпала), а ты предложил костыль.
Что, если нода не такая простая? Если она входит в одну из групп Organic groups? А разные pathauto, разные настройки комментариев и публикации для разных типов данных? Auto Nodetitle и другие подобные радости? Всё ручками в скрипте вместо стандартных средств Друпала делать? А если типов данных штук 20 с разными настройками? 20 скриптиков или ещё скрытое поле в форме делать с типом данных?
PS Не надо тут пальцы растопыривать и строить из себя специалиста.

Аватар пользователя jsv jsv 5 октября 2010 в 11:29

"Vladimir_VVV" wrote:
Я же понимаю что после ансета в формальтере, последует вопрос "а как мне эту самую форму с анситиными полями вывести яваскриптом или во флеш с всплывающим банером". Так вот что бы этого вопроса не было, человек, который не знает апи drupal (а если вчитаться в вопрос он апи точно не знает) создает обычную форму с пост запросом на том на чем может и отсылает по сабмиту в супурпуперимяфайла.php в котором в начале прописано

И что мешает создать самописную форму и направить его на Друпал стандартными средствами темизации формы? Или не знаешь API Drupal и как это делать? Для чего тут городить огород отдельным скриптом?

Аватар пользователя Vladimir_VVV Vladimir_VVV 5 октября 2010 в 15:57

"jsv" wrote:
ам-то код откуда-то скопипастил, судя по типу ноды.

Я специализируюсь на парсерах, так что код скопипастил из одного из своего парсера.

Вы как я понял не читаете пост топикстартера. Там написано что полей очень много, поэтому ансетить поля это больше кода чем у меня, да еще к тому же для вывода формы в окне а не на node/add придется вставить drupal_get_form в какой нибудь файл шаблона или функцию, поэтому я и предложил путь более простой.

Аватар пользователя talgar@drupal.org talgar@drupal.org 6 октября 2010 в 9:14

всем спасибо за предложенные варианты. хотелось решить задачу без программирования.
Получилось!

1. Ставим модуль modalframe. Он позволяет поднимать аяковские модальные окна.
2. Ставим Automodal. Позволяет ссылки загружать в модальном окне. В ссылку достаточно добавить название класса "automodal":
<a href="http://example.com" class="automodal">Click me!</a>
3. И самый нужный мне модуль ModalFrame Exclude From Node
Он позволяет для форм редактирования и создания материала, которые будут отображаться в модальном окне, спрятать ненужные элементы (меню, ревизия и т.д.) материала и CCK поля.

Получается просто отлично. А то пользователям показывается очень много информации для заполнения. А для быстрого создания объекта необходимо всего пару полей. Потом пользователь может дополнить необходимые поля.