Перенаправлення на користувацьку сторінку після додавання чи редагування вузла


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

"Існує модуль для цього": призначення вузла ( drupal.org/project/node_destination ), але він доступний лише для D6. Можливо, це можна адаптувати.
Бендж

Відповіді:


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 не може містити дефісів у своєму імені.
  • Ідентифікатор форми передається реалізаціям_ук_форма_алтер () , гачок_форма_БАСЕ_FORM_ID_alter () та гачок_форма_FORM_ID_alter () . hook_form_FORM_ID_alter()Насправді це не потрібно, як це називається для конкретної форми, тоді як інші два гачки викликаються для більше однієї форми.
  • Перша функція - реалізація mock_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';
}

Яку відповідь ви називаєте №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().


Дякуємо за відгук @Shoaib Nawaz. Я додав $ form_state ['redirect'] до гака hoke_form_alter, не маючи удачі.
Citricguy

За все життя я не можу змусити $ form_state ['redirect'] вступити в дію ніде.
Citricguy

Це не спрацює, якщо ви спробуєте перенаправитись після додавання чи редагування вузла. Щоб дізнатись чому, подивіться надіслати форму вузла . Яке б значення ви не присвоїли, воно $form_state['redirect']буде перезаписано, якщо воно ($node->nid)буде істинно.
Безкоштовний радикал

2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.