×
Ruby on Rails: постинг твитов через Twitter API (04 нояб 2017)

Практикуемся в Ruby on Rails.

Вопрос CommerceML: импорт товаров в OpenCart

Больше
10 мес. 1 нед. назад - 10 мес. 1 нед. назад #1 от Aleksej
Aleksej создал эту тему: CommerceML: импорт товаров в OpenCart
Здесь продолжаем разговор, начатый статьей блога CommerceML: импорт товаров из 1С в OpenCart , далее следует обещанный код с небольшими комментариями. Итак, как же нам изменить иерархию импортированных из файлов CommerceML категорий товаров произвольным образом?

Открываем файл header.tpl, отвечающий, в том числе, за работу основного меню OpenCart (надеюсь, найдете самостоятельно?) - нас интересует участок кода, начинающийся сразу за </header>, и способный выглядеть вот так:

<?php if ($categories) { ?>
<div class="container">
  <nav id="menu" class="navbar">
    <div class="navbar-header"><span id="category" class="visible-xs"><?php echo $text_category; ?></span>
      <button type="button" class="btn btn-navbar navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse"><i class="fa fa-bars"></i></button>
    </div>
    <div class="collapse navbar-collapse navbar-ex1-collapse">
      <ul class="nav navbar-nav">
        <?php foreach ($categories as $category) { ?>
        <?php if ($category['children']) { ?>
        <li class="dropdown"><a href="<?php echo $category['href']; ?>" class="dropdown-toggle" data-toggle="dropdown"><?php echo $category['name']; ?></a>
          <div class="dropdown-menu">
            <div class="dropdown-inner">
              <?php foreach (array_chunk($category['children'], ceil(count($category['children']) / $category['column'])) as $children) { ?>
              <ul class="list-unstyled">
                <?php foreach ($children as $child) { ?>
                <li><a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a></li>
                <?php } ?>
              </ul>
              <?php } ?>
            </div>
            <a href="<?php echo $category['href']; ?>" class="see-all"><?php echo $text_all; ?> <?php echo $category['name']; ?></a> </div>
        </li>
        <?php } else { ?>
        <li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></li>
        <?php } ?>
        <?php } ?>
      </ul>
    </div>
  </nav>
</div>
<?php } ?>


Если вы измените header.tpl примерно следующим образом - так, как показано далее - проблема произвольного отображения вложенных пунктов меню (они же child-категории товаров, экспортированных из 1С) окажется, пожалуй, решенной. Взгляните:


<?php
$filteredCategories = array(
  'Запчасти для отопителей и подогревателей' => 'запчасти',
  'Автозапчасти' => 'Запчасти ',
  'Предпусковые подогреватели' => 'ЖИДКОСТНЫЕ',
  'Подогреватели' => ' ПОДОГРЕВАТЕЛИ',
  'Электроподогреватели' => 'ЭЛЕКТРОПОДОГРЕВАТЕЛИ',
  'Теплостар' => 'Теплостар',
  'Элтра' => 'Элтра',
  'Эбершпехер' => 'Эбершпехер'
);
$allChilds = array_reduce(
  array_column($categories, 'children')
  ,'array_merge'
  ,array()
);
if ($categories) {?>
<div class="container">
  <nav id="menu" class="navbar">
    <div class="navbar-header"><span id="category" class="visible-xs"><?php echo $text_category; ?></span>
      <button type="button" class="btn btn-navbar navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse"><i class="fa fa-bars"></i></button>
    </div>
    <div class="collapse navbar-collapse navbar-ex1-collapse">
      <ul class="nav navbar-nav">
        <?php
        foreach ($categories as $category) {
            if (!empty($filteredCategories[$category['name']])){
              $childrensFiltered = array_filter(
                $allChilds
                ,function($v) use ($category, $filteredCategories){return false != stristr($v['name'], strtolower($filteredCategories[$category['name']])); }
              );
            ?>
              <li class="dropdown"><a href="<?php echo $category['href']; ?>" class="dropdown-toggle" data-toggle="dropdown"><?php echo $category['name']; ?></a>
                <div class="dropdown-menu">
                  <div class="dropdown-inner">
                    <?php foreach (array_chunk($childrensFiltered, max(ceil(count($childrensFiltered) / $category['column']), 1)) as $children) {?>
                      <ul class="list-unstyled">
                         <?php foreach ($children as $child) {?>
                           <li><a href="<?php echo $child['href']; ?>"><?php echo $child['name'];?></a></li>
                         <?php }?>
                      </ul>
                    <?php }?>
                  </div>
              </li>
            <?php }
          else {?>
            <li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></li>
          <?php
          }
        }?>
      </ul>
    </div>
  </nav>
</div>
<?php } ?>


Начинаем с того, что создаем ассоциативный массив, ключи которого равнозначны необходимым категориям (пунктам меню верхнего уровня), которые создаем вручную в админке OpenCart, а значения являются фильтрами, руководствуясь которыми далее реализуем выборку дочерних категорий (dropdown пунктов меню) для родительских пунктов меню , вот собственно, и все. Также, как видите, я убрал нововведение, появившееся во второй линейке OpenCart - фразу «смотреть все» для подкатегорий, подробнее см. топик Трюки и хаки OpenCart
Последнее редактирование: 10 мес. 1 нед. назад от Aleksej.
Спасибо сказали: superlamer

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
10 мес. 1 нед. назад - 10 мес. 1 нед. назад #2 от superlamer
superlamer ответил в теме CommerceML: импорт товаров в OpenCart
Два "но". Первое, фильтры, реализованные таким образом, очень чувствительны, к регистру, даже к пробелам. В коде массива видно, что необходимо, вероятно, прибегать то к строчным то к прописным буквам, чтобы массив согласовывался с названиями субкатегорий товаров в выгрузке CommerceML, даже пробелы кое-где расставлены. Но это ладно, гораздо хуже то, что дефолтные категории, которые из корня выгрузки, так и остаются в меню, и если их скрыть в опциях админки "Категории" (или сделать подчиненными другому корню), цикл перестает работать. Одно из решений заключается, в переименовании верхних пунктов меню в любые другие (например в те, которые в массиве в header.tpl), в какой то степени это решение проблемы.
Последнее редактирование: 10 мес. 1 нед. назад от superlamer.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.