Вывод категорий и подкатегорий картинками

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 86
Зарегистрирован: 15.12.2018
С нами: 5 лет 3 месяца
Откуда: Киев

Сообщение #1 Евгений » 02.11.2020, 08:36

OkayCMS V.2.3.4
Установил модуль "Вывод подкатегорий картинками" согласно инструкции со статьи: https://okay-cms.com/article/vyvod-podkategorij-kartinkami
Обнаружил, что данный метод работает только для для подкатегорий 1-ого уровня вложенности. Если же вложенность от 2-го уровня, то вместо картинок следующих подкатегорий мы опять вываливаем все товары этой подкатегории. Немного поменял код, но проблема все же осталась.

Изначальная инструкция:

1. В файле design/okay_shop/css/style.css дописываем в конец

Код: Выделить всё

/*subcats_images_in_products*/
.subcategories .product_name {
    font-size: 19px;
    text-align: center;
}
@media (max-width: 1199px){
    .subcategories .preview{
        border-top: 1px solid #e8e8e1;
    }
}
/*/subcats_images_in_products*/


2.2. Создаем файл subcategories_content.tpl в папке design/okay_shop/html/ с таким содержимым:

Код: Выделить всё

{*subcats_images_in_products*}
{foreach $category->subcategories as $sub}
    {if $sub->visible}
        <div class="subcategories no_padding products_item col-sm-6 col-xl-3">
            {include file="subcategories_list.tpl"}
        </div>
    {/if}
{/foreach}
{*/subcats_images_in_products*}


3.3. Создаем файл subcategories_list.tpl в папке design/okay_shop/html/, а в нём

Код: Выделить всё

{*subcats_images_in_products*}
{* Subcategories preview *}
<div class="preview fn_product">
    <div class="fn_transfer clearfix">
        {* Subcategories image *}
        <a class="preview_image" href="{$lang_link}catalog/{$sub->url}">
            {if $sub->image}
                <img src="{$sub->image|resize:320:320:false:$config->resized_categories_dir}" alt="{$sub->name|escape}" title="{$sub->name|escape}">
            {else}
                <img width="320" height="320" src="design/{$settings->theme}/images/no_image.png" alt="{$sub->name|escape}" title="{$sub->name|escape}"/>
            {/if}
        </a>
        {* Subcategories name *}
        <a class="product_name" data-product="{$sub->id}" href="{$lang_link}catalog/{$sub->url}">{$sub->name|escape}</a>
    </div>
</div>
{*/subcats_images_in_products*}


4. В документ design/okay_shop/html/products.tpl вносим следующие правки, выделенные в коде комментариями

Код: Выделить всё

