Перенаправление на пользовательскую страницу после добавления или редактирования узла

15

Используя hook_form_alter, как я могу перенаправить пользователя на пользовательскую страницу после создания или редактирования узла вместо узла, который был создан или отредактирован?

Текущий код для hook_form_alter()следующий:

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}
Citricguy
источник
«Для этого есть модуль»: Node Destination ( drupal.org/project/node_destination ), но он доступен только для D6. Может быть, это может быть адаптировано.
Benj

Ответы:

16
function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

Код перенаправляет форму независимо от нажатой кнопки, чтобы отправить форму. Если вы хотите перенаправить форму только при нажатии определенной кнопки отправки, вам следует использовать следующий код.

function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

 

  • Идентификатор формы не содержит дефисов. Идентификатор формы - это имя функции PHP, которая генерирует форму (или построитель форм), и функция PHP не может содержать дефисов в своем имени.
  • Идентификатор формы передается реализациям hook_form_alter () , hook_form_BASE_FORM_ID_alter () и hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()в действительности это не нужно, так как он вызывается для конкретной формы, в то время как два других хука вызываются для более чем одной формы.
  • Первая функция - это реализация hook_form_BASE_FORM_ID_alter () ; в этом случае базовым идентификатором формы является «node_form», которая является базовой формой для формы редактирования узла.
  • Форма редактирования узла содержит $form['#node'], который является объектом узла для редактируемого объекта; «custom» - это короткий идентификатор типа контента, который вы хотите перенаправить пользователям, когда они редактируют узел.
  • Изменение $form_state['redirect']от hook_form_alter()не имеет никакого эффекта; это должно быть установлено из обработчика представления.
киамлалуно
источник
Спасибо за это. Обратите внимание , что &в function custom_node_submit($form, &$form_state) {это очень важно. В противном случае вы не передадите состояние в качестве ссылки, и внесенные вами изменения не окажут влияния.
Брэм
9

Этот код работает на сайте Drupal 7.

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}
sea26.2
источник
Какой ответ вы называете № 4?
Елин Й.
почему это не работает для меня? Я использую тот же код
ruby
Очистили кеш @ruby?
кодерама
Для существующих узлов лучше сначала отключить пункт назначения, который обычно добавляется к URL-адресу, когда вы нажимаете кнопку редактирования на admin/contentстранице: drupal.stackexchange.com/a/192271/15055 .
leymannx
4

Это можно сделать, установив $form_state['redirect'], например, одну из следующих строк.

$form_state['redirect'] = "some-internal-path";
$form_state['redirect'] = array($path, $options_array, $http_code);

Это те же аргументы, которые вы бы передали drupal_goto().

Шоаиб Наваз
источник
Спасибо за отзыв @ Шоаиб Наваз. Я добавил $ form_state ['redirect'] в хук hook_form_alter без удачи.
Citricguy
На всю жизнь я не могу заставить $ form_state ['redirect'] вступить в силу где-либо.
Citricguy
Это не будет работать, если вы попытаетесь перенаправить после того, как узел был добавлен или отредактирован. Чтобы понять почему, взгляните на форму отправки узла . Какое бы значение вы ни присвоили, оно $form_state['redirect']будет перезаписано, если значение равно ($node->nid)TRUE.
Свободное Радикальное
2

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

Аарон Ортега
источник