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
[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);
}
}
分類用語のURL pathautoエイリアスを次のように構成できます。
[term:vocabulary]/[term:parents:join-path]/[term:name]
タクソノミータクソノミー階層のURLエイリアスを作成するため。
特定の分類用語の置換パターンを使用して詳細を調べます。
@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 -->