[РЕШЕНО] Почему может не работать $form_state['redirect']?

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

Аватар пользователя MasterDzen MasterDzen 12 ноября 2012 в 11:06

есть материал, в hook_form_alter добавляю свою функцию в сабмиты формы:

function my_modul_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'my_material_node_form') {
      $form['#submit'][] = '_my_modul_form_alter_submit';
  }
}
}

в сабмите добавляю редирект (надеюсь, что после сабмита произойдет редирект..)

function _my_modul_form_alter_submit($form, &$form_state) {
  $form_state['redirect'] = array('node/' . $form['nid']['#value'], array('fragment' => 'calendar'));
}

хочу чтобы после сохранения материала, браузер прокрутил экран на нужный мне якорь..
но редиректа не происходит =/

добавленный субмит точно выполняется.
после сохранения открывается страница: 'node/' . $form['nid']['#value'].

пробовал редиректить:
$form_state['redirect'] = array('test');
так же открывается страница материала..

как можно проверить в чем засада? вроде веть всё как надо делаю?

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 12 ноября 2012 в 12:10

Ну как бы это сказать, не будет там редиректа, сделайте так

function hook_form_alter(&$form, &$form_state, $form_id){
...
$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;
...
}
Аватар пользователя MasterDzen MasterDzen 12 ноября 2012 в 12:22

но веть после етого:
$form['actions']['submit']['#submit'] = array('my_node_form_submit');

затрётся штатный субмит..
и не сохраняются изменения которые сделаны в ноде.

а когда делаю так:
$form['actions']['submit']['#submit'][] = array('my_node_form_submit');

ошибка =/

Аватар пользователя sas@drupal.org sas@drupal.org 12 ноября 2012 в 22:14

"MasterDzen" wrote:
затрётся штатный субмит..

Код работает на рабочих сайтах.
Не затрётся - Вы его скопировали в свою функцию полностью - прочтите внимательно первый ответ.

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 12 ноября 2012 в 22:50

Первый раз вижу, чтобы значение редиректа было массивом

Не

$form_state['redirect'] = array('node/' . $form['nid']['#value'], array('fragment' => 'calendar'));

а

$form_state['redirect'] = 'node/123';

Аватар пользователя sas@drupal.org sas@drupal.org 12 ноября 2012 в 23:55

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
Первый раз вижу, чтобы значение редиректа было массивом

Это не так, см. например node.pages.inc -> node_form_delete_submit

Аватар пользователя MasterDzen MasterDzen 13 ноября 2012 в 8:28

вот такой код, если я Вас правильно понял, должен
и изменения в ноде сохранить,
и редирект после нажатия кнопки субмит сделать:

function my_modul_form_alter(&$form, &$form_state, $form_id) {
  $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');
}

редирект происходит, но изменения не сохраняются..=/

Аватар пользователя MasterDzen MasterDzen 13 ноября 2012 в 8:37

всё понял надо было так:

function my_modul_form_alter(&$form, &$form_state, $form_id) {
  $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');
}

так работает Smile

Аватар пользователя sas@drupal.org sas@drupal.org 13 ноября 2012 в 9:28

"MasterDzen" wrote:
_my_modul_node_form_submit

Вы же скопировали функцию node_form_submit в нее, а потом добавили
module_load_include('inc', 'node', 'node.pages'); // add
и изменили
$form_state['redirect'] = 'node/' . $node->nid;
?
Иначе, как Вы в тему заметили
"MasterDzen" wrote:
не сохраняются изменения которые сделаны в ноде

Аватар пользователя MasterDzen MasterDzen 13 ноября 2012 в 9:37

<a href="mailto:sas@drupal.org">sas@drupal.org</a> wrote:
"MasterDzen" wrote:
_my_modul_node_form_submit

Вы же скопировали функцию node_form_submit в нее, а потом добавили
module_load_include('inc', 'node', 'node.pages'); // add
и изменили
$form_state['redirect'] = 'node/' . $node->nid;
?
Иначе, как Вы в тему заметили
"MasterDzen" wrote:
не сохраняются изменения которые сделаны в ноде

