Перейти к содержимому


Фото
- - - - -

Кто-нибудь знает как реализовать подкатегории у "брендов"

бренды подкатегории уровни

  • Чтобы отвечать, сперва войдите на форум
11 ответов в теме

#1 cepreu

cepreu
  • Пользователь
  • 3 сообщений
  • Версия CMS:2.x

Опубликовано 11.07.2014 - 13:40

Нужно реализация суб-брендов. Кто-нибудь делал? Нужно по мимо брендов выводить линию бренда (косметика)



#2 mart

mart

    Дружу с Симплой

  • Фрилансер
  • 1 331 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Venlo

Опубликовано 11.07.2014 - 15:56

Добавляете в брендах parent_id, а в адресе делаете что-то типа brand-collection и в htaccess разбираете строку



#3 cepreu

cepreu
  • Пользователь
  • 3 сообщений
  • Версия CMS:2.x

Опубликовано 12.07.2014 - 23:12

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(255) NOT NULL DEFAULT '',
  `url` varchar(255) NOT NULL DEFAULT '',
  `meta_title` varchar(500) NOT NULL,
  `meta_keywords` varchar(500) NOT NULL,
  `meta_description` varchar(500) NOT NULL,
  `description` text NOT NULL,
  `image` varchar(255) NOT NULL,
  `position` int(11) NOT NULL,

заменил функцию в brands.php как у категорий
 

		// Список указателей на категории в дереве категорий (ключ = id категории)
private $all_brands;
	// Дерево категорий
private $brands_tree;

public function get_brands_tree()
	{
		if(!isset($this->brands_tree))
			$this->init_brands();
			
		return $this->brands_tree;
	}


