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

[Решено] Взять и выстроить категории


nestling

Recommended Posts

Добрый день уважаемые программисты!

Может быть у кого то из вас в кулуарах имеется хак, для вывода всех категорий в данной структуре:

{id, name, items: [{id,name, items: []}, {id,name,items: [{...},{...}]}]}
, где id= id категории, name=имя категории. Змінено користувачем afwollis
Надіслати
Поділитися на інших сайтах


  • 3 weeks later...

в 14х использовал такой код для получения всех категорий

контроллер

	private function getCategories($parent_id, $level = 0) {
		$level++;
		$data = array();
		$results = $this->model_catalog_category->getCategories($parent_id);
		foreach ($results as $result) {
			$data[] = array(
				'category_id' => $result['category_id'],
				'name'        => str_repeat('    ', $level) . $result['name']
			);
			$children = $this->getCategories($result['category_id'], $level);
			if ($children) {
				$data = array_merge($data, $children);
			}
		}
		return $data;
	}
модель

	public function getCategories($parent_id = 0) {
		$category_data = $this->cache->get('category.' . $parent_id . '.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'));
		
		if (!$category_data && !is_array($category_data)) {
			$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.sort_order <> '-1' ORDER BY c.sort_order, LCASE(cd.name)");
			
			$category_data = $query->rows;
			
			$this->cache->set('category.' . $parent_id . '.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id'), $category_data);
		}
		
		return $category_data;
	}

берешь и подгоняешь под свои нужды с учетом версии движка

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

Все прекрасно, кроме проблемы с названием категории. Он записывает в название категории её родителей и дефисы, прим. Components  >  Mice and Trackballs, Возможно избавиться от этого?

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


проверил только что на ocStore_15512 - ничего подобного не делает.

переименуй методы/кэш, чтобы гарантированно не пересекались с существующим у тебя кодом.

upd:

в контроллере содержимое метода можно заменить на

		$level++;
		$data = array();
		$results = $this->model_catalog_category->getCategories($parent_id);
		foreach ($results as $result) {
			$children = $this->getCategories($result['category_id'], $level);
			$data[] = array(
				'id'          => $result['category_id'],
				//'category_id' => $result['category_id'],
				'lvl'         => $level,
				'name'        => $result['name'],
				//'children'    => (isset($children) & !empty($children)) ? $children : array(),
				'items'       => (isset($children) & !empty($children)) ? $children : array()
			);
		}
		return $data;
Змінено користувачем afwollis
upd
Надіслати
Поділитися на інших сайтах

Да да, это моя не внимательность.  В свою модуль засунул ваши запросы, а в контроллере обращаюсь к прописанной вами модели из другой категории. Да с именами все супер.

Только не понятно:

1) обращаюсь к функции из другой функции, исп. $listResultCategories['list'] = $this->getCategories(0, $level); опции в вызове функции (0, $level) верные? Или можно обе оставить пустые? Плохо понимаю, что должно быть в самом начале у $parent_id.

2) Под категории почему то не заносятся в доп. массив. (мб что то не то сделал, проверю)

Спасибо

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


$categories14x = $this->getCategories(0); // первый вызов - корень (category_id = 0) и всё
2. что-то недокрутил или перекрутил. пересмотри моё предыдущее сообщение - там код для тебя.
Надіслати
Поділитися на інших сайтах

Странно, сделал как вы. Вот функция, в ней вызов вашей функции:

$listResultCategories['list'] = $this->getCategories(0);

Ваша функция:

    private function getCategories($parent_id, $level = 0) {
        $level++;
        $data = array();
        $results = $this->model_lena_pillars_main->getCategories($parent_id);
        foreach ($results as $result) {
            $data[] = array(
                'id' => $result['category_id'],
                'name' => $result['name'],
                'lvl' => $level,
                'type' => 'category',
                "typeName"=>"Категория",
                'image'=> 'null',
                'miniDesc'=>'',
                'sort'  => $result['sort_order'],
                'items' => (isset($children) & !empty($children)) ? $children : array()
            );
            /*
            $children = $this->getCategories($result['category_id'], $level);
            if ($children) {
                $data = array_merge($data, $children);
            }*/
        }
         return $data;
    }
На выходе: 
  1. list[{id: "20", name: "Desktops", lvl: 1, type: "category", typeName: "Категория", image: "null",…},…]
    1. 0{id: "20", name: "Desktops", lvl: 1, type: "category", typeName: "Категория", image: "null",…}
    2. 1{id: "18", name: "Laptops & Notebooks", lvl: 1, type: "category", typeName: "Категория",…}
    3. 2{id: "25", name: "Components", lvl: 1, type: "category", typeName: "Категория", image: "null",…}
    4. 3{id: "57", name: "Tablets", lvl: 1, type: "category", typeName: "Категория", image: "null",…}
    5. 4{id: "17", name: "Software", lvl: 1, type: "category", typeName: "Категория", image: "null",…}
    6. 5{id: "24", name: "Phones & PDAs", lvl: 1, type: "category", typeName: "Категория", image: "null",…}
    7. 6{id: "33", name: "Cameras", lvl: 1, type: "category", typeName: "Категория", image: "null",…}
    8. 7{id: "34", name: "MP3 Players", lvl: 1, type: "category", typeName: "Категория", image: "null",…}
  2. title"Категории"
  3. type"category"

Если раскоментировать: 

 /*
            $children = $this->getCategories($result['category_id'], $level);
            if ($children) {
                $data = array_merge($data, $children);
            }*/
то выводятся и другие уровни, но не внутри родителей. 
Версия OC2++
Надіслати
Поділитися на інших сайтах


...то выводятся и другие уровни, но не внутри родителей...

сказано же было - смотри предыдущее сообщение.

вот это: https://opencartforum.com/topic/50941-%D0%B2%D0%B7%D1%8F%D1%82%D1%8C-%D0%B8-%D0%B2%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8/?do=findComment&comment=453721

Версия OC2++

еще бы через год это написал... :?

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

Читал, не заметил строчку

$children = $this->getCategories($result['category_id'], $level);
Спасибо вам. Змінено користувачем afwollis
Надіслати
Поділитися на інших сайтах


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

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

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

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

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

Вхід

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

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

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

×
×
  • Створити...

Important Information

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