Jump to content
Sign in to follow this  
nestling

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

Recommended Posts

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

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

{id, name, items: [{id,name, items: []}, {id,name,items: [{...},{...}]}]}
, где id= id категории, name=имя категории. Edited by afwollis

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

в 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;
	}

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

проверил только что на 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;
Edited by afwollis
upd

Share this post


Link to post
Share on other sites

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

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

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

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

Спасибо

Share this post


Link to post
Share on other sites
$categories14x = $this->getCategories(0); // первый вызов - корень (category_id = 0) и всё
2. что-то недокрутил или перекрутил. пересмотри моё предыдущее сообщение - там код для тебя.

Share this post


Link to post
Share on other sites

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

$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++

Share this post


Link to post
Share on other sites

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

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

вот это: 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++

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

Share this post


Link to post
Share on other sites

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

$children = $this->getCategories($result['category_id'], $level);
Спасибо вам. Edited by afwollis

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.