web-dev-qa-db-ja.com

ビューで分類用語のパスをオーバーライドする

階層的な分類用語のパスをビューで上書きする必要があります。

www.example.com/[vocabulary name]
www.example.com/[vocabulary name]/term1
www.example.com/[vocabulary name]/term1/term2 
www.example.com/[vocabulary name]/term1/term2/term3

どこ

term1 has depth = 0
term2 has depth = 1
term3 has depth = 2

語彙用語:

+ term1
-- + term2
---- + term3
---- + term3.a
---- + term3.b
-- + term2.a
-- + term2.b

+ term1.a
-- + term2.c
-- + term2.d
-- + term2.e

パスは Pathauto によって構成されています

パスがdepth = 0で用語につながる場合、ビュー表示 "ページ"を使用しています。

パスがdepth = 1で用語につながる場合、ビュー表示「ページ-カテゴリ」を使用しています。

パスがdepth = 2の用語につながる場合、ビュー表示「ページ-サブカテゴリ」を使用しています。

パスをビューごとに上書きするために Taxonomy Views Integrator を使用しようとしましたが、機能していますが、このソリューションには1つの欠点があります。

新しいコンテンツを追加して新しい用語を作成する場合( Simple hierarchy select module を使用して)、この用語を編集し、適切なビューを選択してこの用語パスを上書きするように強制されます。多くの用語を使用すると非常に時間がかかる可能性があるため、別の解決策を探しています。

特定の用語深度のビュー表示を設定する方法

1
Jack-PL

私は自分で解決策を見つけました。 TVIモジュールなしで動作します。

便利だが必須ではないモジュール:Taxonomy Menu Block

このモジュールを使用すると、分類からメニューを作成でき、独自のテーマ関数と、生成されたデータを必要に応じて変更できるいくつかのフック( 。api.php ファイルを参照)が付属しています。これらのフックの1つがこのソリューションで使用されます。

一般的には、このソリューションには4つのステップがあります。

  1. 必要に応じて、Taxonomy Menuブロックモジュールをインストールします。
  2. 特定の用語の分類用語のパスをその深さに応じて変更します。
  3. 適切なエイリアスを作成するか、すでに存在する場合は更新します。
  4. 特定のビュー表示に新しい分類用語のパスを設定します。

一歩一歩

Taxonomy Menu Blockをインストールして、_admin/structure/block/add-taxonomy-menu-block_に移動し、いくつかの設定を行って保存します。

深さに応じて特定の用語の分類用語パスを変更します。

ここでは、両親のみを探しています。それらが存在する場合、その用語は子です。それ以外の場合は、親です。

_function YOUR_MODULE_entity_info_alter(&$entity_info) {
  $entity_info['taxonomy_term']['uri callback'] = 'YOUR_MODULE_taxonomy_term_uri';
}

function YOUR_MODULE_taxonomy_term_uri($term) {
  switch ($term->vocabulary_machine_name) { 
    case 'YOUR_VOCABULARY_MASHINE_NAME':
      $parents = taxonomy_get_parents($term->tid);
      if (empty($parents)) {
        return array(
          'path' => 'taxonomy/category/' . $term->tid,
        );
      }
      else {
        return array(
          'path' => 'taxonomy/subcategory/' . $term->tid,
        );    
      }
    break;
  }
  // default taxonomy term uri
  return taxonomy_term_uri($term);
}
_

適切なエイリアスを作成するか、すでに存在する場合は更新します。

_admin/config/search/path/patterns_に移動して、すべての語彙パスのパターンを設定します:_[term:vocabulary]/[term:parents:join-path]/[term:name]_

重要:この問題が発生する前にpathautoを実行していた場合は、_delete aliases_タブに移動して古いエイリアスを削除し、エイリアスを再構築する必要があります「分類用語パス」の場合は、_bulk update_タブに移動して、「分類用語パス」を更新します。

分類法メニューブロックリンクの変更

残念ながら、デフォルトの分類用語のパスを変更すると、 Taxonomy men または Taxonomy Menu Block(TMB) モジュールによって作成されたメニューのどちらもシステムを置き換えることができなくなりますエイリアスによるパスですが、幸運なことに、TMBでは必要に応じてリンクを変更できます。

_function YOUR_MODULE_taxonomy_menu_block_tree_alter(&$tree, $vid) {

  $vocabulary = taxonomy_vocabulary_load($vid);
  if ($vocabulary->name == 'YOUR_VOCABULARY_MASHINE_NAME') {
    foreach ($tree as $tid => $term) {
      switch ($term['depth']) {
        case 0 :
          $tree[$tid]['path'] = drupal_get_path_alias('taxonomy/category/' . $tid);
          break;
        case 1 :
          $tree[$tid]['path'] = drupal_get_path_alias('taxonomy/subcategory/' . $tid);
          break; 
      }
    }
  }
}
_

ページ設定を表示

特定の期間の深さで異なるビュー表示を使用するには、各表示の[ページ設定]で適切なパスを設定する必要があります。例えば:

ディスプレイの表示:

メインカテゴリページ->パス:_taxonomy/category/%_

サブカテゴリページ->パス:_taxonomy/subcategory/%_

注意:_taxonomy/term/%_パスを使用できなくなりました。これは、これらの特定の用語に独自のパスがあるためです。

それだけです!

