Фильтровать ноды по терминам связанного термина в views

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

Аватар пользователя Armi Armi 29 января 2019 в 1:19

Доброй ночи! Имеется 2 словаря Категории и Производители, и связанные ноды с их терминами, также термины словаря производителей связанны с терминами категорий. Нужно каким то образом в views на странице термина категории чтобы выводились ноды привязанные к производителям связанных с этой категорией (по аналогии с вложенным фильтром с глубиной только другой словарь). Возможно ли это каким то образом сделать в контекстном фильтре?

Лучший ответ

Аватар пользователя Armi Armi 29 января 2019 в 16:17

Похоже такое никто не делал или испугался сделать).

Решение:

1. Добавляем пару связей во вьюхе к категориям и производителям и убираем все контекстные фильтры
2. Добавляем хук на алтер запроса вьюхи

<?php

function module_views_query_alter(&$view, &$query)
{
    
    if (
$view->name == 'product_cart')
    {
            
            
            
//получаем дочерние термины категории или производителей
            
$id_term = (int)arg(2);
            
            
$term_base taxonomy_term_load($id_term);
            
$tids[] = $id_term;
            
            foreach (
taxonomy_get_tree($term_base->vid$id_term) as $terms) {
                  
$tids[] = $terms->tid;
                }
            
$or_query db_or()->condition('field_data_field_'.$term_base->vocabulary_machine_name.'.field_'.$term_base->vocabulary_machine_name.'_tid'$tids'IN');    
            
            if(
$term_base->vid == "3")
            {
            
//получаем привязанные термины производителей если это категория
                
$query_manufactured = new EntityFieldQuery();
                     
$query_manufactured
                        
->entityCondition('entity_type''taxonomy_term')  
                        ->
propertyCondition('vid''6')  
                        ->
fieldCondition('field_cats''tid'$id_term'='); 
                     
$result_m $query_manufactured->execute();
                     
                     if(!empty(
$result_m['taxonomy_term']))
                    {
                        foreach(
$result_m['taxonomy_term'] as $term2){
                            
                            
$tids_manufactured[] = $term2->tid;
                        }

                            
                    

$or_query->condition('field_data_field_manufacturer.field_manufacturer_tid'$tids_manufactured,'IN');    
                    }
                    
                    
            }         
                     

            

//добавляем условие фильтрации по категории или по производителю
             
$query->add_where(0$or_query);
        
    }
}
?>

Комментарии

Аватар пользователя Armi Armi 29 января 2019 в 16:17

Похоже такое никто не делал или испугался сделать).

Решение:

1. Добавляем пару связей во вьюхе к категориям и производителям и убираем все контекстные фильтры
2. Добавляем хук на алтер запроса вьюхи

<?php

function module_views_query_alter(&$view, &$query)
{
    
    if (
$view->name == 'product_cart')
    {
            
            
            
//получаем дочерние термины категории или производителей
            
$id_term = (int)arg(2);
            
            
$term_base taxonomy_term_load($id_term);
            
$tids[] = $id_term;
            
            foreach (
taxonomy_get_tree($term_base->vid$id_term) as $terms) {
                  
$tids[] = $terms->tid;
                }
            
$or_query db_or()->condition('field_data_field_'.$term_base->vocabulary_machine_name.'.field_'.$term_base->vocabulary_machine_name.'_tid'$tids'IN');    
            
            if(
$term_base->vid == "3")
            {
            
//получаем привязанные термины производителей если это категория
                
$query_manufactured = new EntityFieldQuery();
                     
$query_manufactured
                        
->entityCondition('entity_type''taxonomy_term')  
                        ->
propertyCondition('vid''6')  
                        ->
fieldCondition('field_cats''tid'$id_term'='); 
                     
$result_m $query_manufactured->execute();
                     
                     if(!empty(
$result_m['taxonomy_term']))
                    {
                        foreach(
$result_m['taxonomy_term'] as $term2){
                            
                            
$tids_manufactured[] = $term2->tid;
                        }

                            
                    

$or_query->condition('field_data_field_manufacturer.field_manufacturer_tid'$tids_manufactured,'IN');    
                    }
                    
                    
            }         
                     

            

//добавляем условие фильтрации по категории или по производителю
             
$query->add_where(0$or_query);
        
    }
}
?>
Аватар пользователя Orion76 Orion76 30 января 2019 в 21:07

Хм.. Если я правильно понял структуру связей сущностей, должно и без кода работать.

Вьюс.
Выборка по товарам.
Связи: Товар -> Производитель -> Категория
Контекстный фильтр: ID Категории