hook_term_path и $_get параметры в ссылке

Главные вкладки

Аватар пользователя iluhin iluhin 29 ноября 2009 в 22:44

Привет всем.

Возникла следующая задача: есть вьюха, которая выводит 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 очистить то, что таксономия записала, но тоже не очень хороший вариант.

Какие варианты подскажете?

Комментарии

Аватар пользователя iluhin iluhin 5 декабря 2009 в 13:35

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 параметрами для вьюхи.

В итоге нужные мне словари таксономии переправляются сразу на форму поиска нод с этими терминами.