Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

в стандартном оксторе 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 вообще идеален)

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.