Перейти к содержанию
nestling

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

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

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

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

{id, name, items: [{id,name, items: []}, {id,name,items: [{...},{...}]}]}
, где id= id категории, name=имя категории. Изменено пользователем afwollis

Поделиться сообщением


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

Сколько может стоить данное решение? Формирование в json ответ, не более.

Поделиться сообщением


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

От $5. Обращайтесь, если интересно.

Поделиться сообщением


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

в 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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

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

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