Chuyển hướng đến một trang tùy chỉnh sau khi một nút đã được thêm hoặc chỉnh sửa


15

Sử dụng hook_form_alter, làm cách nào tôi có thể chuyển hướng người dùng đến một trang tùy chỉnh sau khi tạo hoặc chỉnh sửa nút thay vì nút được tạo hoặc chỉnh sửa?

Mã hiện tại cho hook_form_alter()là mã sau đây:

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

"Có một mô-đun cho điều đó": Node Destination ( drupal.org/project/node_destination ) nhưng nó chỉ có sẵn cho D6. Có lẽ nó có thể được thích nghi.
Benj

Câu trả lời:


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

Mã chuyển hướng biểu mẫu độc lập với nút được nhấp để gửi biểu mẫu. Nếu bạn muốn chuyển hướng một biểu mẫu chỉ khi nhấp vào nút gửi cụ thể, thì bạn nên sử dụng mã sau đây.

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

 

  • ID mẫu không chứa dấu gạch nối. ID biểu mẫu là tên của hàm PHP tạo biểu mẫu (còn gọi là trình tạo biểu mẫu) và hàm PHP không thể chứa dấu gạch nối trong tên của nó.
  • ID biểu mẫu được truyền cho các cài đặt của hook_form_alter () , hook_form_BASE_FORM_ID_alter ()hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()không thực sự cần nó, vì nó được gọi cho một hình thức cụ thể, trong khi hai móc còn lại được gọi nhiều hơn một hình thức.
  • Hàm đầu tiên là việc triển khai hook_form_BASE_FORM_ID_alter () ; trong trường hợp này, ID biểu mẫu cơ sở là "node_form" là biểu mẫu cơ sở cho biểu mẫu chỉnh sửa nút.
  • Biểu mẫu chỉnh sửa nút chứa $form['#node'], là đối tượng nút cho đối tượng được chỉnh sửa; "Tùy chỉnh" là ID ngắn cho loại nội dung bạn muốn chuyển hướng người dùng sau khi họ chỉnh sửa một nút.
  • Thay đổi $form_state['redirect']từ hook_form_alter()không có bất kỳ ảnh hưởng; nó cần phải được thiết lập từ một trình xử lý đệ trình.

Cảm ơn vì điều đó. Lưu ý rằng &trong function custom_node_submit($form, &$form_state) {rất quan trọng. Nếu không, bạn sẽ không chuyển trạng thái làm tài liệu tham khảo và các chỉnh sửa bạn thực hiện sẽ không ảnh hưởng.
Bram

9

Mã này hoạt động trên một trang web 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';
}

Câu trả lời nào bạn đang đề cập đến là số 4?
ЕЕннн

Tại sao điều này không làm việc cho tôi? Tôi đang sử dụng cùng một mã
ruby

Xóa bộ nhớ cache của bạn @ruby?
coderama 16/2/2015

Đối với các nút hiện có, bạn nên đảm bảo bỏ đặt đích trước, thường được thêm vào URL khi bạn nhấp vào nút chỉnh sửa trên admin/contenttrang: drupal.stackexchange.com/a/192271/15055 .
leymannx

4

Điều này có thể được thực hiện bằng cách cài đặt $form_state['redirect'], ví dụ sử dụng một trong các dòng sau.

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

Đó là những lý lẽ tương tự bạn sẽ vượt qua drupal_goto().


Cảm ơn bạn đã phản hồi @Shoaib Nawaz. Tôi đã thêm $ form_state ['redirect'] vào hook hook_form_alter mà không gặp may.
Citricguy

Đối với cuộc sống của tôi, tôi không thể có được $ form_state ['redirect'] để có hiệu lực ở bất cứ đâu.
Citricguy

Điều này sẽ không hoạt động nếu bạn cố gắng chuyển hướng sau khi một nút đã được thêm hoặc chỉnh sửa. Để xem lý do tại sao, hãy xem biểu mẫu nút gửi . Bất cứ giá trị nào bạn gán $form_state['redirect']sẽ được ghi đè nếu ($node->nid)đánh giá thành TRUE.
Cấp tiến miễn phí

2

Không chắc đây có phải là một tùy chọn cho bạn không, nhưng nếu đây là loại nội dung bạn có thể đạt được điều này khá nhanh bằng cách sử dụng mô-đun Quy tắc bằng cách đặt quy tắc được kích hoạt khi cập nhật hoặc tạo một loại nội dung nhất định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.