Как создать и настроить свой веб-сервер на VDS (05 сен 2024)

Осенью самое время заняться установкой и тюнингом своего веб-сервера. Не правда ли?

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

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

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

Code:
<?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С) окажется, пожалуй, решенной. Взгляните:


Code:
<?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
Последнее редактирование: 7 года 11 мес. назад пользователем Aleksej.
Спасибо сказали: superlamer

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

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

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

Работает на Kunena форум