タブメニューのURLパラメータとページコールバックを正しく使用する方法


7

Drupal 6を使用していて、/ vehicle_infoというURLを持つページに2つのタブ(メニュー)を表示しようとしています。タブがリンクしている両方のページは、パラメーターとしてノードのnidを取る必要があります。私の現在のコードは次のようになります:

  $items['vehicle_info/%/basic'] = array(
    'title' => t('Basic & Bookings'),
    'page arguments' => array(1),
    'access callback' => 'user_access',
    'access arguments' => array('administer fleet'),
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => 10
   );
  $items['vehicle_info/%/history'] = array(
    'title' => t('Service history'),
    'page callback' => 'vehicle_service_history',
    'page arguments' => array(1),
    'access arguments' => array('administer fleet'),
    'type' => MENU_LOCAL_TASK,
    'weight' => 20
   );

私は2つの問題に遭遇しています:

  1. 「サービス履歴」タブでは、「vehicle_service_history」ページ(実際にはVehicle_service_historyというURLを持つビュー)は開きません。存在しないURL「vehicle_info / 123 / history」のページを開きます(123は現在のnidを表します)。
  2. デフォルトのタブ「Basic&Bookings」はURL「vehicle_info / 123」にリンクせず、「vehicle_info」にのみリンクします。

何が欠けていますか?

回答:


0

ここにはいくつか欠けているものがあります。主な混乱は、URLではなく関数でpage callbackあるべきだと思われます。URLは配列のキーです。$items

  1. 最初のメニュー項目には「ページコールバック」がありません。親アイテムがある場合、これは親アイテム(として$items['vehicle_info/%']タイプされ、のタイプMENU_NORMAL_ITEM)から継承されますが、そうではありません。
  2. 2番目の項目メニューも、URLとコールバックを混同しているようです。ビューで処理したい場合は、ビューのページ表示でURLパスを処理する必要がありますvehicle_info/%/history。つまり、コンテキストフィルターがあります。あなたの見解はこのように機能しますか?

0

Vehiclesがパス 'vehicle_info'の下にあるコンテンツタイプの場合、これを大幅に簡略化できます。通常のコアタブを強化する

$items['node/%node/basic'] = array(
  'title' => t('Basic & Bookings'),
  'page arguments' => array(1),
  'access callback' => 'vehicle_administer_fleet',
  'access arguments' => array(1),
  'type' => MENU_LOCAL_TASK,
  'weight' => 10
);
$items['node/%node/history'] = array(
  'title' => t('Service history'),
  'page callback' => 'vehicle_service_history',
  'page arguments' => array(1),
  'access callback' => 'vehicle_administer_fleet',
  'access arguments' => array(1),
  'type' => MENU_LOCAL_TASK,
  'weight' => 20
);

また、カスタムアクセスコールバックを定義する必要があります。

function vehicle_administer_fleet($node) {
  return $node->type == 'vehicle' && user_access('administer fleet');
}

これは、それ自身のノードタブに対してdrupalコアが行うことであり、多くの場合そうではありません。一貫性を保つことが最善です。


ありがとう、試してみたいのですが、「車両がパス 'vehicle_info'の下にあるコンテンツタイプの場合」の意味がわかりません。コンテンツタイプがパスの下にあることをどのように設定できますか?
drumming_cat

0

あなたは間違った道を行きました!!!
ビューを使用して、完全に目的を達成できます。

ビューを作成し、必要に応じてフィールドを追加し、ページのURLをに設定します。node/*/basicビューのメニューセクション(ページのURLの下)で、タイトルの付いたメニュータブを選択します(ビューのあるメニュータブの作成の詳細については、こちら参照してください)。また、[ アクセス]セクションでは、ビューによって作成されたこのページを表示できるユーザーを選択できます。

私はあなたがビューが本当にどれほど強力であるかを本当に知らないと思います;)。

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