Привет! По-умолчанию, в OpenCart 2 и более ранних версий стандартный поиск работает только для категорий вложенности не более 3. То есть, если у вас есть дочерние категории 4 уровня вложенности и этим категориям назначены товары, то стандартный поиск ОпенКарт не сможет найти эти товары. Это досадное упущение действует для тех товаров, которым назначены категории 4 и большего уровня вложенности в качестве главных категорий.
Исправить эту ситуации довольно просто, что и сделаем в этой статье.
Стандартный 3-х уровневый поиск OpenCart 2
Итак, сначала рассмотрим суть проблемы. Открываем страницу поиска по сайту на ОпенКарт 2 и смотрим имеющийся там выбор категорий (предварительно были созданы все необходимые категории: главная и дочерние до 4-го уровня):
Как видим, отображаются только категории до 3-го уровня, в чем и заключается наша проблема, так как у нас 4 уровня вложенности.
Решение проблемы со стандартным поиском
Давайте решим нашу проблему, но сначала нужно найти где она кроется. Для этого открываем файл search.php, расположенный по пути: корень_сайта/catalog/controller/product/.
Немного прокручиваем содержимое файла вниз и находим такой комментарий:
// 3 Level Category Search
Именно он и сообщает, что стандартный поиск по категориям работает только для категорий не более 3-го уровня. Далее идёт код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$data['categories'] = array(); $categories_1 = $this->model_catalog_category->getCategories(0); foreach ($categories_1 as $category_1) { $level_2_data = array(); $categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']); foreach ($categories_2 as $category_2) { $level_3_data = array(); $categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']); foreach ($categories_3 as $category_3) { $level_3_data[] = array( 'category_id' => $category_3['category_id'], 'name' => $category_3['name'], ); } $level_2_data[] = array( 'category_id' => $category_2['category_id'], 'name' => $category_2['name'], 'children' => $level_3_data ); } $data['categories'][] = array( 'category_id' => $category_1['category_id'], 'name' => $category_1['name'], 'children' => $level_2_data ); } $data['products'] = array(); |
Чтобы включить поиск по категориям 4-го уровня, необходимо его слегка изменить, а именно — добавить массив с категориями 4-го уровня. Для этого приведённый выше код заменяем на следующий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
// 4 Level Category Search $data['categories'] = array(); $categories_1 = $this->model_catalog_category->getCategories(0); foreach ($categories_1 as $category_1) { $level_2_data = array(); $categories_2 = $this->model_catalog_category->getCategories($category_1['category_id']); foreach ($categories_2 as $category_2) { $level_3_data = array(); $categories_3 = $this->model_catalog_category->getCategories($category_2['category_id']); foreach ($categories_3 as $category_3) { $level_4_data = array(); $categories_4 = $this->model_catalog_category->getCategories($category_3['category_id']); foreach ($categories_4 as $category_4) { $level_4_data[] = array( 'category_id' => $category_4['category_id'], 'name' => $category_4['name'], ); } $level_3_data[] = array( 'category_id' => $category_3['category_id'], 'name' => $category_3['name'], 'children' => $level_4_data ); } $level_2_data[] = array( 'category_id' => $category_2['category_id'], 'name' => $category_2['name'], 'children' => $level_3_data ); } $data['categories'][] = array( 'category_id' => $category_1['category_id'], 'name' => $category_1['name'], 'children' => $level_2_data ); } $data['products'] = array(); |
Половина дела сделана, теперь нужно добавить отображение категорий 4-го уровня вложенности в SELECT на странице поиска по сайту OpenCart2. Для этого открываем файл search.tpl, расположенный по пути: корень_сайта/catalog/view/theme/*Название_используемой_темы*/template/product/.
Код, отвечающий за вывод категорий, которые можно выбрать для поиска по ним, выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<select name="category_id" class="form-control"> <option value="0"><?php echo $text_category; ?></option> <?php foreach ($categories as $category_1) { ?> <?php if ($category_1['category_id'] == $category_id) { ?> <option value="<?php echo $category_1['category_id']; ?>" selected="selected"><?php echo $category_1['name']; ?></option> <?php } else { ?> <option value="<?php echo $category_1['category_id']; ?>"><?php echo $category_1['name']; ?></option> <?php } ?> <?php foreach ($category_1['children'] as $category_2) { ?> <?php if ($category_2['category_id'] == $category_id) { ?> <option value="<?php echo $category_2['category_id']; ?>" selected="selected"> <?php echo $category_2['name']; ?></option> <?php } else { ?> <option value="<?php echo $category_2['category_id']; ?>"> <?php echo $category_2['name']; ?></option> <?php } ?> <?php foreach ($category_2['children'] as $category_3) { ?> <?php if ($category_3['category_id'] == $category_id) { ?> <option value="<?php echo $category_3['category_id']; ?>" selected="selected"> <?php echo $category_3['name']; ?></option> <?php } else { ?> <option value="<?php echo $category_3['category_id']; ?>"> <?php echo $category_3['name']; ?></option> <?php } ?> <?php } ?> <?php } ?> <?php } ?> </select> |
Нам нужно добавить сюда выбор категорий 4-го уровня. Заменяем его на такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<select name="category_id" class="form-control"> <option value="0"><?php echo $text_category; ?></option> <?php foreach ($categories as $category_1) { ?> <?php if ($category_1['category_id'] == $category_id) { ?> <option value="<?php echo $category_1['category_id']; ?>" selected="selected"><?php echo $category_1['name']; ?></option> <?php } else { ?> <option value="<?php echo $category_1['category_id']; ?>"><?php echo $category_1['name']; ?></option> <?php } ?> <?php foreach ($category_1['children'] as $category_2) { ?> <?php if ($category_2['category_id'] == $category_id) { ?> <option value="<?php echo $category_2['category_id']; ?>" selected="selected"> <?php echo $category_2['name']; ?></option> <?php } else { ?> <option value="<?php echo $category_2['category_id']; ?>"> <?php echo $category_2['name']; ?></option> <?php } ?> <?php foreach ($category_2['children'] as $category_3) { ?> <?php if ($category_3['category_id'] == $category_id) { ?> <option value="<?php echo $category_3['category_id']; ?>" selected="selected"> <?php echo $category_3['name']; ?></option> <?php } else { ?> <option value="<?php echo $category_3['category_id']; ?>"> <?php echo $category_3['name']; ?></option> <?php foreach ($category_3['children'] as $category_4) { ?> <?php if ($category_4['category_id'] == $category_id) { ?> <option value="<?php echo $category_4['category_id']; ?>" selected="selected"> <?php echo $category_4['name']; ?></option> <?php } else { ?> <option value="<?php echo $category_4['category_id']; ?>"> <?php echo $category_4['name']; ?></option> <?php } ?> <?php } ?> <?php } ?> <?php } ?> <?php } ?> <?php } ?> </select> |
Обратите внимание, что мы слегка убрали пробелы и разделили для наглядности уровни выбора. Сохраняем все изменения, чистым кэш системы и кэш дополнений, переходим на сайт и смотрим:
Появилась возможность выбора категорий 4-го уровня вложенности и поиск по ним работает также хорошо, как и до наших изменений. Что и требовалось сделать!