Jump to content

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


Recommended Posts

  `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}    {/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}
Link to post
Share on other sites

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

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

Link to post
Share on other sites
  • 1 year later...

 

  `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}    {/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}

 

 

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

Link to post
Share on other sites
  • 3 weeks later...

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

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites
  • 3 years later...

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

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

Edited by MaLeN
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
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.

Loading...
×
×
  • Create New...