Drupal → Как сделать редирект на определённый адрес после создания/сохранения ноды

01.04.2011

Пример редиректа на страницу my/super/page после добавления материала типа article:

Drupal 7:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_article_node_form_alter(&$form, &$form_state) {
  $form['actions']['submit']['#submit'][] = 'mymodule_article_node_form_submit';
}

/**
 * Custom article_node_form submit callback.
 */
function mymodule_article_node_form_submit($form, &$form_state) {
  $form_state['redirect'] = 'my/super/page';
}

Drupal 6:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_article_node_form_alter(&$form) {
  $form['buttons']['submit']['#submit'][] = 'mymodule_article_node_form_submit';
}

/**
 * Custom article_node_form submit callback.
 */
function mymodule_article_node_form_submit($form, &$form_state) {
  $form_state['redirect'] = 'my/super/page';
}
Написанное актуально для
Drupal 6, Drupal 7
Похожие записи

Комментарии

Гость
03.04.2011, 21:43

Здравствуйте. Хотелось бы узнать как сделать редирект на авторизацию перед созданием ноды если пользователь не авторизован. И после правильного введения логина и пароля чтобы открывался оверлей.

в hook_form_alter проверяете user_is_anonymous(), если true - делаете drupal_goto('user/login'). про оверлей не знаю

Гость
08.04.2011, 10:27

Спасибо это как раз то что мне было нужно :)

а как сделать редирект после изменения комментария? например у меня для вывода ноды используется ссылка на термин таксономии, и хотелось чтобы после изменения коментария (при нажатии на кнопку "сохранить") открылась страница с которой было инициирование изменение комментария. сейчас при нажатии кнопки "сохранить" редиректит на ноду. почему так - просто создал отображение во views именно по термину таксономии

заменить article_node_form на id соответствующей формы

это понятно, а как сюда передать url с которого нажали на изменение комментария, ведь редиректить придется на разные url? если на пальцах то сейчас происходит так: со страницы site.ru/taxonomy/term/234 нажимаем на ссылку редактирования камента site.ru/comment/edit/128 - открывается новая страница, где редактируем камент, жмем сохранить и происходит редирект на ноду site.ru/node/64 которая и содержит в себе комментарии. а в моем конкретном случае надо чтобы вернулось на site.ru/taxonomy/term/234. вообще, можно даже на .../234/#comment-128 - т.е. на ссылку, к которой и приписан сам камент.

$node = node_load($form_state['values']['nid']);
$form_state['redirect'] = 'taxonomy/term/' . $node->field_...;
smart_simpson
27.08.2011, 22:57

подскажите, а куда этот код необходимо вставить? и подойдет ли это решение для drupal 6.22? тоже задался вопросом по редиректу со страницы редактирования комментария...

Dmitry Pogodaev
19.02.2012, 19:22

А как сделать редирект на страницу с которой попали на страницу с формой?,

Владимир
28.03.2012, 07:59

Всем привет! Подскажите, а как изменить этот код, чтобы при создании материала Гостем шел редирект на одну страницу, а остальными - как обычно. Ну чтобы незарегистрированные юзеры могли создав материал (который не публикуется), перейти на страницу с надписью "Спасибо, бла-бла-бла". А когда тоже самое делает зарегеный юзер (из какой-либо роли), то ничего ему не подсовывается.

Подозреваю, что в коде необходимо делать проверку на роль.

Владимир
28.03.2012, 09:24

Уже сам догнал))

function mymodule_article_node_form_submit($form, &$form_state) {
global $user;
if (!($user->uid == '1' || in_array('Руководство',$user->roles))) {
$form_state['redirect'] = 'my/super/page';
}
}

И тогда если вы - администратор или ваш аккаунт находится в роли Руководство, то никакого редиректа не произойдет.

Но тут возникли мысли про эту функцию

function mymodule_form_article_node_form_alter(&$form) {
$form['actions']['submit']['#submit'][] = 'mymodule_article_node_form_submit';
}

Можно ли как-то проверить, что нода не просто сабмитится, а например, добавляется. Или сабмитится при редактировании. Или сабмитится при удалении.

Гость
14.08.2012, 14:10

Не подскажите как из формы установить тайтл для страницы, на которую идет редирект?

