Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

вывод категорий в шапке (окстор)


AlexMax13
 Поделиться

Рекомендованные сообщения

в стандартном оксторе 3.0.2.0 есть вывод выбранных категорий в шапке, но у меня какой то треш.

 

вне зависимости что я отметил тут https://prnt.sc/mWLQzpr3-3r6 выводит сразу все категории. в бд все ок https://prnt.sc/q6HLrd2leXTf 

 

но на сайте выводит все категории игнорируя отмеченный пункт для топа https://prnt.sc/Wcy11Rp61sQ9 выяснил что для сайта всегда топ выводит значение 1 при любом раскладе.

 

контроллер:

 

$categories = $this->model_catalog_category->getCategories(0);

		foreach ($categories as $category) {
			if ($category['top']) {
				// Level 2
				$children_data = array();

				$children = $this->model_catalog_category->getCategories($category['category_id']);

				foreach ($children as $child) {
					$filter_data = array(
						'filter_category_id'  => $child['category_id'],
						'filter_sub_category' => true
					);

					$children_data[] = array(
						'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
						'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
					);
				}

				// Level 1
				$data['categories'][] = array(
					'sid'	   => $category['category_id'],
					'name'     => $category['name'],
					'children' => $children_data,
					'column'   => $category['column'] ? $category['column'] : 1,
					'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
				);
			}
		}

 

 

твиг:

{% if categories %}
    {% for category in categories %}
        {% if category.children %}
                {% if category.sid == 59 %}
                    <a href="{{ category.href }}" class="gl_cat"><span><img src="/image/catalog/icons/katalog.svg"> {{ category.name }}</span></a>
                {% else %}
                    <a href="{{ category.href }}" class="gl_cat"><span>{{ category.name }}</span></a>
                {% endif %}
                {% for children in category.children|batch(category.children|length / category.column|round(1, 'ceil')) %}
                {% for child in children %}
                    <a href="{{ child.href }}" class="rod_cat"><span>{{ child.name }}</span></a>
                {% endfor %}
                {% endfor %}
        {% else %}
            <a href="{{ category.href }}" class="gl_cat"><span>{{ category.name }}</span></a>
        {% endif %}
    {% endfor %}
{% endif %} 

 

 

модель:

public function getCategories($parent_id = 0) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'  AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)");

		return $query->rows;
	}

 

 

проблему решил так:

контроллер:

$categories = $this->model_catalog_category->get_menu_top(0);

		foreach ($categories as $category) {
			if ($category['top']) {
				// Level 2
				$children_data = array();

				$children = $this->model_catalog_category->get_menu_top($category['category_id']);

				foreach ($children as $child) {
					$filter_data = array(
						'filter_category_id'  => $child['category_id'],
						'filter_sub_category' => true
					);

					$children_data[] = array(
						'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
						'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
					);
				}

				// Level 1
				$data['categories'][] = array(
					'sid'	   => $category['category_id'],
					'name'     => $category['name'],
					'children' => $children_data,
					'column'   => $category['column'] ? $category['column'] : 1,
					'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
				);
			}
		}

 

модель:

public function get_menu_top($parent_id = 0) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'  AND c.status = '1' AND c.top = '1' ORDER BY c.sort_order, LCASE(cd.name)");

		return $query->rows;
	}

 

но все же интересно, это баг окстора или что?

Ссылка на комментарий
Поделиться на других сайтах


01.01.2023 в 13:50, AlexMax13 сказал:

но все же интересно, это баг окстора или что?

Это не баг, а так создатель хотел. И правки нужно в контроллере делать, а не в модели.

if ($category['top']) {

if ($child['top']) {

или отдельную модель для меню делайте.

Изменено пользователем buslikdrev
  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

01.01.2023 в 13:50, AlexMax13 сказал:
AND c.status = '1' AND c.top = '1' ORDER BY c.sort_order, LCASE(cd.name)");

Ту наверное стоит учитывать, что стандартные методы модели могут использоваться не в одном месте, а вы уже отсекли все которые top = 0. А может в другом месте нужно вывести все категории, а не только отмеченные как у вас?

Сделайте свой метод, отдельный для выборки категорий с top = 1.

 

Если взять модуль стандартный, который выводит все категории в столбец слева - там та же модель https://screenrec.com/share/LlM4WtNyQu 

И после правок там у вас будут только категории top = 1, что может подойти не всем

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

В 01.01.2023 в 16:26, buslikdrev сказав:

Это не баг, а так создатель хотел. И правки нужно в контроллере делать, а не в модели.

if ($category['top']) {

if ($child['top']) {

или отдельную модель для меню делайте.

 

спасибо, то что надо. сделал так и без лишних правок:

 

$categories = $this->model_catalog_category->getCategories(0);

		foreach ($categories as $category) {
			if ($category['top']) {
				// Level 2
				$children_data = array();

				$children = $this->model_catalog_category->getCategories($category['category_id']);

				foreach ($children as $child) {
					if ($child['top']) {
						$filter_data = array(
							'filter_category_id'  => $child['category_id'],
							'filter_sub_category' => true
						);

						$children_data[] = array(
							'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
							'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
						);
					}
				}

				// Level 1
				$data['categories'][] = array(
					'sid'	   => $category['category_id'],
					'name'     => $category['name'],
					'children' => $children_data,
					'column'   => $category['column'] ? $category['column'] : 1,
					'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
				);
			}
		}

 

Ссылка на комментарий
Поделиться на других сайтах


В 01.01.2023 в 18:42, bogdan281989 сказав:

Ту наверное стоит учитывать, что стандартные методы модели могут использоваться не в одном месте, а вы уже отсекли все которые top = 0. А может в другом месте нужно вывести все категории, а не только отмеченные как у вас?

Сделайте свой метод, отдельный для выборки категорий с top = 1.

 

Если взять модуль стандартный, который выводит все категории в столбец слева - там та же модель https://screenrec.com/share/LlM4WtNyQu 

И после правок там у вас будут только категории top = 1, что может подойти не всем

 

да, вы правы. но я изначально добавил отельную функцию в модель и изменил название функции в контроллере, чтобы не было конфликтов. но вариант от buslikdrev вообще идеален)

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.