private function init_brands()
	{
		// Дерево категорий
		$tree = new stdClass();
		$tree->subbrands = array();
		
		// Указатели на узлы дерева
		$pointers = array();
		$pointers[0] = &$tree;
		$pointers[0]->path = array();
		$pointers[0]->level = 0;
		
		// Выбираем все категории
		$query = $this->db->placehold("SELECT DISTINCT b.id,b.parent_id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
								 		FROM __brands b ORDER BY b.position");
											
		// Выбор категорий с подсчетом количества товаров для каждой. Может тормозить при большом количестве товаров.
		// $query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.description, c.url, c.meta_title, c.meta_keywords, c.meta_description, c.image, c.visible, c.position, COUNT(p.id) as products_count
		//                               FROM __categories c LEFT JOIN __products_categories pc ON pc.category_id=c.id LEFT JOIN __products p ON p.id=pc.product_id AND p.visible GROUP BY c.id ORDER BY c.parent_id, c.position");
		
		
		$this->db->query($query);
		$brands = $this->db->results();
		$finish = false;
		// Не кончаем, пока не кончатся категории, или пока ниодну из оставшихся некуда приткнуть
		while(!empty($brands)  && !$finish)
		{
			$flag = false;
			// Проходим все выбранные категории
			foreach($brands as $k=>$brand)
			{
			
				if(isset($pointers[$brand->parent_id]))
				{

					// В дерево категорий (через указатель) добавляем текущую категорию
					$pointers[$brand->id] = $pointers[$brand->parent_id]->subbrands[] = $brand;
					
					// Путь к текущей категории
					$curr = $pointers[$brand->id];
					$pointers[$brand->id]->path = array_merge((array)$pointers[$brand->parent_id]->path, array($curr));
					
					// Уровень вложенности категории
					$pointers[$brand->id]->level = 1+$pointers[$brand->parent_id]->level;

					// Убираем использованную категорию из массива категорий
					unset($brands[$k]);
					$flag = true;
				}
			}
			if(!$flag) $finish = true;
		}
		
		// Для каждой категории id всех ее деток узнаем
		$ids = array_reverse(array_keys($pointers));
		foreach($ids as $id)
		{
			if($id>0)
			{
				$pointers[$id]->children[] = $id;

				if(isset($pointers[$pointers[$id]->parent_id]->children))
					$pointers[$pointers[$id]->parent_id]->children = array_merge($pointers[$id]->children, $pointers[$pointers[$id]->parent_id]->children);
				else
					$pointers[$pointers[$id]->parent_id]->children = $pointers[$id]->children;
					
				// Добавляем количество товаров к родительской категории, если текущая видима
				// if(isset($pointers[$pointers[$id]->parent_id]) && $pointers[$id]->visible)
				//		$pointers[$pointers[$id]->parent_id]->products_count += $pointers[$id]->products_count;
			}
		}
		unset($pointers[0]);
		unset($ids);

		$this->brands_tree = $tree->subbrands;
		$this->all_brands = $pointers;	
	}

Вывод в brandsAdmin.php && BrandAdmin.php 
 

$brands = $this->brands->get_brands_tree();

В шаблонах. В brand.tpl
 

<!-- Основная форма -->
<form method=post id=product enctype="multipart/form-data">
<input type=hidden name="session_id" value="{$smarty.session.id}">
	<div id="name">
		<input class="name" name=name type="text" value="{$brand->name|escape}"/> 
		<input name=id type="hidden" value="{$brand->id|escape}"/> 
	</div> 
	<div id="product_categories">
			<select name="parent_id">
				<option value='0'>Корневой бренд</option>
			{function name=brand_select level=0}
				{foreach from=$brands item=b}
					{if $b->id != $brand->id}
						<option value='{$b->id}' {if $brand->parent_id == $b->id}selected{/if}>{section name=sp loop=$level}&nbsp;&nbsp;&nbsp;&nbsp;{/section}{$b->name}</option>
						{brand_select brands=$b->subbrands level=$level+1}
					{/if}
				{/foreach}
				{/function}
				{brand_select brands=$brands}
			</select>
	</div>

В brands.tpl
 

<div id="main_list" class="brands">

	<form id="list_form" method="post">
	<input type="hidden" name="session_id" value="{$smarty.session.id}">
		
		{function name=brand_select level=0}
		{if $brands}
		<div id="list" class="sortable">
		{foreach $brands as $b}
			{if $b}
			<div class="row">		
				<div class="tree_row">
					<input type="hidden" name="positions[{$b->id}]" value="{$b->position}">
					<div class="move cell" style="margin-left:{$level*20}px"><div class="move_zone"></div></div>
			 		<div class="checkbox cell">
						<input type="checkbox" name="check[]" value="{$b->id}" />				
					</div>
					<div class="cell">
						<a href="{url module=BrandAdmin id=$b->id return=$smarty.server.REQUEST_URI}">{$b->name|escape}|{$level}</a> 	 			
					</div>
					<div class="icons cell">
						<a class="preview" title="Предпросмотр в новом окне" href="../catalog/{$b->url}" target="_blank"></a>				
						<a class="delete" title="Удалить" href="#"></a>
					</div>
					<div class="clear"></div>
				</div>
				{brand_select brands=$b->subbrands level=$level+1}
			</div>
				{/if}
		{/foreach}	
		</div>
		{/if}
		{/function}
		{brand_select brands=$brands}


#4 Kosjak76

Kosjak76
  • Модератор
  • 3 837 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 12.07.2014 - 23:15

Бред сивой кобылы...



#5 cepreu

cepreu
  • Пользователь
  • 3 сообщений
  • Версия CMS:2.x

Опубликовано 13.07.2014 - 01:12

Бред сивой кобылы...

Конкретнее не могли бы выразить свою мысль, пожалуйста? Что-то не правильно или я неправильно оформил? Я спрашивал решение, не дождавшись сделал сам.



#6 n1c

n1c
  • Пользователь
  • 253 сообщений
  • Дизайн, Верстка
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 04.10.2015 - 14:12

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(255) NOT NULL DEFAULT '',
  `url` varchar(255) NOT NULL DEFAULT '',
  `meta_title` varchar(500) NOT NULL,
  `meta_keywords` varchar(500) NOT NULL,
  `meta_description` varchar(500) NOT NULL,
  `description` text NOT NULL,
  `image` varchar(255) NOT NULL,
  `position` int(11) NOT NULL,

заменил функцию в brands.php как у категорий
 

		// Список указателей на категории в дереве категорий (ключ = id категории)
private $all_brands;
	// Дерево категорий
private $brands_tree;

public function get_brands_tree()
	{
		if(!isset($this->brands_tree))
			$this->init_brands();
			
		return $this->brands_tree;
	}


private function init_brands()
	{
		// Дерево категорий
		$tree = new stdClass();
		$tree->subbrands = array();
		
		// Указатели на узлы дерева
		$pointers = array();
		$pointers[0] = &$tree;
		$pointers[0]->path = array();
		$pointers[0]->level = 0;
		
		// Выбираем все категории
		$query = $this->db->placehold("SELECT DISTINCT b.id,b.parent_id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
								 		FROM __brands b ORDER BY b.position");
											
		// Выбор категорий с подсчетом количества товаров для каждой. Может тормозить при большом количестве товаров.
		// $query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.description, c.url, c.meta_title, c.meta_keywords, c.meta_description, c.image, c.visible, c.position, COUNT(p.id) as products_count
		//                               FROM __categories c LEFT JOIN __products_categories pc ON pc.category_id=c.id LEFT JOIN __products p ON p.id=pc.product_id AND p.visible GROUP BY c.id ORDER BY c.parent_id, c.position");
		
		
		$this->db->query($query);
		$brands = $this->db->results();
		$finish = false;
		// Не кончаем, пока не кончатся категории, или пока ниодну из оставшихся некуда приткнуть
		while(!empty($brands)  && !$finish)
		{
			$flag = false;
			// Проходим все выбранные категории
			foreach($brands as $k=>$brand)
			{
			
				if(isset($pointers[$brand->parent_id]))
				{

					// В дерево категорий (через указатель) добавляем текущую категорию
					$pointers[$brand->id] = $pointers[$brand->parent_id]->subbrands[] = $brand;
					
					// Путь к текущей категории
					$curr = $pointers[$brand->id];
					$pointers[$brand->id]->path = array_merge((array)$pointers[$brand->parent_id]->path, array($curr));
					
					// Уровень вложенности категории
					$pointers[$brand->id]->level = 1+$pointers[$brand->parent_id]->level;

					// Убираем использованную категорию из массива категорий
					unset($brands[$k]);
					$flag = true;
				}
			}
			if(!$flag) $finish = true;
		}
		
		// Для каждой категории id всех ее деток узнаем
		$ids = array_reverse(array_keys($pointers));
		foreach($ids as $id)
		{
			if($id>0)
			{
				$pointers[$id]->children[] = $id;

				if(isset($pointers[$pointers[$id]->parent_id]->children))
					$pointers[$pointers[$id]->parent_id]->children = array_merge($pointers[$id]->children, $pointers[$pointers[$id]->parent_id]->children);
				else
					$pointers[$pointers[$id]->parent_id]->children = $pointers[$id]->children;
					
				// Добавляем количество товаров к родительской категории, если текущая видима
				// if(isset($pointers[$pointers[$id]->parent_id]) && $pointers[$id]->visible)
				//		$pointers[$pointers[$id]->parent_id]->products_count += $pointers[$id]->products_count;
			}
		}
		unset($pointers[0]);
		unset($ids);

		$this->brands_tree = $tree->subbrands;
		$this->all_brands = $pointers;	
	}

Вывод в brandsAdmin.php && BrandAdmin.php 
 

$brands = $this->brands->get_brands_tree();

В шаблонах. В brand.tpl
 

<!-- Основная форма -->
<form method=post id=product enctype="multipart/form-data">
<input type=hidden name="session_id" value="{$smarty.session.id}">
	<div id="name">
		<input class="name" name=name type="text" value="{$brand->name|escape}"/> 
		<input name=id type="hidden" value="{$brand->id|escape}"/> 
	</div> 
	<div id="product_categories">
			<select name="parent_id">
				<option value='0'>Корневой бренд</option>
			{function name=brand_select level=0}
				{foreach from=$brands item=b}
					{if $b->id != $brand->id}
						<option value='{$b->id}' {if $brand->parent_id == $b->id}selected{/if}>{section name=sp loop=$level}&nbsp;&nbsp;&nbsp;&nbsp;{/section}{$b->name}</option>
						{brand_select brands=$b->subbrands level=$level+1}
					{/if}
				{/foreach}
				{/function}
				{brand_select brands=$brands}
			</select>
	</div>

В brands.tpl
 

<div id="main_list" class="brands">

	<form id="list_form" method="post">
	<input type="hidden" name="session_id" value="{$smarty.session.id}">
		
		{function name=brand_select level=0}
		{if $brands}
		<div id="list" class="sortable">
		{foreach $brands as $b}
			{if $b}
			<div class="row">		
				<div class="tree_row">
					<input type="hidden" name="positions[{$b->id}]" value="{$b->position}">
					<div class="move cell" style="margin-left:{$level*20}px"><div class="move_zone"></div></div>
			 		<div class="checkbox cell">
						<input type="checkbox" name="check[]" value="{$b->id}" />				
					</div>
					<div class="cell">
						<a href="{url module=BrandAdmin id=$b->id return=$smarty.server.REQUEST_URI}">{$b->name|escape}|{$level}</a> 	 			
					</div>
					<div class="icons cell">
						<a class="preview" title="Предпросмотр в новом окне" href="../catalog/{$b->url}" target="_blank"></a>				
						<a class="delete" title="Удалить" href="#"></a>
					</div>
					<div class="clear"></div>
				</div>
				{brand_select brands=$b->subbrands level=$level+1}
			</div>
				{/if}
		{/foreach}	
		</div>
		{/if}
		{/function}
		{brand_select brands=$brands}

 

 

Не открывается список выбора бренда



#7 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 04.10.2015 - 14:47

Похоже, $brands   в шаблоне не определена...



#8 n1c

n1c
  • Пользователь
  • 253 сообщений
  • Дизайн, Верстка
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 24.10.2015 - 15:52

Похоже, $brands   в шаблоне не определена...

 

По шаблону вопросов нет. Где-то в другом коде ошибка.



#9 n1c

n1c
  • Пользователь
  • 253 сообщений
  • Дизайн, Верстка
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 25.10.2015 - 10:36

Сделал, работает, но не сохраняет как подбренд, похоже проблема с "parent_id", хотя parent_id задан и в Brand.php и в БД, та и в коде ошибки не вижу.



#10 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 25.10.2015 - 11:35

Видимо, Вы это значение в контроллере не встречаете. Во всяком случае, в приведенном коде нигде обработки parent_id нет...



#11 n1c

n1c
  • Пользователь
  • 253 сообщений
  • Дизайн, Верстка
  • Версия CMS:2.x
  • Откуда:Украина

Опубликовано 25.10.2015 - 11:49

Видимо, Вы это значение в контроллере не встречаете. Во всяком случае, в приведенном коде нигде обработки parent_id нет...

 

Спасибо за подсказку) Сразу нашел в чем проблема) надо добавить еще в BrandAdmin.php код $brand->parent_id = $this->request->post('parent_id', 'integer');



#12 MaLeN

MaLeN
  • Пользователь
  • 67 сообщений
  • Версия CMS:2.x
  • Откуда:Минск

Опубликовано 30.08.2019 - 21:23

Спасибо за подсказку) Сразу нашел в чем проблема) надо добавить еще в BrandAdmin.php код $brand->parent_id = $this->request->post('parent_id', 'integer');

Можете описать по папкам что да куда?


Изменено: MaLeN, 30.08.2019 - 21:35






Также с меткой «бренды, подкатегории уровни»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых