Привет всем.
Возникла следующая задача: есть вьюха, которая выводит exposed фильтры с результатами поиска по этим фильтрам (фильтры на термины таксономии из разных словарей). Охота определенные термины таксономии при выводе в ноде посылать на эту вьюху, соответствующим образом подготовив $_GET параметры.
Все бы ничего, но есть следующие трудности:
1. С помощью hook_link_alter все можно сделать ценой дополнительного запроса к БД на каждый термин таксономии, чтобы узнать к какому словарю он принадлежит. Не катит так как БД охренеет.
2. Очень удобно было бы сделать с помощью hook_term_path, но почему-то на каком-то этапе хорошо сформированный $_GET запрос превращается в кракозябры:
вместо "search/door?dtype=28&mnf=All&cnstr=All&mt_kr=All&clr=All&kmpl=All&upk=All"
мы видим "search/door%3Fdtype%3D28%2526mnf%3DAll%2526cnstr%3DAll%2526mt_kr%3DAll%2526clr%3DAll%2526kmpl%3DAll%2526upk%3DAll"
Вопрос - какая функция это проделывает, и можно ли как-то эту ситуацию исправить?
3. Еще вариант: hook_link + hool_link_alter: через hook_link зарегистрировать нужные ссылки, а с помощью hool_link_alter очистить то, что таксономия записала, но тоже не очень хороший вариант.
Какие варианты подскажете?
Комментарии
имхо, проще написать свой handler для вывода термина через views
а можно чуточку подробнее, что имеется в виду.
hook_link_alter все-таки помог, просто я изначально ступил. В этом хуке для формирования нужной ссылки мне нужна была вся информация по конкретному термину таксономии. В какой-то документации я видел, что информация подгружается через taxonomy_get_term(). Поэтому я подумал, что делать запрос к базе на каждый тэг - зло.
Но потом я заметил, что в hook_link_alter помимо ссылок передается и сама нода. А таксономия в нее уже подгружена, поэтому не составит труда вытащить всю инфу по термину таксономии из объекта ноды.
Пример, как это сделано:
<?php
function foo_link_alter(&$links, $node) {
// Link to the search products page and not the taxonomy term page
if ($node->type == 'foo'){
foreach ($links AS $module => $link) {
if (strstr($module, 'taxonomy_term')) {
$tid = explode('_', $module);
$tid = (int)$tid[2];
$term = $node->taxonomy[$tid];
$searchvocs = variable_get('foo_foo_searchvocs', 0);
if ($searchvocs[$term->vid]){
$links[$module]['href'] = 'search/foos';
$links[$module]['query'] = _foo_build_query($term);
}
}
}
}
if ($node->type == 'bar'){
foreach ($links AS $module => $link) {
if (strstr($module, 'taxonomy_term')) {
$tid = explode('_', $module);
$tid = (int)$tid[2];
$term = $node->taxonomy[$tid];
$searchvocs = variable_get('foo_bar_searchvocs', 0);
if ($searchvocs[$term->vid]){
$links[$module]['href'] = 'search/bars';
$links[$module]['query'] = _bar_build_query($term);
}
}
}
}
}
function _foo_build_query($term)
{
$search_vids = array(
'19' => 'dtype',
'2' => 'mnf',
'4' => 'cnstr',
'5' => 'mt_kr',
'15' => 'clr',
'12' => 'kmpl',
'6' => 'upk'
);
foreach ($search_vids as $vid => $getkey{
if ($vid == $term->vid){
$getval = $term->tid;
}
else {
$getval = 'All';
}
$query[$getkey] = $getval;
}
return $query;
}
function
_bar_build_query($term){
$search_vids = array(
'7' => 'acctype',
'3' => 'mnf',
'8' => 'cnstr',
'9' => 'mt',
'13' => 'kmpl',
'10' => 'upk'
);
foreach ($search_vids as $vid => $getkey){
if ($vid == $term->vid){
$getval = $term->tid;
}
else {
$getval = 'All';
}
$query[$getkey] = $getval;
}
return $query;
}?>
В функциях _build_query($term) идет формирование нужного массива с $_GET параметрами для вьюхи.
В итоге нужные мне словари таксономии переправляются сразу на форму поиска нод с этими терминами.