web-dev-qa-db-ja.com

hook_menuを使用して引数を渡す

確認画面を作成します。そのため、パスを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変数は空のままです...この変数を埋めるにはどうすればよいですか?

7
Michiel

ページコールバックは_drupal_get_form_であり、ページ引数は__mymodule_confirm_offline_であるため、呼び出しDrupal makeは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からオブジェクトを「自動ロード」するには、namedである必要があります。そうでない場合は、Drupal canロードの実行方法がわかりません。「node /%nid」のようなURLでは、引数は「nid」という名前になります。実際には、引数は通常%nodeと呼ばれますが、パーツを区別したいのです。Drupalは、load_nidという関数を探し、URLから数値を渡します。この関数は、完全にロードされたオブジェクトを返します。コアには「load_node」関数があるため、%nodeという名前の引数はあなたの側からのさらなる努力なしに自動ロードされます。

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

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

ただし、これは正しいノードではなく、正しいリビジョンを提供します。 node_load() は、正しいリビジョンを取得するために使用する必要がある2番目の引数_$vid_をサポートします。 Drupalに追加の引数を渡すように指示することは_load arguments_キーで使用されます。これには、URL _node/%node/revision/%/offline_の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;
_
13
Letharion

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

0
15dk51