Truyền đối số bằng hook_menu


7

Tôi sẽ xây dựng một màn hình xác nhận. Vì vậy, tôi đã khởi tạo đường dẫn theo đúng hook_menunhư vậy nhưng vì một số lý do, đối số $nodekhông được gửi với hàm ... Tôi đang làm gì sai?

Đây là của tôi hook_menu:

$items['node/%/revisions/%/offline'] = array(
      'title' => 'Offline,
      'description' => 'Confirm the action "Fiche offline".',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('_mymodule_confirm_offline'),
      'type' => MENU_LOCAL_TASK,
      'weight' => -4,
    ); 
    return $items;

Và đây là chức năng của tôi:

function _redactie_omgeving_confirm_offline($form, $form_state, $node) {
    $question = t('Take fiche offline. ');

    return confirm_form($form,
                    $question,
                    'node/7', t('You\'re about to depublish this fiche. <br />Are you sure you want to depublish this fiche?'),
                    t('Yes'), t('Cancel'));
}

Nhưng $nodechức năng có thể thay đổi trong chức năng của tôi vẫn trống ... Tôi phải làm gì để điền vào biến này?

Câu trả lời:


13

Gọi lại trang của bạn là drupal_get_form, và đối số trang của bạn là _mymodule_confirm_offline, do đó, cuộc gọi mà Drupal thực hiện là drupal_get_form('_mymodule_confirm_offline');, dường như không phải là điều bạn muốn làm.

Những gì bạn cần là một cuộc gọi lại tùy chỉnh thay thế.

Trong hook_menu:

'page callback' => '_confirmation_form_page',
'page arguments' => array(1, 3),

Và sau đó

function _confirmation_form_page($node) {
  $question = t('Take fiche offline. ');

  return confirm_form($form, $question, 'node/' . $node->nid, t('You\'re about to depublish this fiche. <br />Are you sure you want to depublish this fiche?'), t('Yes'), t('Cancel'));
}

Để "tự động tải" một đối tượng từ url, nó cần được đặt tên , nếu không, Drupal không thể biết cách thực hiện tải. Trên một url như "node /% nid", đối số được đặt tên là "nid". Trong thực tế, đối số thường được gọi là nút%, nhưng tôi muốn phân biệt các phần. Sau đó, Drupal sẽ tìm kiếm một hàm gọi là load_nid, chuyển số từ URL vào và hàm này chịu trách nhiệm trả về đối tượng được tải đầy đủ. Core có chức năng "load_node", do đó, các đối số có tên% nút sẽ được tự động tải mà không cần nỗ lực thêm từ phía bạn.

Để thêm tự động tải vào cuộc gọi lại của bạn sau đó, bạn cần

$items['node/%node/revisions/%/offline'] = array(

Tuy nhiên, điều này vẫn sẽ chỉ cung cấp cho bạn nút đúng chứ không phải sửa đổi đúng. node_load () hỗ trợ một đối số thứ hai $vid, mà chúng ta cần sử dụng để có được bản sửa đổi phù hợp. Nói với Drupal để truyền thêm các đối số được sử dụng cùng với load argumentskhóa và chúng ta cần sử dụng đối số thứ tư từ url node/%node/revision/%/offlinecho việc này.

Vì vậy, kết luận, việc thực hiện hook_menu trở thành:

$items['node/%node/revisions/%/offline'] = array(
  'title' => 'Offline',
  'description' => 'Confirm the action "Fiche offline".',
  'page callback' => '_confirmation_form_page',
  'page arguments' => array(1),
  'load arguments' => array(3),
);
return $items;

1
Được rồi cảm ơn! Và 1 và 3 là gì? Tôi có thể thêm bao nhiêu mục tôi muốn không?
Michiel

2
1 và 3 tương ứng với các đối số trong 'nút /% / phiên bản /% / ngoại tuyến', với 'nút' là 0. Điều này khiến nội dung của hai% được truyền vào cuộc gọi lại của bạn.
Letharion

Tuyệt! Tôi đang học :) Làm thế nào để tôi có được một biến của trang trước trong các đối số (giả sử $node)
Michiel

1
Cập nhật thứ hai, thêm thông tin tự động tải.
Letharion

1
Wow, hơn một năm sau tôi vô tình quay lại. Tôi đã cập nhật mã bây giờ.
Letharion

0

hook_menu không lấy đối tượng nút $ làm tham số. Nút trong 'nút /% / phiên bản /% / ngoại tuyến' chỉ là một đường dẫn mà nó không phải là bất kỳ nút nào.

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.