web-dev-qa-db-ja.com

メニューに追加情報を追加するにはどうすればよいですか?

標準のメニューモジュール(Drupal 6、BTW)で管理されているメニューがいくつかあります。 CSSを介して「新しい」バナーの表示を制御するためにメニュー項目を編集しているときにチェックボックスを追加したい(チェックボックスがオンになっている項目のクラスを追加することにより)。

次のようなフォームにチェックボックスを入れることができます:

_function mymodule_form_menu_edit_item_alter(&$form, &$form_state) {
  $form['menu']['newbanner'] = array(
    '#title' => 'New banner',
    '#type' => 'checkboxes',
    '#description' => "Add a 'New' banner to this item?",
    '#options' => array( 'new_banner' => t("This item is new") )
    );
}
_

しかし、チェックボックスの状態を実際に保存して使用する方法がよくわかりません。 mymodule_form_menu_edit_item_submit()関数を作成することから始めたいと思いますか?しかし、どのようにしてデータベースから情報を取得し、それを使用して、フロントエンドの生成されたメニューにクラスを追加しますか?

3
Dougal Campbell

これまでに作成したコードは正しいです。保存された設定を取得するためのコードと、それを保存するためのコードを追加するだけです。

function mymodule_form_menu_edit_item_alter(&$form, &$form_state) {
  // Get the mlid ID of the menu item.
  $mlid = $form['menu']['mlid']['#value'];

  $form['menu']['newbanner'] = array(
    '#title' => 'New banner',
    '#type' => 'checkboxes',
    '#description' => "Add a 'New' banner to this item?",
    '#default_value' => variable_get("mymodule_newbanner_$mlid", 0),
    '#options' => array('new_banner' => t("This item is new")),
  );

  $form['#submit'][] = 'mymodule_menu_item_submit';
}

function mymodule_menu_item_submit($form, &$form_state) {
  $item = &$form_state['values']['menu'];
  // Get the last ID inserted in the table.
  if (empty($item['mlid'])) {
    $item['mlid'] = db_last_insert_id('menu_links', 'mlid');
  }

  variable_set('mymodule_newbanner_' . $item['mlid'], $item['newbanner']);
}

メニュー項目が最初に作成されるとき、mlidはゼロになる可能性があります。その場合、フォーム送信ハンドラーは、menu.moduleによって追加されたフォーム送信ハンドラーの後に実行されるため、テーブルから取得します。これは、メニュー項目を menu_link_save() を使用してテーブルに保存します。

3
kiamlaluno

行レベルのデータを変数テーブルに追加しないでください。変数テーブル全体がキャッシュされ、各ページにロードされ、各ページ要求のメモリフットプリントに追加されます。

この場合、保存されるメニュー項目ごとに変数が作成され、すぐに追加されます。この個別のケースでは、それほど多くのデータが追加されない場合がありますが、多くのモジュールが変数テーブルをデータダンプのグラウンドとして使用していたと想像してください。

一般的な経験則として、データに複数の行がある場合は、おそらく別のテーブルを使用する必要があります。

0
zroger

Menu attributes モジュールを確認することをお勧めします。

これにより、クラスやIDを含むメニュー項目にさまざまな追加の属性を設定できるようになります。これらの属性は、cssまたはjqueryでターゲットにできます。

このモジュールの詳細(プロジェクトページから):

この単純なモジュールを使用すると、id、name、class、style、relなどのメニュー項目の追加属性を指定できます。

あなたはこのモジュールを使うべきです

  • 特定のメニュー項目を「フォローしない」で、サイト全体のPageRankの流れを形作っていく
  • メニュー項目にIDを付けて、jQueryを使用して簡単に選択できるようにしたい
  • メニュー項目にクラスまたはスタイルを追加したい

モジュールでは現在、各メニュー項目に次の属性を設定できます。

  • Id
  • 名前
  • 目標
  • リリース
  • クラス
  • スタイル
  • アクセスキー
0
Dave