web-dev-qa-db-ja.com

drupal taxonomy and pathautoを使用して実際の分類法を作成します

drupalで爬虫類の分類法を作成していて、URLの用語にpathautoを使用したい。問題は、適切なトークンを見つけることです(エンティティトークンがインストールされています)。語彙爬虫類の分類木の例:

Lizards
--Family
----Genus
------Species

ここまでは順調ですね:

[term:vocabulary]/[term:parent:parent:parent]/[term:parent:parent]/[term:parent]-[term:name]

結果:/ reptiles/lizards/family/genus-species

ただし、時には亜種も存在するため、次のようになります。

Lizards
--Family
----Genus
------Species
--------Subspecies

その後、最下位レベルから開始して[term:parent]を使用しても機能しなくなります。

[term:child]を探して、反対方向からのパスを生成しましたが、似ているものは何も見つかりません。別の方法は、階層のレベルでパターンという用語を定義できるかどうかです。

このようなもの:

    [term:vocabulary]/[term:level:1]/[term:level:2]/[term:level:3]-[term:level:4]-[term:level:5]

多分誰かがこのナッツをクラックする方法を知っていますか?

私が求める結果のより良い例:

/reptiles/lizards/gekkonidae/phelsuma-klemmeri 

または亜種と同様に:

/reptiles/lizards/gekkonidae/phelsuma-klemmeri-subsp
2
HauRuck

[term:parents:join-path]を使用した@hiteshのソリューションは良いですが、ハイフネーションされたサブパスが作成されません。これを生成するには、次のようなものをカスタムモジュールに追加できます(テストされていません)。

  //move your module's execution of hook_taxonomy_term_presave to the end of the list, 
    //so that it won't be overridden by the pathauto module.
    function YOUR_MODULE_module_implements_alter(&$implementations, $hook) {
      if ($hook == 'taxonomy_term_presave') {
        // Move hook to the end of the list.
        $group = $implementations['your_module'];
        unset($implementations['your_module']);
        $implementations['your_module'] = $group;
      }
    }

 // invoke hook_taxonomy_term_presave().
function YOUR_MODULE_taxonomy_term_presave($term) {
  switch ($term->vocabulary_machine_name) {
    case 'reptiles':
      //create the alias
      module_load_include('inc','pathauto','pathauto');
      $vocab = taxonomy_vocabulary_load($term->vid);
      $path = pathauto_cleanstring($vocab->name) . '/';
      $parents = array_reverse(taxonomy_get_parents_all($term->tid));
      foreach ($parents as $key => $parent) {
        // use '-' as glue for the second level down and '/' elsewhere
        $glue = ($key >= 1) ? '-' : '/';
        $path .= pathauto_cleanstring($parent->name) . $glue;
      }
      $path = rtrim($path, "-");
      $path_save('taxonomy/term/'.$term->tid, $path);
  }
}
0
Ollie

分類用語のURL pathautoエイリアスを次のように構成できます。

[term:vocabulary]/[term:parents:join-path]/[term:name]
タクソノミータクソノミー階層のURLエイリアスを作成するため。

特定の分類用語の置換パターンを使用して詳細を調べます。

RLエイリアス設定ページについては、この画像を参照してください

5
hitesh-jain

@olyN大きなコードをありがとう、それは不思議のように機能します。トークンが十分でないときに他の誰かがphpソリューションを求めている場合は、後で参照できるように完成したコードを投稿します。

<!-- language: lang-php -->

 //move your module's execution of hook_taxonomy_term_presave to the end of the list, 
    //so that it won't be overridden by the pathauto module.


function YOUR_MODULE_module_implements_alter(&$implementations, $hook) {
    if ($hook == 'taxonomy_term_insert') {
        // Move hook to the end of the list.
        $group = $implementations['YOUR_MODULE'];
        unset($implementations['YOUR_MODULE']);
        $implementations['YOUR_MODULE'] = $group;
    }
}

function YOUR_MODULE_taxonomy_term_insert($term) {
  switch ($term->vocabulary_machine_name) {
    case 'VOCABULARY_MACHINENAME':
      //create the alias
      module_load_include('inc','pathauto','pathauto');
      $vocab = taxonomy_vocabulary_load($term->vid);
      $path['alias'] = pathauto_cleanstring($vocab->name) . '/';
      $parents = array_reverse(taxonomy_get_parents_all($term->tid));
      foreach ($parents as $key => $parent) {
        // use '-' as glue for the second level down and '/' elsewhere
        $glue = ($key > 1) ? '-' : '/';
        $path['alias'] .= pathauto_cleanstring($parent->name) . $glue;
      }
      $path['alias'] = rtrim($path['alias'], "-");
      $path['source'] = 'taxonomy/term/'.$term->tid; 
      path_save($path);
  }
}

function YOUR_MODULE_taxonomy_term_update($term) {
  switch ($term->vocabulary_machine_name) {
    case 'VOCABULARY_MACHINENAME':
      //create the alias
      module_load_include('inc','pathauto','pathauto');
      $vocab = taxonomy_vocabulary_load($term->vid);
      $path['alias'] = pathauto_cleanstring($vocab->name) . '/';
      $parents = array_reverse(taxonomy_get_parents_all($term->tid));
      foreach ($parents as $key => $parent) {
        // use '-' as glue for the second level down and '/' elsewhere
        $glue = ($key > 1) ? '-' : '/';
        $path['alias'] .= pathauto_cleanstring($parent->name) . $glue;
      }
      $path['alias'] = rtrim($path['alias'], "-");
      $path['source'] = 'taxonomy/term/'.$term->tid; 
      path_save($path);
  }
}
<!-- language: lang-none -->
0
HauRuck