このソリューションでは、親用語と子用語の両方に独自のビュー表示があるため、新しいコンテンツを追加し、単純な階層選択のみを使用して新しい用語をそれに関連付けることができます。

1
Jack-PL

あなたはあなたを混乱させる小さな間違いをしていると思います。

TVIでは語彙自体のビューを定義できないため、パスwww.example.com/[vocabulary name]はモジュールで処理できません。語彙設定は、語彙内のすべての用語のデフォルトの設定です。これらの設定は用語ごとに上書きでき、最新バージョンで継承できます。語彙全体の特定のビューが必要な場合は、Drupalにはデフォルトで語彙ページが存在しないため、自分で作成する必要があります。

この投稿とdrupal.org( https://drupal.org/node/2066015 )で説明されている問題が発生した場合は、次のことを提案できます。

  • View1をページ表示として定義し、ボキャブラリーの名前に関連するパスを与えます
  • 選択した任意のパスを使用して、view2、view3、およびview4を定義します。TVIがそれらを直接呼び出すため、これは問題ではありません。
  • 語彙のデフォルトビューとしてview2を定義します。
  • 必要に応じて、用語の特定の設定としてview3およびview4を定義します

用語ページを表示しようとすると、TVIは次のことを行います。

  • 用語にTVI設定がある場合は、それを使用します
  • それ以外の場合、最初の親が「オーバーライド」オプションでTVI設定を持っていることを見つけて使用
  • 親が見つからない場合は、語彙のTVI設定を使用します

Drupal.orgのサンプルを取ると、次のようになります。

利用規約

Vocabulary (view2)
T 1 (no settings) 
    T 1.1 (view 3, not inheritable)
        T 1.1.1 (no settings)
    T 1.2 (view 4, inheritable)
        T 1.2.1 (no settings)
    T 1.3 (no settings)
T 2 (no settings) 

結果

T 1 (view 2 from vocabulary)
    T 1.1 (view 3 from itself)
        T 1.1.1 (view 2 from vocabulary)
    T 1.2 (view 4 from itself)
        T 1.2.1 (view 4 from T 1.2)
    T 1.3 (view 2 from vocabulary)
T 2 (view 2 from vocabulary)

これがあなたがやりたいことを達成するのに役立つことを願っています。

1
DuaelFr

Taxonomy Viewsと呼ばれるこれらの短い回避策を試してください

次のファイルでモジュールを作成します。

taxonomy_views.info

name = Taxonomy Views
description = It gives links like taxonomy/[vocabulary machine name]/[term id] to taxonomy term pages, so you can set up many Views for taxonomy pages. You can create two Views with paths "taxonomy/products/%" and "taxonomy/news/%" and enable vocabulary verification for each View, for example.
core = 7.x

dependencies[] = taxonomy
dependencies[] = views

taxonomy_views.module

<?php

/**
 * @file
 * Views for taxonomy pages.
 */

/**
 * Implements hook_menu().
 */
function taxonomy_views_menu() {
  $items['taxonomy/%taxonomy_vocabulary_machine_name/term/%taxonomy_term'] = array(
    'title' => 'Taxonomy term',
    'title callback' => 'taxonomy_term_title',
    'title arguments' => array(2),
    'page callback' => 'taxonomy_term_page',
    'page arguments' => array(2),
    'access arguments' => array('access content'),
    'file' => 'taxonomy.pages.inc',
    'file path' => drupal_get_path('module', 'taxonomy'),
  );
  return $items;
}

/**
 * Alter the entity info.
 *
 * Modules may implement this hook to alter the information that defines an
 * entity. All properties that are available in hook_entity_info() can be
 * altered here.
 *
 * @param array $entity_info
 *   The entity info array, keyed by entity name.
 *
 * @see hook_entity_info()
 */
function taxonomy_views_entity_info_alter(&$entity_info) {
  if (isset($entity_info['taxonomy_term'])) {
    $entity_info['taxonomy_term']['uri callback'] = 'taxonomy_views_term_uri';
  }
}

/**
 * Entity URI callback.
 */
function taxonomy_views_term_uri($term) {
  return array(
    'path' => 'taxonomy/' . $term->vocabulary_machine_name . '/term/' . $term->tid,
  );
}

これで、「taxonomy/[vocabulary-machine-name]/term /%」のようなパスのビューを作成し、pathautoエイリアスを[term:vocabulary]/[term:parents:join-path]/[term:name]に設定できます。

パスtaxonomy/products/term/%のビューを設定し、語彙検証を有効にできるので、良いです(語彙が「製品」であることを確認してください)。

さらに、古い分類用語のURLは引き続き使用できます(taxonomy/term/%)。

0
deem

分類用語表示の一般的なビューを作成し(内部パスは常に「taxonomy/term /%tid」であるため、パスとは関係ありません。Pathautoパスはこれとは関係ありません)、ビューを使用しますフィルター用語が語彙またはあなたが好むものに属している場合にのみ使用します。

次に、このビューのクローンを作成し、別のビュー表示のフィルターを変更します。

0

私の解決策は、hook_init内の独自のビューパスにリダイレクトすることです

ビューのパスがcategory/%の場合、以下のようなコードのヘルプ

function hook_init(){
    /// redirect to category
  if(preg_match('/taxonomy\/term\/([0-9]+)$/',current_path(),$matches)){
       drupal_goto('category/'.$matches[1]);
  }
}
0
Yusef