xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Пример редиректа на страницу 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
Похожие записи

Комментарии RSS

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

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

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

а как сделать редирект после изменения комментария? например у меня для вывода ноды используется ссылка на термин таксономии, и хотелось чтобы после изменения коментария (при нажатии на кнопку "сохранить") открылась страница с которой было инициирование изменение комментария. сейчас при нажатии кнопки "сохранить" редиректит на ноду. почему так - просто создал отображение во 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_...;

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

подскажите, а куда этот код необходимо вставить?

http://xandeadx.ru/blog/drupal/256

подойдет ли это решение для drupal 6.22?

да

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

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

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

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

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

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

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

$form_states['redirect'='/страница';
drupal_set_title('Новый тайтл');

никак

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

передавайте в GET

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

$_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) {...}. Как её переписать?

custom_ВОТ_ТУТ_НЕ_ПОЙМУ -> custom_...

)) А вот где $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';

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

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

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

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

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

function mymodule_form_article_node_form_alter(&$form) {
  $form['#action'].= '?destination=my/super/page';
}

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

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

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

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

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

http://xandeadx.ru/blog/drupal/628
hook_node_insert($node)
Реагирует на создание нового узла.

Drupal 6 Бы.

Спасибочки!!

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

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

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

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

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

Решение без кода
https://www.drupal.org/project/node_save_redirect

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании