Добрый день. Есть форма добавления ноды, которая кроме админки, должна выводиться на главной странице сайта. Форма добавления в админке - стандартная, со всеми полями. Форма добавления на главной странице имеет только текстовое поле и кнопку сохранить(т.е. свой шаблон) + ко всему эта форма должна сабмитится аяксом.
Всё готово, всё хорошо, но только из-за:
<?php
function hook_theme()
{
return array(
'note_node_form' => array(
'arguments' => array('form' => NULL),
'template' => 'templates/page--node--add--note',
'render element' => 'form',
),
);
}
?>
получается так, что в админке такая же форма как на главной странице. Можно ли как-то указать что в админке стандартный шаблон, а на главной - другой?
Я пытался конечно проверять адрес страницы и ставить условие перед return, но всё это до одного места. По ходу всё кэшируется и срабатывает только после чистки кэша.
Комментарии
Если нужна простая форма из поля и кнопки - то проще ее создать своим модулем и вывести в блок, а в обработчике прописать создание ноды. Или можно сделать вообще без кодинга через Webform и Rules.
Ну я так и делал Свой модуль, выводит в блок.
Ну так в чём трабла то тогда?)) В сабмиттере своей формы пишешь node_save и будет тебе счастье.
Проблема в том что, открывая /node/add/note - я вижу такой же шаблон, как и в ноде для главной страницы. По /node/add/note должна открываться стандартная форма добавления с кучей полей для заполнения, а на главной - другой шаблон. Я не могу разграничить выбор шаблона, в этом вся проблема. Для данного типа нод, он один, хоть из админки вызвали или на главной нарисовано.
Это через hook_theme этого добились? Убирайте это.
Как я вижу решение задачи:
Свой модуль создаёт блок.
В блоке своя форма.
У формы свой обработчик.
Обработчик принимает поля формы, создаёт объект ноды и делает node_save($node);
Profit
Стандартная форма вообще не при делах.
А как я укажу для формы шаблон?
У меня через node_add() получается форма, уже с шаблоном который я указал выше.
Ради этого городить шаблон?
Можно через темизирующую функцию.
$form = drupal_get_form('custom_form');
$block['content'] = theme('render_custom_node_form', array('form' => $form));
//в модуле
function mymodule_theme($existing, $type, $theme, $path) {
$path = drupal_get_path('module', 'mymodule') . '/templates';
return array(
"render_custom_node_form" => array(
"template" => "page--node--add--note",
"path" => $path,
"arguments" => array('form'=> '')
)
);
}
Ну и по идее должно работать.
Ну это пока имеет только одно поле и эта штука будет масштабироваться.
За пример - спасибо, сейчас попробую.
Chyvakoff, ты крут, это решение меня спасло Огромное спасибо
Пожалуйста:)
Появилась проблема, не рисует
Че не рисует?
блин, не дописал сообщение , только элементы.
<form action="..."></form>
Не рисует форму.
//попробуй заменить на
$form = drupal_render(drupal_get_form('custom_form'));
В шаблоне print $form; ?
Форма вообще не отрисовывается никак?
Форма отрисовывается так:
в шаблоне
<?php
module_load_include('inc', 'node', 'node.pages');
echo drupal_render($form['messages']);
echo drupal_render($form['title']);
echo drupal_render($form['language']);
echo drupal_render($form['body']);
echo drupal_render($form['form_id']);
echo drupal_render($form['nid']);
echo drupal_render($form['uid']);
echo drupal_render($form['form_build_id']);
echo drupal_render($form['form_token']);
echo drupal_render($form['actions']);
?>
А drupal_render не подходит ибо форма передаётся в hook_theme.
Ты чё, каждый элемент формы отдельно рендеришь?
Почему drupal_render не подходит и как его hook_theme может ограничивать?
Тут в шаблон передаётся аргумент,типа string. В него можно положить уже отрендеренную форму. Можно хоть 10 отрендеренных вьюсов.
$module_path = drupal_get_path('module', 'mymodule') . '/templates';
return array(
'note_node_form' => array(
'render element' => 'form',
'template' => 'page--node--add--note',
'path' => $module_path,
)
);
}
Спасибо, всё получилось