В Prestashop 1.7, как отобразить большой палец категории в модуле Главного меню - PullRequest
0 голосов
/ 06 июня 2018

Мне не удается отобразить большие пальцы категорий в модуле главного меню (ps_mainmenu).Я управляю этим в Prestashop 1.6, но модуль изменился.

В администраторе Prestashop 1.7 вы можете добавить изображение большого пальца категории.

Вот изображение, показывающее, чего я пытаюсь достичь: Большой палец категории над ярлыками категории в главном меню

С уважением,

Квентин

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я возвращаюсь к своему проекту и обновляю свой Prestashop, а затем мое меню исчезло, и я забыл об этом ответе.Еще раз спасибо Александр Гросул.

Вот что нужно сделать, чтобы переопределить PS_MainMenu и сделать отображение большого пальца категорий, даже когда у категорий нет дочерних элементов.

  1. Перейти к переопределению / modules / ps_mainmenu
  2. Вы можете продублировать файл ps_mainenu.php из оригинального модуля и очистить его или просто создать новый файл php
  3. Новый файл:

    class Ps_MainMenuOverride extends Ps_MainMenu {
    
    protected function generateCategoriesMenu($categories, $is_children = 0)
    {
    $nodes = [];
    
    foreach ($categories as $key => $category) {
        $node = $this->makeNode([]);
    
        if ($category['level_depth'] > 1) {
            $cat = new Category($category['id_category']);
            $link = $cat->getLink();
        } else {
            $link = $this->context->link->getPageLink('index');
        }
    
        $node['url'] = $link;
        $node['type'] = 'category';
        $node['page_identifier'] = 'category-' . $category['id_category'];
    
        /* Whenever a category is not active we shouldnt display it to customer */
        if ((bool)$category['active'] === false) {
            continue;
        }
    
        $current = $this->page_name == 'category' && (int)Tools::getValue('id_category') == (int)$category['id_category'];
        $node['current'] = $current;
        $node['label']   = $category['name'];
        $node['image_urls']  = [];
    
        $files = scandir(_PS_CAT_IMG_DIR_);
    
        if (count(preg_grep('/^'.$category['id_category'].'-([0-9])?_thumb.jpg/i', $files)) > 0) {
            foreach ($files as $file) {
                if (preg_match('/^'.$category['id_category'].'-([0-9])?_thumb.jpg/i', $file) === 1) {
                    $image_url = $this->context->link->getMediaLink(_THEME_CAT_DIR_.$file);
                    $node['image_urls'][] = $image_url;
                }
            }
        }
    
        if (isset($category['children']) && !empty($category['children'])) {
            $node['children'] = $this->generateCategoriesMenu($category['children'], 1);
        }
    
        $nodes[] = $node;
    }
    
    return $nodes;
    }
    }
    
  4. Убедитесь, что вы удалили кеш или принудительную компиляцию

Это должно помочь, и останется даже после обновлений.

0 голосов
/ 07 июня 2018

Вам нужно изменить файл шаблона вашего меню и лучше сделать это внутри вашей темы themes/your_theme/modules/ps_mainmenu/ps_mainmenu.tpl и добавить туда аналогичную часть кода

{if $node.type == 'category'}
  {if isset($node.image_urls) && $node.image_urls}
    {foreach from=$node.image_urls item='thumb'}
      <img src="{$thumb}" alt="" />
    {/foreach}
  {/if}
{/if}

внутри {foreach from=$nodes item=node}, в моем случае это выглядит так

{assign var=_counter value=0}
{function name="menu" nodes=[] depth=0 parent=null}
    {if $nodes|count}
      <ul class="top-menu" {if $depth == 0}id="top-menu"{/if} data-depth="{$depth}">
        {foreach from=$nodes item=node}
          <li class="{$node.type}{if $node.current} current {/if}" id="{$node.page_identifier}">
            {if $node.type == 'category'}
              {if isset($node.image_urls) && $node.image_urls}
                {foreach from=$node.image_urls item='thumb'}
                  <img src="{$thumb}" alt="" />
                {/foreach}
              {/if}
            {/if}
            {assign var=_counter value=$_counter+1}
              <a
                class="{if $depth >= 0}dropdown-item{/if}{if $depth === 1} dropdown-submenu{/if}"
                href="{$node.url}" data-depth="{$depth}"
                {if $node.open_in_new_window} target="_blank" {/if}
              >
                {if $node.children|count}
                  {* Cannot use page identifier as we can have the same page several times *}
                  {assign var=_expand_id value=10|mt_rand:100000}
                  <span class="float-xs-right hidden-md-up">
                    <span data-target="#top_sub_menu_{$_expand_id}" data-toggle="collapse" class="navbar-toggler collapse-icons">
                      <i class="material-icons add">&#xE313;</i>
                      <i class="material-icons remove">&#xE316;</i>
                    </span>
                  </span>
                {/if}
                {$node.label}
              </a>
              {if $node.children|count}
              <div {if $depth === 0} class="popover sub-menu js-sub-menu collapse"{else} class="collapse"{/if} id="top_sub_menu_{$_expand_id}">
                {menu nodes=$node.children depth=$node.depth parent=$node}
              </div>
              {/if}
            </li>
        {/foreach}
      </ul>
    {/if}
  {/function}

<div class="menu js-top-menu position-static hidden-sm-down" id="_desktop_top_menu">
    {menu nodes=$menu.children}
    <div class="clearfix"></div>
</div>

и это работает, но не совсем предсказуемо для меня.Потому что он добавляет изображения только к категориям, которые имеют дочерние категории.Так что, если это нормально, вы можете оставить его в этом состоянии, но если нет, и вы хотите отображать изображения для всех категорий, вам нужно изменить файл контроллера модуля.Перейдите к вашему модулю в папке основных модулей modules/ps_mainmenu/ps_mainmenu.php и измените метод generateCategoriesMenu.Удалите код

$files = scandir(_PS_CAT_IMG_DIR_);

if (count(preg_grep('/^'.$category['id_category'].'-([0-9])?_thumb.jpg/i', $files)) > 0) {
  foreach ($files as $file) {
    if (preg_match('/^'.$category['id_category'].'-([0-9])?_thumb.jpg/i', $file) === 1) {
      $image_url = $this->context->link->getMediaLink(_THEME_CAT_DIR_.$file);
      $node['image_urls'][] = $image_url;
    }
  }
}

из условия if (isset($category['children']) && !empty($category['children'])) и поставьте его точно перед условием.

...