web-dev-qa-db-ja.com

分類法のマシン名を使用し、奥行きのあるビューページを作成するにはどうすればよいですか?

この質問は 分類用語の子に関連付けられているノードをロードする方法 のフォローアップであり、特に この回答 を指しますが、スタンドアロンであるため、必要なのはあなたがより多くの背景が必要な場合はそれらをご覧ください。

コンテキストフィルターで深度がオンになっているビューに付属するタクソノミー用語ビューのように機能するビューを作成したいが、用語のマシン名コンテキスト引数としてtidの代わりに。

default Taxonomy term view

エイリアス/ taxonomy/term/tidを/ vocabulary/termに設定するpathautoを設定しています。そこでページをビューでオーバーライドして、親と同様に用語の子に関連付けられたノードを表示します。

したがって、次の分類法があった場合:

語彙1(vocab_1)

  • 用語1(term_1)
    • 用語2(term_2)
    • 用語3(term_3)
  • 用語4(term_4)
    • 用語5(term_5)

およびノー​​ドは次のとおりです。

ノード1-用語2、用語5 Node 2-用語5 Node 3-用語3

/ vocab_1/term_1への訪問者は、ノード1および3を含むリストを取得する必要があります。これらは、用語1の子に関連付けられているためです。

私は、tidの代わりにmachine_nameという用語をコンテキストフィルターとして使用して、その方法を理解できませんでした。

2
UltraBob

Relationshipを追加せずに、コンテキストフィルターContent:Has taxonomy term ID(with depth)を使用できます。この設定をコンテキストフィルターに使用します。

フィルター値がの場合[〜#〜]不可[〜#〜]使用可能:デフォルト値を提供
タイプ:URLからの分類用語ID
用語ページからデフォルトのフィルターを読み込むチェックされているであることを確認してください。

注: pathauto宛先パスにアクセスすると、この場合は/taxonomy/term/%のソースが/vocabulary_name/term_nameを指しているため、drupalはソースパスをクエリ変数として使用し、ビューは引き続きソースパスを使用して情報を収集します。つまり、ビュー内のパスは変更されず、taxonomy/term/%のままである必要があります

2
Елин Й.

残念ながら、用語のマシン名コンテキストフィルターオプションがないようです。 1つありますが、語彙マシン名のみです。

本当にこれが必要な場合は、手を汚さなければなりません。

可変URLを持つカスタムページを使用してカスタムモジュールを作成します。例:_/taxonomy/%_ _%_は、マシン名のプレースホルダーです。

次に、 current_path() といくつかのphp関数(おそらく str_ireplace() を使用して_taxonomy/_の部分を削除する)を使用してページをロードするときに、URLからマシン名を取得します。次に、データベースにクエリを実行し、 db_query() を使用して、そのマシン名に属する用語idを取得します。

Idという用語を取得したら、phpを使用してスクリーンショットにビューをレンダリングできます。したがって、引数として用語idを渡すだけです。

_<?php
print views_embed_view('my_view', 'block_1', $arg,);
?>
_

あなたの場合それは次のようになります:

_<?php
print views_embed_view('taxonomy_term', 'page', $term_id,);
?>
_

更新:

分類用語テーブル(taxonomy_term_data)を確認すると、分類用語のマシン名列がないことがわかります(ビューにコンテキストフィルターがない理由を説明しています)。

したがって、唯一の選択肢は、分類用語名を使用することです。一意の用語名がある限り、これで問題ありません。

まず、分類用語ビュー(スクリーンショットの1つ)に移動し、 を押す必要があります。 enter image description here そして、ブロックを追加して保存します。

これが、Finderという用語で作成した作業モジュールです。

_/sites/all/modules/term_Finder
_

term_Finder.info

_name = Term Finder
description = Creates variable pages for taxonomy term names and shows a view.
core = 7.x
_

term_Finder.module

_<?php

/**
 * Implements hook_menu().
 */
function term_Finder_menu() {
  $items = array();

  $items['taxterm/%'] = array( // this will be our custom page url. The % allows us to put anything after, ex: taxterm/[anything can go in here]
    'title' => 'Your Title Goes Here',
    'access callback' => TRUE,
    'page callback' => 'term_Finder_page', // the name of the function that gets runed when we visit our taxterm/[anything] page.
    'type' => MENU_NORMAL_ITEM,
    'menu' => 'navigation',
  );

  return $items;
}

/**
 * Page callback for taxterm/%.
 */
function term_Finder_page() {
  $path = current_path(); // gets the current page url. ex: taxterm/hello-world and saves it on a variable
  $path = str_ireplace('taxterm/','', $path); // removes the taxterm/ from our variable, so we are left with hello-world
  $path = str_ireplace('-',' ', $path); // replaces the - with a space, so we have hello world
  $term_id = db_query("SELECT tid from {taxonomy_term_data} WHERE name = :name LIMIT 1", array(":name" => $path))->fetchField(); // queries the DB to find the tid that belongs to hello world.
  if ($term_id != '') { // we check if grabbed a term id, is not empty.
    $show_view = views_embed_view('taxonomy_term', 'block_1', $term_id); // creates the view, which passes the tid we got from the DB as an argument.
    return $show_view; 
    }
  else { // if the term id is empty, then we show "not found".
  return 'not found';
  }
}
_

Hello Worldという用語があるとします。

これは、_/taxterm/hello-world_または(Firefoxの場合)_/taxterm/hello world_にアクセスすると発生します。

Hello WorldのDBを検索し、用語IDを取得してビューに渡します。

PS:mysqlクエリがなぜそのように見えるのか疑問に思っている場合は、 安全なコードの記述 および 取得方法を参照してください。 db_query()を使用した1つの結果のみ

1
No Sssweat