$form_states['redirect'='/страница';
drupal_set_title('Новый тайтл');
Гость
07.09.2012, 20:07

Подскажите, как передать nid ноды, с которой редиректится форма? Например для произвольной переменной $id на странице my/super/page.

Игорь
11.09.2012, 11:35

Не подскажите как из формы установить тайтл для страницы, на которую идет редирект?
Очень даже можно.
Через сессию.

$_SESSION['link_referer_title'] = 'Заголовок для страницы с редиректа формы';

# а на странице смотрим - можно добавить в тему или в хук view своего модуля ...

if($_SESSION['link_referer_title']) {
$title = $_SESSION['link_referer_title'];
unset($_SESSION['link_referer_title']);
}

А каким образом можно использовать это для модуля contact в Drupal 6?

То есть у меня

/**
 * Implements hook_form_FORM_ID_alter().
 */
function custom_form_contact_mail_user_alter(&$form) {
$form['buttons']['submit']['#submit'][] = 'custom_...';
}
function custom_ВОТ_ТУТ_НЕ_ПОЙМУ($form, &$form_state) {
  $form_state['redirect'] = "user/$account->uid/bal-bla";
  krumo($form);
}

в самом модуле contact за редирект отвечает function contact_mail_user_submit($form, &$form_state) {...}. Как её переписать?

)) А вот где $form['buttons']['submit']['#submit'][] = 'custom_...';
там надо писать custom_contact_mail_user_submit или id какой-то?

эх, что-то нифига не работает))
вот что было contact.pages.inc
http://pastebin.com/MxC8pznB
и
http://pastebin.com/19nn6d2F

А вот что написал я в своем модуле:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function custom_form_contact_mail_user_alter(&$form) {
$form['buttons']['submit']['#submit'][] = 'custom_mail_form_submit';
}
 
/**
 * Custom submit callback.
 */
function custom_mail_form_submit($form, &$form_state) {
  $form_state['redirect'] = 'some_url';
}

Как я понимаю, при нажатии на сабмит должен происходить редирект на 'some_url', а перекидует на "user/$account->uid"

Что я не так делаю? Где ошибка?

Может кому-то будет полезно.
Вот так заработало:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function custom_form_contact_mail_user_alter(&$form, $form_state, $form_id) {
    $form['#submit'][] = '_custom_submit';
}

/**
 * Custom submit callback.
 */
function _custom_submit($form, &$form_state) {
    $form_state['redirect'] = array('asfsf');
}
$form['submit']['#submit'][] = 'custom_mail_form_submit';
Алексей
23.01.2013, 23:53

Есть словарь таксономии.
Необходимо, чтобы при нажатии на термин, пользователь уходил на специально созданные страницы.
Подскажите, как это можно реализовать?

Игорь
24.01.2013, 10:21

Обычно термины таксономии и есть ссылки на специально созданные для терминов страницы: /taxonomy/term/93(tid) - что вы имеете ввиду? Честно говоря, мог этого и не писать, а полениться и оставить ваш вопрос без внимания (как xandeadx....)))). Задавая вопрос - старайтесь точно его сформулировать.

Алексей
24.01.2013, 10:24

Есть словарь терминов - название округов.
Для каждого округа создана своя страница. Необходимо, чтобы при нажатии на термин как раз не выкидывало на /taxonomy/term/93(tid), а созданную мной страницу.

Игорь
24.01.2013, 10:41

Возможно, нужно было при создании терминов - сразу же прописывать для них нужный алиас (синоним урл). Или сейчас для каждого изменить синоним.
В крайнем случае, в шаблоне темы node.tpl.php (или для конкретного типа) - изменить вывод ссылок на термины. Это можно и в template.php в препроцессе_node...

Роман
10.02.2013, 16:10

Скажите, а такое решение не подойдет ?

function mymodule_form_article_node_form_alter(&$form) {
  $form['#action'].= '?destination=my/super/page';
}
Роман
10.02.2013, 16:20

Кстати, попробовал Вашим способом сделать редирект после логина на нужную страницу - почему-то не получилось

function yrv_util_form_user_login_alter(&$form, &$form_state, $form_id)
{
  $form['actions']['submit']['#submit'][] = '_yrv_util_user_login_form_submit';  
}

function _yrv_util_user_login_form_submit($form, &$form_state) {
  $form_state['redirect'] = 'admin/content';
}

Пишет, что доступ к странице запрещен - похоже, логин не проходит.

Гость
14.03.2013, 00:52

А как отличить создание ноды от редактирования ноды?

Нужно пересылать только при создании. Бы.

Гость
27.06.2013, 20:54

Здравствуйте! Спасибо за ваш пост. Я только начинаю друпалить, и вопрос у меня такой:
вот этот кусок кода куда надо вставить? или надо модуль свой создать?

Спасибо заранее!

Игорь
28.06.2013, 12:22

function mymodule - это значит что модуль так называется - mymodule - то есть надо свой модуль сделать.
Свой подобный модуль почти у каждого друпалера на каждом сайте.
Это удобно, чтобы внедряться в хуки (функции, крючки...) изменять всё что угодно и делать(выводить) всё что хочется.

Андрей
30.01.2014, 19:30

Добрый вечер!
Как сделать чтобы редирект сработал только при правильном заполнении формы?

function ТЕМА_form_user_profile_form_alter(&$form, &$form_state, $form_id) {

	$form['actions']['submit']['#submit'][] = 'ТЕМА_form_user_profile_form_submit';

};
function ТЕМА_form_user_profile_form_submit($form, &$form_state) {

	$form_state['redirect'] = 'page/16';

}

Добавить комментарий