{* The Categories page *}
{* The canonical address of the page *}
{if $set_canonical || $self_canonical}
    {if $category}
        {$canonical="/catalog/{$category->url}" scope=parent}
    {elseif $brand}
        {$canonical="/brands/{$brand->url}" scope=parent}
    {elseif $page->url=='discounted'}
        {$canonical="/discounted" scope=parent}
    {elseif $page->url=='bestsellers'}
        {$canonical="/bestsellers" scope=parent}
    {elseif $keyword}
        {$canonical="/all-products" scope=parent}
    {else}
        {$canonical="/all-products" scope=parent}
    {/if}
{/if}
{*subcats_images_in_products*}
{$count_subs_visible = 0}
{if $category->level_depth==1}
    {$subs = $category->subcategories}
    {foreach $subs as $sub}
        {if $sub->visible}
            {$count_subs_visible = $count_subs_visible+1}
        {/if}
    {/foreach}
    {if $count_subs_visible==0}
        {*Sidebar with filters*}
        <div class="sidebar sidebar_top">
            {include file='features.tpl'}
        </div>
    {/if}
{else}
    {*Sidebar with filters*}
    <div class="sidebar sidebar_top">
        {include file='features.tpl'}
    </div>
{/if}
{*/subcats_images_in_products*}
<div class="{*subcats_images_in_products*}{if $category->level_depth!=1}products_container{elseif $count_subs_visible==0}products_container{/if}{*/subcats_images_in_products*}">
    {* The page heading *}
    {if $keyword}
        <h1 class="h1"><span data-language="products_search">{$lang->products_search}</span> {$keyword|escape}</h1>
    {elseif $page}
        <h1 class="h1">
            <span data-page="{$page->id}">{$page->name|escape}</span>
        </h1>
    {else}
        <h1 class="h1"><span data-category="{$category->id}">{if $category->name_h1|escape}{$category->name_h1|escape}{else}{$category->name|escape}{/if}</span> {$brand->name|escape} {$filter_meta->h1|escape}</h1>
    {/if}
    {if $current_page_num == 1 && ($category->annotation || $brand->annotation)}
        <div class="block padding">
            {* Краткое описание категории *}
            {$category->annotation}
            {* Краткое описание бренда *}
            {$brand->annotation}
        </div>
    {/if}
    {*subcats_images_in_products*}
    {if $category->level_depth==1 && $count_subs_visible!=0}
    {* Subcategories list *}
    <div id="fn_products_content" class="fn_categories products clearfix">
        {include file="subcategories_content.tpl"}
    </div>
    {else}
   {*/subcats_images_in_products*}
        {if $products}
            {* Product Sorting *}
            <div class="fn_products_sort">
                {include file="products_sort.tpl"}
            </div>
        {/if}
        {* Product list *}
        <div id="fn_products_content" class="fn_categories products clearfix">
            {include file="products_content.tpl"}
        </div>
        {if $products}
            {* Friendly URLs Pagination *}
            <div class="fn_pagination">
                {include file='chpu_pagination.tpl'}
            </div>
        {/if}
        {if $page->body}
            <div class="block padding">
                {$page->body}
            </div>
        {/if}
        {if $current_page_num == 1 && (!$category || !$brand) && ($category->description || $brand->description)}
            <div class="block padding">
                {* Описание категории *}
                {$category->description}
                {* Описание бренда *}
                {$brand->description}
            </div>
        {/if}
    </div>
    {* Sidebar with browsed products *}
    <div class="sidebar sidebar_bottom block">
        {* Browsed products *}
        {get_browsed_products var=browsed_products limit=4}
        {if $browsed_products}
            <div class="h2">{$lang->features_browsed}</div>
            <div class="browsed clearfix">
                {foreach $browsed_products as $browsed_product}
                    <div class="browsed_item col-xs-6 col-sm-3 col-lg-6">
                        <a href="{$lang_link}products/{$browsed_product->url}">
                            {if $browsed_product->image->filename}
                                <img src="{$browsed_product->image->filename|resize:50:50}" alt="{$browsed_product->name|escape}" title="{$browsed_product->name|escape}">
                            {else}
                                <img width="50" height="50" src="design/{$settings->theme}/images/no_image.png" alt="{$browsed_product->name|escape}" title="{$browsed_product->name|escape}"/>
                            {/if}
                        </a>
                    </div>
                {/foreach}
            </div>
        {/if}
    </div>

{*subcats_images_in_products*}
{/if}
{*/subcats_images_in_products*}


Дописанный код:

Из шага 4 был модифицированный следующий кусок кода

Код: Выделить всё

{*subcats_images_in_products*}
{$count_subs_visible = 0}
{if $category->level_depth==1 or $category->level_depth==2}
    {$subs = $category->subcategories}
    {foreach $subs as $sub}
        {if $sub->visible}
            {$count_subs_visible = $count_subs_visible+1}
        {/if}
    {/foreach}
    {if $count_subs_visible==0}
        {*Sidebar with filters*}
        <div class="sidebar sidebar_top">
            {include file='features.tpl'}
        </div>
    {/if}
{else}
    {*Sidebar with filters*}
    <div class="sidebar sidebar_top">
        {include file='features.tpl'}
    </div>
{/if}

{*/subcats_images_in_products*}

и этот кусок кода

Код: Выделить всё

 {*subcats_images_in_products*}
    {if $category->level_depth==1 && $count_subs_visible!=0 or $category->level_depth==2 && $count_subs_visible!=1 }
    {* Subcategories list *}
    <div id="fn_products_content" class="fn_categories products clearfix">
        {include file="subcategories_content.tpl"}
    </div>
    {else}

   {*/subcats_images_in_products*}


