есть материал, в hook_form_alter добавляю свою функцию в сабмиты формы:
if ($form_id == 'my_material_node_form') {
$form['#submit'][] = '_my_modul_form_alter_submit';
}
}
}
в сабмите добавляю редирект (надеюсь, что после сабмита произойдет редирект..)
хочу чтобы после сохранения материала, браузер прокрутил экран на нужный мне якорь..
но редиректа не происходит =/
добавленный субмит точно выполняется.
после сохранения открывается страница: 'node/' . $form['nid']['#value'].
пробовал редиректить:
$form_state['redirect'] = array('test');
так же открывается страница материала..
как можно проверить в чем засада? вроде веть всё как надо делаю?
Комментарии
Ну как бы это сказать, не будет там редиректа, сделайте так
...
$form['actions']['submit']['#submit'] = array('my_node_form_submit');
...
}
// function copy from node_form_submit
function my_node_form_submit($form, &$form_state) {
module_load_include('inc', 'node', 'node.pages'); // add
...
//rewrite this ! -> $form_state['redirect'] = 'node/' . $node->nid;
...
}
но веть после етого:
$form['actions']['submit']['#submit'] = array('my_node_form_submit');
затрётся штатный субмит..
и не сохраняются изменения которые сделаны в ноде.
а когда делаю так:
$form['actions']['submit']['#submit'][] = array('my_node_form_submit');
ошибка =/
Код работает на рабочих сайтах.
Не затрётся - Вы его скопировали в свою функцию полностью - прочтите внимательно первый ответ.
Первый раз вижу, чтобы значение редиректа было массивом
Не
$form_state['redirect'] = array('node/' . $form['nid']['#value'], array('fragment' => 'calendar'));
а
$form_state['redirect'] = 'node/123';
Это не так, см. например node.pages.inc -> node_form_delete_submit
гм, точно. ещё один прикол друпала
вот такой код, если я Вас правильно понял, должен
и изменения в ноде сохранить,
и редирект после нажатия кнопки субмит сделать:
$form['actions']['submit']['#submit'] = array('_my_modul_node_form_submit');
}
function _my_modul_node_form_submit($form, &$form_state) {
module_load_include('inc', 'node', 'node.pages'); // add
$form_state['redirect'] = array('test');
}
редирект происходит, но изменения не сохраняются..=/
всё понял надо было так:
$form['actions']['submit']['#submit'][] = '_my_modul_node_form_submit';
}
function _my_modul_node_form_submit($form, &$form_state) {
module_load_include('inc', 'node', 'node.pages'); // add
$form_state['redirect'] = array('test');
}
так работает
Вы же скопировали функцию node_form_submit в нее, а потом добавили
module_load_include('inc', 'node', 'node.pages'); // add
и изменили
$form_state['redirect'] = 'node/' . $node->nid;
?
Иначе, как Вы в тему заметили
мм..
когда я делал так:
я "затирал" стандартный обработчик сохранения формы: node_form_submit,
и сохранения данных формы не выполнялось,
даже не смотря на подключение инклюда: module_load_include('inc', 'node', 'node.pages');
когда же я сделал так:
я просто добавил свой доп. обработчик субмита в "конец очереди" субмитов формы..
и после нажатия кнопки, выполнился стандартный обработчик, а затем тот, что добавил я.
я думаю в этом было дело.
Благодарю Вас за то, что помогли найти решение.
Пожалуйста
А вот если в таком случае
<?php
function tour_operator_form_submit($form, $form_state) {
/**
* Тут я делаю свою функцию отправки
*/ и хочу сделать $form_state['redirect'] = 'node/'. $node->nid;
}
?>То как быть?
Я так понимаю когда делаешь hook_form_alter и там прописываешь свою функцию отправки, и в этой функции вставляешь код отправки из модуля node, то он работает не так!?
<?php
$node = node_form_submit_build_node($form, $form_state);
function node_form_submit($form, &$form_state) {
global $user;
$insert = empty($node->nid);
node_save($node);
$node_link = l(t('view'), 'node/'. $node->nid);
$watchdog_args = array('@type' => $node->type, '%title' => $node->title);
$t_args = array('@type' => node_get_types('name', $node), '%title' => $node->title);
if (
$insert) {watchdog('content', '@type: added %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
drupal_set_message(t('@type %title has been created.', $t_args));
}
else {
watchdog('content', '@type: updated %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
drupal_set_message(t('@type %title has been updated.', $t_args));
}
if ($node->nid) {
unset($form_state['rebuild']);
$form_state['nid'] = $node->nid;
$form_state['redirect'] = 'node/'. $node->nid;
}
else {
// In the unlikely case something went wrong on save, the node will be
// rebuilt and node form redisplayed the same way as in preview.
drupal_set_message(t('The post could not be saved.'), 'error');
}
}
?>
Он работает так как написали но надо include еще не забыть и этого можно не делать, если Вы например не хотите убрать из него drupal_set_message(), аможно просто дописать в submit [] свою функцию, которая и будет менять redirect
Я как раз делаю свою функцию (копирую и подправляю из node.pages.inc) что бы выводить свои drupal_set_message
Но вот этот кусочек не работает
<?php
if ($node->nid) {
unset($form_state['rebuild']);
$form_state['nid'] = $node->nid;
$form_state['redirect'] = 'node/'. $node->nid;
}
?>
Не знаю как насчет кусочков но когда делаешь, то функция замещена полностью
<?php
// function copy from node_form_submit
function my_node_form_submit($form, &$form_state) {
module_load_include('inc', 'node', 'node.pages'); // add
...
}
?>
module_load_include('inc', 'node', 'node.pages'); - просто вставляешь функцию.
А я вставляю сам код функцию, и правлю его.
В той функции есть
<?php
unset($form_state['rebuild']);
$form_state['nid'] = $node->nid;
$form_state['redirect'] = 'node/'. $node->nid;
?>
Но это не работает.
Я нашел drupal_form_redirect(). С ним все редиректистя.
Но не знаю, зачем там unset($form_state['rebuild']);
Я даже не знаю откуда Вы его взяли ...
Ну как?
node.pages.inc, функция node_form_submit
В конце функции есть строчки, rebuild и redirect. Так вот я могу понять, зачем там отмена ребилдинга?
Убейте меня веником, мы в один код смотрим ?
<?php
function node_form_submit($form, &$form_state) {
$node = node_form_submit_build_node($form, $form_state);
$insert = empty($node->nid);
node_save($node);
$node_link = l(t('view'), 'node/' . $node->nid);
$watchdog_args = array('@type' => $node->type, '%title' => $node->title);
$t_args = array('@type' => node_type_get_name($node), '%title' => $node->title);
if (
$insert) {watchdog('content', '@type: added %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
drupal_set_message(t('@type %title has been created.', $t_args));
}
else {
watchdog('content', '@type: updated %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
drupal_set_message(t('@type %title has been updated.', $t_args));
}
if ($node->nid) {
$form_state['values']['nid'] = $node->nid;
$form_state['nid'] = $node->nid;
$form_state['redirect'] = 'node/' . $node->nid;
}
else {
// In the unlikely case something went wrong on save, the node will be
// rebuilt and node form redisplayed the same way as in preview.
drupal_set_message(t('The post could not be saved.'), 'error');
$form_state['rebuild'] = TRUE;
}
// Clear the page and block caches.
cache_clear_all();
}?>
Не убивайте, Вы явно смотрите в D6
Я забыл подписать что это d6