Вывод нод на странице категории из подкатегорий того же родителя Drupal 7
Порой не все задачи получается реализовать через обычный функционал админки и представлений в том числе, или по крайней мере решение не понятно. Одной из таких задач стал вывод на странице подкатегорий нод из смежных подкатегорий имеющих одного и того же родителя. Получилось несколько входных условий:
- Вывод блока на дочерней категории, т.е. имеющей родительскую категорию
- Количество для вывода — 8 штук (просто эстетически красиво в шаблоне)))
- Ноды должны быть из категорий той же родительской категории, что и открыта
- С учетом того, что есть ноды привязанные ТОЛЬКО к родителю, во избежании ситуации, когда у смежных категорий не хватает 8 нод, выводить ноды привязанные к родителю
<?php
$current_url = $_SERVER['REQUEST_URI'];
$url = substr($current_url, 1);
$current_term_path = db_query("SELECT source FROM `url_alias` WHERE `alias` = '$url'")->fetchAll();
$current_term_id = str_replace('taxonomy/term/', '', $current_term_path['0']->source);
$parrent_category = db_query("SELECT parent FROM `taxonomy_term_hierarchy` WHERE `tid` = '$current_term_id'")->fetchAll();//получаем айдишник родительской категории
$parrent_category_id = $parrent_category['0']->parent;
$nophoto = '<img src="/sites/default/files/default_images/no-photo.jpg" alt="Нет фото" />';
//проверяем является ли категория дочерней
if($parrent_category_id != 0){
$same_parrent_category = db_query("SELECT tid FROM `taxonomy_term_hierarchy` WHERE `parent` = '$parrent_category_id'")->fetchAll();//получаем список всех дочерних категорий главной каты
foreach ($same_parrent_category as $sp_cat) {
$field_category_tids[] = $sp_cat->tid;
}
$node_cat = db_query("SELECT entity_id FROM field_revision_field_category WHERE field_category_tid IN (".implode(',',$field_category_tids).") ORDER BY RAND ( )")->fetchAll();//получаем список всех нод дочерних категорий
$node_cat_count = count($node_cat);//получаем количество нод
//проверяем хватает ли нод для вывода в блоке
if($node_cat_count < 8){
//если меньше 8 выводим смежные и родительской категории
$a = 0;
$b = 0;
//сначала выводим ноды смежных категорий
foreach($node_cat as $nodes){
$a++;
$node_id = $nodes->entity_id;
$node = node_load($node_id);
$node_url = drupal_get_path_alias('node/' .$node->nid);
$image_size = 'list';
$image_path = $node->field_galery['und']['0']['uri'];
//костыли для вывода картинки или заглушки, если картинки нет
if(!empty($node->field_galery)) {
$node_img = '<img src="'.image_style_url($image_size, $image_path).'" title ="'.$node->title.'"/>';
} else {
$node_img = $nophoto;
}
//исключаем ноды текущей категории
if ($node->field_category['und']['0']['tid'] != $current_term_id){
//проверка заполнен ли массив ноды для исключения баговых пустых
if(!empty($node)){
echo '
<div class="products_block col-sm-3">
<a class="products_link" href="/'.$node_url.'">
<div class="product_thumbnail">
'.$node_img.'
</div>
<div class="prduct_title">'.$node->title.'</div>
</a>
<div class="product_price">
<div class="buy_button">
<div id="add2basket-link-'.$node_id.'" class="add2basket-link-container">
<a href="/basket/add/'.$node_id.'/nojs/?destination=taxonomy/term/'.$current_term_id.'" id="ajax-link--'.$i.'">В корзину</a>
</div>
</div>
</div>
</div>';
}
} else { $a--; }
}
//получаем список нод привязанных конкретно к родительской категории
$node_parrent_cat = db_query("SELECT entity_id FROM field_revision_field_category WHERE field_category_tid = '$parrent_category_id' ORDER BY RAND ( )")->fetchAll();
//теперь выводим ноды родительской категории, что бы закрыть пустоту и забить 8 шутк
foreach($node_parrent_cat as $pnodes){
$b++;
if($a + $b > 8){break;}
$pnode_id = $pnodes->entity_id;
$pnode = node_load($pnode_id);
$pnode_url = drupal_get_path_alias('node/' .$pnode->nid);
$pimage_size = 'list';
$pimage_path = $pnode->field_galery['und']['0']['uri'];
//костыли для вывода картинки или заглушки, если картинки нет
if(!empty($pnode->field_galery)) {
$pnode_img = '<img src="'.image_style_url($pimage_size, $pimage_path).'" title ="'.$pnode->title.'"/>';
} else {
$pnode_img = $nophoto;
}
//исключаем ноды текущей категории
if ($pnode->field_category['und']['0']['tid'] != $current_term_id){
//проверка заполнен ли массив ноды для исключения баговых пустых
if(!empty($pnode)){
echo '
<div class="products_block col-sm-3">
<a class="products_link" href="/'.$pnode_url.'">
<div class="product_thumbnail">
'.$pnode_img.'
</div>
<div class="prduct_title">'.$pnode->title.'</div>
</a>
<div class="product_price">
<div class="buy_button">
<div id="add2basket-link-'.$pnode_id.'" class="add2basket-link-container">
<a href="/basket/add/'.$pnode_id.'/nojs/?destination=taxonomy/term/'.$current_term_id.'" id="ajax-link--'.$a.'">В корзину</a>
</div>
</div>
</div>
</div>';
}
} else { $b--; }
}
} else {
//в остальных случаях выводим все 8 нод
$i = 0;
foreach($node_cat as $nodes){
$i++;
if($i > 8){break;}
$node_id = $nodes->entity_id;
$node = node_load($node_id);
$node_url = drupal_get_path_alias('node/' .$node->nid);
$image_size = 'list';
$image_path = $node->field_galery['und']['0']['uri'];
//костыли для вывода картинки или заглушки, если картинки нет
if(!empty($node->field_galery)) {
$node_img = '<img src="'.image_style_url($image_size, $image_path).'" title ="'.$node->title.'"/>';
} else {
$node_img = $nophoto;
}
//исключаем ноды текущей категории
if ($node->field_category['und']['0']['tid'] != $current_term_id){
//проверка заполнен ли массив ноды для исключения баговых пустых
if(!empty($node)){
echo '
<div class="products_block col-sm-3">
<a class="products_link" href="/'.$node_url.'">
<div class="product_thumbnail">
'.$node_img.'
</div>
<div class="prduct_title">'.$node->title.'</div>
</a>
<div class="product_price">
<div class="buy_button">
<div id="add2basket-link-'.$node_id.'" class="add2basket-link-container">
<a href="/basket/add/'.$node_id.'/nojs/?destination=taxonomy/term/'.$current_term_id.'" id="ajax-link--'.$i.'">В корзину</a>
</div>
</div>
</div>
</div>';
}
} else { $i--; }
}
}
}
?>