мм..
когда я делал так:

$form['actions']['submit']['#submit'] = array('_my_modul_node_form_submit');

я "затирал" стандартный обработчик сохранения формы: node_form_submit,
и сохранения данных формы не выполнялось,
даже не смотря на подключение инклюда: module_load_include('inc', 'node', 'node.pages');

когда же я сделал так:

$form['actions']['submit']['#submit'][] = '_my_modul_node_form_submit';

я просто добавил свой доп. обработчик субмита в "конец очереди" субмитов формы..
и после нажатия кнопки, выполнился стандартный обработчик, а затем тот, что добавил я.

я думаю в этом было дело.

Благодарю Вас за то, что помогли найти решение.

Аватар пользователя Bezlepkin Bezlepkin 29 декабря 2012 в 23:12

А вот если в таком случае

<?php
function tour_operator_form_submit($form$form_state) {
/**
 * Тут я делаю свою функцию отправки
 */

и хочу сделать $form_state['redirect'] = 'node/'$node->nid;

}

?>

То как быть?

Аватар пользователя Bezlepkin Bezlepkin 29 декабря 2012 в 23:14

Я так понимаю когда делаешь hook_form_alter и там прописываешь свою функцию отправки, и в этой функции вставляешь код отправки из модуля node, то он работает не так!?

<?php
function node_form_submit($form, &$form_state) {
  global 
$user;

  

$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_get_types('name'$node), '%title' => $node->title);

  if (

$insert) {
    
watchdog('content''@type: added %title.'$watchdog_argsWATCHDOG_NOTICE$node_link);
    
drupal_set_message(t('@type %title has been created.'$t_args));
  }
  else {
    
watchdog('content''@type: updated %title.'$watchdog_argsWATCHDOG_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');
  }
}
?>
Аватар пользователя sas@drupal.org sas@drupal.org 29 декабря 2012 в 23:45

Bezlepkin wrote:
Я так понимаю когда делаешь hook_form_alter и там прописываешь свою функцию отправки, и в этой функции вставляешь код отправки из модуля node, то он работает не так!?

<?php
function node_form_submit($form, &$form_state) {
  global 
$user;

  

$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_get_types('name'$node), '%title' => $node->title);

  if (

$insert) {
    
watchdog('content''@type: added %title.'$watchdog_argsWATCHDOG_NOTICE$node_link);
    
drupal_set_message(t('@type %title has been created.'$t_args));
  }
  else {
    
watchdog('content''@type: updated %title.'$watchdog_argsWATCHDOG_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

Аватар пользователя Bezlepkin Bezlepkin 30 декабря 2012 в 1:40

Я как раз делаю свою функцию (копирую и подправляю из 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;
  }
?>
Аватар пользователя sas@drupal.org sas@drupal.org 30 декабря 2012 в 12:57

Не знаю как насчет кусочков но когда делаешь, то функция замещена полностью

<?php
// function copy from node_form_submit
function my_node_form_submit($form, &$form_state) {
module_load_include('inc''node''node.pages'); // add
...  
}
?>
Аватар пользователя Bezlepkin Bezlepkin 30 декабря 2012 в 15:07

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']);

Аватар пользователя sas@drupal.org sas@drupal.org 30 декабря 2012 в 17:06

Bezlepkin wrote:
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']);


Я даже не знаю откуда Вы его взяли ...

Аватар пользователя Bezlepkin Bezlepkin 30 декабря 2012 в 21:10

Ну как?
node.pages.inc, функция node_form_submit
В конце функции есть строчки, rebuild и redirect. Так вот я могу понять, зачем там отмена ребилдинга?

Аватар пользователя sas@drupal.org sas@drupal.org 10 ноября 2015 в 11:48

Убейте меня веником, мы в один код смотрим ?

<?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_argsWATCHDOG_NOTICE$node_link);
    
drupal_set_message(t('@type %title has been created.'$t_args));
  }
  else {
    
watchdog('content''@type: updated %title.'$watchdog_argsWATCHDOG_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