Пользовательский редирект после отправки формы - PullRequest
9 голосов
/ 06 мая 2011

У меня есть форма, которая является блочной формой администрирования. Это стандартная форма, которую люди используют для редактирования содержимого блока, видимости и т. Д. Когда пользователь сохраняет форму, drupal перенаправляет пользователя на страницу администрирования блока.

Теперь я хочу перевести пользователя на другую страницу, например. домашняя страница, после отправки блочной формы администрирования. Есть несколько способов добиться этого, но drupal рекомендует использовать метод hook_alter_form, как описано здесь

Я написал .module файл с именем 'formdest', содержащий следующее:

function formdest_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'block-admin-configure':
    $form_state['redirect'] = '/home';
  break;
}
}

и сопровождающий его файл .info:

; $Id: custom.info,v 1.0 2011/01/01 21:55:00 author Exp $
name = formdest
description = form destination
package = Other
core = 6.x

version = "6.x"
project = "custom"
datestamp = "1229018427"

Мой пользовательский модуль отображается в списке модулей, и я могу включить его, активировав таким образом перенаправление. Но когда я проверяю его, drupal по-прежнему переносит меня на страницу администратора блока, а не на домашнюю страницу ..

Нет сообщений об ошибках ни в firebug, ни в системном журнале, поэтому я немного не в курсе. У кого-нибудь из вас, пишущих о богах, есть идеи?

Ответы [ 5 ]

22 голосов
/ 06 мая 2011

Добавьте обработчик отправки в hook_form_alter () и установите там переопределение.

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';
}
3 голосов
/ 13 сентября 2012

Это так же просто, как 1 2 3

  1. Создание пользовательской страницы с заголовком, т. Е. Спасибо за ваш связавшись с нами. Теперь перейдите к «Настройки пути URL» этой страницы и снимите флажок «Автоматический псевдоним» и введите URL своей страницы, т.е. слова благодарности.

  2. Удалите псевдонимы URL по умолчанию для веб-форм, т.е. [узел: заголовок] и сохраните настройки. Чтобы URL вашей страницы был site.com/thank-you

  3. Отредактируйте эту веб-форму -> Перейдите на вкладку Настройка формы, в разделе «Расположение перенаправления» задайте «Пользовательский URL» для вновь созданной страницы в шаге 1.

Наслаждайтесь!

1 голос
/ 04 августа 2012

Я боролся с выполнением динамического перенаправления в drupal 6, основываясь на том, откуда пришел пользователь, и вот что я придумал, надеюсь, это поможет кому-то еще:

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

Очевидно, $need_to_redirect следует заменить на переключатель или, если проверка, в зависимости от ваших form_alter предпочтений

0 голосов
/ 10 ноября 2015

В функции изменения формы, не используя $ form ['# submit'] [] = ..., вместо этого используя следующее:

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

См. https://www.drupal.org/node/1074616#comment-4218548

0 голосов
/ 10 сентября 2013

Что-то, что приводило меня в бешенство и даже раздражало меня в ответах каждого, это то, что использование form_alter для перенаправления ЗАМЕНИЛО действие отправки, а не просто ПРИНИМАЕТ мою новую функцию к нему.В моем случае (и совсем немного других тем, которые я читал), мне все еще нужно было выполнить действие формы.Я просто хотел перенаправить его куда-нибудь потом.Мое перенаправление работало нормально, но моя форма не отправлялась или данные не сохранялись.

Как только я вернулся и перечитал документацию form_alter, я понял, что $ form ['actions'] является массивом и поэтому можетпринять другие действия в его массив!Для всех, кто борется с этим, не используйте форму

$ ['actions'] ['submit'] ['# submit'] [] = 'myform_redirect_to_myfunction';

Вместопросто добавьте ваш обратный вызов в массив $ form, используя array_shift или array_unshift (в зависимости от того, в каком порядке вы хотите, чтобы функции выполнялись:

array_shift ($ form ['# submit'], 'myform_redirect_to_myfunction');

Надеюсь, это поможет кому-то еще.

...