После этого в подкатегориях второго уровня начали показываться ссылки картинками на подкатегории 3-го уровня (если таковые есть). При этом возникла новая проблема - в некоторых подкатегориях 2-го уровня отсутствуют вложенные подкатегории и они являются последним уровнем вложенности, где и должны показываться товары. Вместо этого у нас блок товаров отсутствует .
Подскажите пожалуйста, как довести этот код до ума.

Добавлено спустя 1 час 29 минут:
Нашел решение:
в 4-ом шаге подправил следующий кусок кода

Код: Выделить всё

  {*subcats_images_in_products*}
    {if $category->level_depth==1 && $count_subs_visible!=0 or $category->level_depth==2 && $count_subs_visible!=1 }
    {* Subcategories list *}
    <div id="fn_products_content" class="fn_categories products clearfix">
        {include file="subcategories_content.tpl"}
    </div>
    {else}

   {*/subcats_images_in_products*}


на

Код: Выделить всё

 {*subcats_images_in_products*}
    {if $category->level_depth==1 && $count_subs_visible!=0 or $category->level_depth==2 && $count_subs_visible!=0 }
    {* Subcategories list *}
    <div id="fn_products_content" class="fn_categories products clearfix">
        {include file="subcategories_content.tpl"}
    </div>
    {else}

   {*/subcats_images_in_products*}

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 86
Зарегистрирован: 15.12.2018
С нами: 5 лет 3 месяца
Откуда: Киев

Сообщение #2 Евгений » 10.12.2020, 12:36

Переделал немножко модуль, для более правильной работы SEO фильтров.
К примеру на сайте есть категория "Бытовая техника" и в нее входят подкатегории "Холодильники", "Стиральные машины", "Микроволновки" и т.д., и ко всем им применим фильтр "Встраиваемый". При прошлой реализации модуля мы могли проставить SEO фильтр лишь для подкатегорий, но не для главной категории. В связи с этим терялась часть поискового трафика.
Следующие изменения решают эту проблему:

В файле /design/okay_shop/html/products.tpl

Код: Выделить всё

{*subcats_images_in_products*}
{$count_subs_visible = 0}
{if $category->level_depth==1 or $category->level_depth==2}
    {$subs = $category->subcategories}
    {foreach $subs as $sub}
        {if $sub->visible}
            {$count_subs_visible = $count_subs_visible+1}
        {/if}
    {/foreach}
    {if $count_subs_visible==0}
        {*Sidebar with filters*}
        <div class="sidebar sidebar_top">
            {include file='features.tpl'}
        </div>
    {/if}
{else}
    {*Sidebar with filters*}
    <div class="sidebar sidebar_top">
        {include file='features.tpl'}
    </div>
{/if}
{*/subcats_images_in_products*}


меняем на

Код: Выделить всё

{*subcats_images_in_products*}
{$count_subs_visible = 0}
{if $category->level_depth==1 or $category->level_depth==2}
    {$subs = $category->subcategories}
    {foreach $subs as $sub}
        {if $sub->visible}
            {$count_subs_visible = $count_subs_visible+1}
    {/foreach}
        {*Sidebar with filters*}
        <div class="sidebar sidebar_top">
            {include file='features.tpl'}
        </div>
    {/if}
{else}
    {*Sidebar with filters*}
    <div class="sidebar sidebar_top">
        {include file='features.tpl'}
    </div>
{/if}

{*/subcats_images_in_products*}


В этом же файле код

Код: Выделить всё

    {if $category->level_depth==1 && $count_subs_visible!=0 or $category->level_depth==2 && $count_subs_visible!=0 }
    {* Subcategories list *}
    <div id="fn_products_content" class="fn_categories products clearfix">
        {include file="subcategories_content.tpl"}
    </div>
    {else}


меняем на

Код: Выделить всё

{if $current_page_num == 1 && ($category->annotation) && !$is_filter_page && !$smarty.get.page && !$smarty.get.sort}
    {* Subcategories list *}
    <div id="fn_products_content" class="fn_categories products clearfix">
        {include file="subcategories_content.tpl"}
    </div>
{/if}


И тут же после блока

Код: Выделить всё

   {if $current_page_num == 1 && $page->description}
        <div class="block padding">
            {$page->description}
        </div>
    {/if}


удаляем лишний закрывающий тег



Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 4 гостя