hook_menuを使用して引数を渡す


7

確認画面を作成します。だから私hook_menuはそれであるはずのパスを初期化しましたが、何らかの理由で、引数$nodeが関数と一緒に送信されていません...何が間違っていますか?

これは私の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;

そして、これは私の機能です:

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

しかし、$node関数内の-変数は空のままです...この変数を埋めるにはどうすればよいですか?

回答:


13

ページのコールバックはdrupal_get_formであり、ページの引数は_mymodule_confirm_offlineであるため、Drupalが行う呼び出しはdrupal_get_form('_mymodule_confirm_offline');です。

代わりにカスタムコールバックが必要です。

hook_menuで:

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

その後

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

URLからオブジェクトを「自動ロード」するには、オブジェクトに名前を付ける必要があります。そうしない、Drupalはロードの実行方法を認識できません。「node /%nid」のようなURLでは、引数は「nid」という名前になります。実際には、通常、引数は%nodeと呼ばれますが、私は部分を区別したかったのです。次に、Drupalはload_nidという関数を探し、URLから数値を渡します。この関数は、完全にロードされたオブジェクトを返します。コアには「load_node」関数があるため、%nodeという名前の引数は、ユーザーの手間をかけずに自動ロードされます。

コールバックにオートローディングを追加するには、以下が必要です

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

ただし、これは正しいノードではなく正しいリビジョンを提供します。node_load()$vid、正しいリビジョンを取得するために使用する必要がある2番目の引数をサポートしています。追加の引数を渡すようにDrupalに指示することはload argumentsキーで使用され、node/%node/revision/%/offlineこれにはURLから4番目の引数を使用する必要があります。

したがって、結論として、hook_menuの実装は次のようになります。

$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
わかりました、ありがとう!そして、1と3は何ですか?好きなだけアイテムを追加できますか?
ミシエル

2
1と3は「node /%/ revisions /%/ offline」の引数に対応し、「node」は0です。これにより、2つの%の内容がコールバックに渡されます。
Letharion 2012年

わかりました。私は学んでいます:)引数で前のページの変数を取得するにはどうすればよいでしょうか(たとえば、$node
Michiel

1
2番目の更新、オートローディング情報を追加。
Letharion 2012年

1
うわー、1年以上後に私が誤って戻ってきました。コードを更新しました。
Letharion 2013

0

hook_menuはパラメーターとして$ nodeオブジェクトを取得しません。「node /%/ revisions /%/ offline」のノードは単なるパスであり、ノードではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.