Перейти к содержанию
Официальный форум поддержки Simpla

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


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

  `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}
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

 

 

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

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

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

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

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

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

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

 

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

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

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

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

Изменено пользователем MaLeN
Ссылка на сообщение
Поделиться на другие сайты
  • 2 года спустя...

Привет парни, а как вывести в шаблоне товары подбрендов в главном бренде?

- adidas

-- adidas one

-- adidas two

Вот чтобы в adidas показывалось adidas one и adidas two

Изменено пользователем get31
Ссылка на сообщение
Поделиться на другие сайты
8 часов назад, get31 сказал:

Привет парни, а как вывести в шаблоне товары подбрендов в главном бренде?

- adidas

-- adidas one

-- adidas two

Вот чтобы в adidas показывалось adidas one и adidas two

Стандартно в симпле нет подбрендов.

Ссылка на сообщение
Поделиться на другие сайты
11 часов назад, Noxter сказал:

Стандартно в симпле нет подбрендов.

Та я уже сделал подбренды, а теперь в главном бренде товары не выводятся( 

Ссылка на сообщение
Поделиться на другие сайты
20 часов назад, get31 сказал:

Та я уже сделал подбренды, а теперь в главном бренде товары не выводятся( 

Возможно, в контроллере не фильтруется с учетом подбрендов. И еще десяток причин может быть...

Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, phukortsin сказал:

Возможно, в контроллере не фильтруется с учетом подбрендов. И еще десяток причин может быть...

Какой файл копать, подскажите? ProductsView.php?

Ссылка на сообщение
Поделиться на другие сайты
В 28.04.2022 в 11:07, get31 сказал:

Какой файл копать, подскажите? ProductsView.php?

Сделал подбренды, а фильтр не смог сделать? Смешно...

Ссылка на сообщение
Поделиться на другие сайты
В 30.04.2022 в 18:05, Noxter сказал:

Сделал подбренды, а фильтр не смог сделать? Смешно...

ничего смешного, это реальность. 

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

и еще момент, не понял как в бренде вывести названия подбрендов с ссылками

делал по аналогии с каталогом, но что-то идет не так

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...