Редирект на предыдущую страницу

Для того, чтобы после заполнения формы перейти на заданную страницу, в интернете предлагается несколько вариантов. Самый простой вариант - если целевая страница имеет статический адрес. В этом случае можно воспользоваться Rules, но у него есть проблемы с Overlay (см. здесь). Используем хук hook_form_alter(). Например:
<?php
function custom_form_alter(&$form, $form_state, $form_id) {
  switch (
$form_id) {
    case
'contact_mail_page':
       
$form['#redirect'] = 'your-page';
      break;
  }
}
?>
взято отсюда. Немного посложнее, с использование обработчика отправки формы:
<?php
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if (
$form_id == 'my_form') {
    
$form['#submit'][] = 'my_submit_handler';
  }
}

function
my_submit_handler(&$form, &$form_state) {
 
$form_state['redirect'] = 'home';
}
?>
отсюда. Сложнее, если нужно вернуться на предыдущую страницу, которая формируется динамически. Базовым здесь является использование глобальной переменной $_SERVER['HTTP_REFERER'], которая возвращает адрес страницы, с которой пользователь попал на текущую страницу. Проблема в том, при прямой подстановке этой переменной в обработчик отправки формы предыдущим адресом становится страница заполнения формы. Т.о., возникает необходимость сохранять значения $_SERVER['HTTP_REFERER'] за несколько последних шагов (заполнение-отправка формы). Для этого можно использовать несколько подходов: хранение в сессии, куках или в скрытом поле формы, которое специально для этого создается. Например:
<?php
function mymodule_form_alter(&$form, &$form_state, $form_id){
   if(
$need_to_redirect){
       
/*add a form field to the form, you could also add this value to a
              session or cookie,but if the user is logged in/out based on this
              action the session will be rebuilt*/
       
$form['my_redirect']=array(
           
'#type' => 'hidden',
           
'#value'=>isset($form_state['post']['my_redirect'])?$form_state['post']['my_redirect']:trim(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH),'/')
        );
   }
   if(isset(
$form_state['post']['my_redirect'])){
       
/*if there is a redirect set for the form add an extra submit handler,
               this ensures that in cases like a node form our redirect will get
               set last*/
       
$form['#submit'][]='my_custom_redirect';
       
//unset this so it doesn't override our custom redirect
       
if(isset($form['#redirect'])) unset($form['#redirect']);
    }
}
function
my_custom_redirect($form,&$form_state){
   
$router_item = menu_get_item($form_state['values']['my_redirect']);
   
//make sure the user has access to this menu item, if not just ignore it
   
if ($router_item && $router_item['access']) {
       
$form_state['redirect']=$form_state['values']['my_redirect'];
    }
}
?>
взято отсюда. Данный код мне удалось запустить только после нескольких правок, но он также возвращал адрес на страницу редактирования формы. В итоге необходимый функционал реализовал через сессии:
<?php
function page_redirect_back_form_alter(&$form, &$form_state, $form_id){
 
       if (
$form['#form_id'] == 'content_node_form') {
       
$_SESSION['mycount'][] = $_SERVER['HTTP_REFERER'];  // записываем предысторию для текущей страницы в массив      
       
$form['actions']['submit']['#submit'][]='page_redirect_back_form_submit';        // по отправке формы вызываем функцию
       
if(isset($form['#redirect'])) unset($form['#redirect']);  // если редирект уже есть в форме, удаляем его, чтобы не перекрывал данный редирект
      

};

function
page_redirect_back_form_submit($form,&$form_state){
    
$back_url_array=$_SESSION['mycount'];  // получаем массив ссылок на предыдущие страницы
    
$j=count($back_url_array); // количество элементов в массиве
    
$form_state['redirect']=$back_url_array[$j-2]; // делаем редирект на предыдущую страницц (-2, т.к. массив начинается с 0, а счетчик сессий с 1)
    
$_SESSION['mycount']=array(); // обнуляем массив ссылок
}
?>
Upd. В рабочем варианте адрес предыдущей страницы сохраняется в отдельной переменной сессии, а не накапливается в массиве.
Несколько полезных ссылок по теме: хук form_alter()
Описание $form
Описание $form_state['redirect']