タンバリンと踊る、パート2-Drupalのタブ付きメニュー

実際、 このハブラトピカの継続は、彼らが言うように、「働く人々の要求に応じて」。 そして、始める前に、バグレポートを送信するのが面倒ではなかったhabrayuzersに心から感謝します。 完璧に制限はありませんが、私はまだいくつかの粗さを修正する必要があります-しかし、いずれにせよ、元よりも良いです。 次に、このキッチンをすべてDrupalのメニューシステムに配置した方法を説明します。



まず、問題を定式化します。 する必要があります:

  1. メニュー項目は、それに対応するページを選択するとアクティブになりました(まあ、これは非常に簡単であり、対応するクラスはDrupalによって自動的にリンクに掛けられます)
  2. 各メニュー項目には、スタイルをぶら下げるための一意のIDがありました
  3. このページからノードを選択するとき、または印刷するバージョンを選択するとき(「page-name-print」のように見えるリンク)、メニュー項目はアクティブのままでした
  4. デフォルトでは、カタログに関連しない他のページでは、メニュー項目「アパート」がアクティブになっている必要があります


それで、それに応じてすべてが次のように見えるようになります。

画像



新しいメニューを作成します([管理]-[サイトデザイン]-[メニュー])。 必要なリンクをプッシュします。 「管理」-「サイト設計」-「ブロック」に移動し、表示領域の一部でブロックを新しいメニューに置き換えます(この領域がテンプレートに表示されているか、領域の作業divがそれらのIDに対応しているか、スタイルシートに書かれているもの)。 「裸」メニューが表示されますが、これをカスタマイズします。



したがって、タスク1は「すぐに使える」Drupalによって解決され、前のトピックのスタイルシートに既に登録されているので、手順2に進みます。各メニュー項目に一意の属性(IDなど)を添付する方法は? 非常に簡単- メニュー属性モジュールを配置し、モジュール管理ページで有効にします。メニュー項目の編集に入ると、属性を追加するための別のセクションが表示されます。 この場合、各リンクにIDを割り当てます。メニュー項目「アパート」-「アパート」、「住宅とコテージ」-「住宅」、「土地」-「地面」、および「産業用不動産」-「ビジネス。」 そして、この手順の後、少なくともディレクトリページ(もしあれば、Viewsを使用して生成された)上のメニューは、そのように見えることがわかります。



さらに進みましょう。 カタログの対応するセクションからノードを選択する場合、またはページを印刷するためのバージョンを選択する場合は、メニュー項目をアクティブにしておく必要があります。 私はそれぞれのタイプの不動産を持っていると言わなければなりません-これは適切なパラメーターを備えた別個のタイプのノードです。 バインディングを作成する際、ノードのタイプを正確にチェックしますが、一般的には何でもかまいません(分類法、CCKフィールド...わかりません)。 テンプレートのフォルダーに移動してtemplate.phpファイルを開き、次の行を追加します。



 function phptemplate_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) { $class = ($menu ? 'expanded' : ($has_children ? 'collapsed' : 'leaf')); if (!empty($extra_class)) { $class .= ' '. $extra_class; } preg_match("/node\/\d+/", request_uri(), $nid); // ,    ,      .    preg_match - -  if (!empty($nid[0])) { $nid[0] = ereg_replace("node/", "", $nid[0]); $tmp = node_load($nid[0]); } if (ereg('apartments',$link) and !(preg_match("/houses|ground|business/", request_uri()) or preg_match("/house|place|for_business/", $tmp->type) )) {$in_active_trail = true;} if ( ereg('/houses',$link) and (ereg("/houses", request_uri()) or $tmp->type=='house') ) {$in_active_trail = true;} if ( ereg('/ground',$link) and (ereg("/ground", request_uri()) or $tmp->type=='place') ) {$in_active_trail = true;} if ( ereg('/business',$link) and (ereg("/business", request_uri()) or $tmp->type=='for_business') ) {$in_active_trail = true;} if ($in_active_trail) { $class .= ' active-trail '; } return '<li class="'. $class .'">'. $link . $menu ."</li>\n"; }
      
      





わあ...怖い? 恐れるな。 ここで何が起こっているのかを説明します。 関数自体は、標準のDrupalメニュー出力をオーバーライドします。 グローバル変数$ノードはここでは表示されないため(FIGは理由を理解しているため、理解する時間がありません)、アクティブノードの番号(存在する場合)は、現在のURLから正規表現で取得します。 そして、もしあれば、ノードのパラメーターをロードします。



次に、いくつかの条件を確認します-現在のページのアドレスがメニューリンクに含まれているかどうか(これはページ名を含む印刷バージョンが正しく処理されるために必要です)、そうでない場合、現在のノードのタイプは不動産のタイプに対応していますか? それだけです! :)



これはおそらく最も美しく、高速で、スケーラブルなどではないことを知っています。 方法。 しかし、第一に、これはdrupalに関する私の最初の真剣なプロジェクトであり、第二に、メニューと材料の構造が将来も変わらないことを約束してくれました。 原則として、すべての特定のテンプレートに対応するように材料とページの種類の命名に正しくアプローチする場合、同じレギュラーはこのタスクをより深刻な条件に外挿することができます...



All Articles