Jump to content

Смена брендов подкатегории в выпадающем меню


Recommended Posts

Добрый день. 

Подскажите, пожалуйста, как в выпадающем меню подкатегорий менять бренды относящиеся ко второму уровню?

Сейчас вывожу вот так второго уровня, где отображаются категории 3го уровня, соответственно вывожу бренды категории, но бренды не меняются как подкатегории:

{foreach $categories as $c}
	{if in_array($category->id, $c->children) && $c->subcategories}
		{foreach $c->subcategories as $cat}
		{if $cat->visible}
		<div class="dropdown_demo">
			<button class="dropbtn_demo">
				<a {if $category->id == $cat->id}class="selected"{/if} href="catalog/{$cat->url}" data-category="{$cat->id}">
					{$cat->name|escape}
				</a>
			</button>
			
			<div class="dropdown-content_demo">
				<div class="col-container_demo wrap">
					<div class="col_demo">
					{foreach $cat->subcategories as $cat3}
					{if $cat3->visible}
						{if $cat3@first}<b>{$cat->name|escape}</b>{/if}
						<a {if $category->id == $cat3->id}class="selected"{/if} href="catalog/{$cat3->url}" data-category="{$cat3->id}">{$cat3->name}</a>
					{/if}
					{/foreach}
					</div>

					<div class="col_demo">
						<b>Featured Brands</b>

						{if $category->brands}
							{foreach $category->brands as $b}
								{if $b->disabled}
								{else}
									<a href="catalog/{$category->url|escape}/{$b->url}">{$b->name|escape}</a>
								{/if}
							{/foreach}
						{/if}
	
					</div>

				</div>

			</div>

		</div>
		{/if}
		{/foreach} 
	{/if}
{/foreach}

 

Edited by get31
Link to post
Share on other sites
  • get31 changed the title to Смена брендов подкатегории в выпадающем меню

А с какой стати они будут меняться, если в коде в цикле  используется {$category->brands}, не зависящее от итерации цикла? Пробуйте использовать  {$cat3->brands}...

Link to post
Share on other sites
5 часов назад, phukortsin сказал:

А с какой стати они будут меняться, если в коде в цикле  используется {$category->brands}, не зависящее от итерации цикла? Пробуйте использовать  {$cat3->brands}...

{$category->brands} потому что нужно выводит бренды подкатегории, а если через {$cat3->brands}, то выдаст список всех брендов родителя, даже те где нет товара.

Но даже через {$cat3->brands} не меняет список при наведении на подкатегории.

Link to post
Share on other sites

Точнее {$cat3->brands} меняет как надо но url, но к сожалению выводит весь список брендов родителя

Edited by get31
Link to post
Share on other sites
2 часа назад, phukortsin сказал:

Если надо не весь, то меняйте код, чтоб был не весь. А то одни загадки...

Та какие загадки? Я весь код для вывода категорий показал, сказал, что {$category->brands} выводит бренды подкатегории, а через {$cat3->brands} отображает все бренды родителя.

Link to post
Share on other sites

В Simpla стандартно НЕТ  {$cat3->brands}, и как оно у Вас формируется и что там находится, не известно... Что такое "бренды родителя", тоже надо гадать...

Link to post
Share on other sites
39 минут назад, phukortsin сказал:

В Simpla стандартно НЕТ  {$cat3->brands}, и как оно у Вас формируется и что там находится, не известно... Что такое "бренды родителя", тоже надо гадать...

теперь понял)) api/Categories.php

<?php

/**
 * Simpla CMS
 */

require_once('Simpla.php');

class Categories extends Simpla
{
	// Список указателей на категории в дереве категорий (ключ = id категории)
	private $all_categories;
	// Дерево категорий
	private $categories_tree;

	// Функция возвращает массив категорий
	public function get_categories($filter = array())
	{
		if(!isset($this->categories_tree))
			$this->init_categories();
 
		if(!empty($filter['product_id']))
		{
			$query = $this->db->placehold("SELECT category_id FROM __products_categories WHERE product_id in(?@) ORDER BY position", (array)$filter['product_id']);
			$this->db->query($query);
			$categories_ids = $this->db->results('category_id');
			$result = array();
			foreach($categories_ids as $id)
				if(isset($this->all_categories[$id]))
					$result[$id] = $this->all_categories[$id];
			return $result;
		}
		
		return $this->all_categories;
	}	

	// Функция возвращает id категорий для заданного товара
	public function get_product_categories($product_id)
	{
		$query = $this->db->placehold("SELECT product_id, category_id, position FROM __products_categories WHERE product_id in(?@) ORDER BY position", (array)$product_id);
		$this->db->query($query);
		return $this->db->results();
	}	

	// Функция возвращает id категорий для всех товаров
	public function get_products_categories()
	{
		$query = $this->db->placehold("SELECT product_id, category_id, position FROM __products_categories ORDER BY position");
		$this->db->query($query);
		return $this->db->results();
	}	

	// Функция возвращает дерево категорий
	public function get_categories_tree()
	{
		if(!isset($this->categories_tree))
			$this->init_categories();
			
		return $this->categories_tree;
	}

	// Функция возвращает заданную категорию
	public function get_category($id)
	{
		if(!isset($this->all_categories))
			$this->init_categories();
		if(is_int($id) && array_key_exists(intval($id), $this->all_categories))
			return $category = $this->all_categories[intval($id)];
		elseif(is_string($id))
			foreach ($this->all_categories as $category)
				if ($category->url == $id)
					return $this->get_category((int)$category->id);	
		
		return false;
	}
	
	// Добавление категории
	public function add_category($category)
	//public function add_category($category, $copy_features = false)
	{
		$category = (array)$category;
		if(empty($category['url']))
		{
			$category['url'] = preg_replace("/[\s]+/ui", '_', $category['name']);
			$category['url'] = strtolower(preg_replace("/[^0-9a-zа-я_]+/ui", '', $category['url']));
		}	

		// Если есть категория с таким URL, добавляем к нему число
		while($this->get_category((string)$category['url']))
		{
			if(preg_match('/(.+)_([0-9]+)$/', $category['url'], $parts))
				$category['url'] = $parts[1].'_'.($parts[2]+1);
			else
				$category['url'] = $category['url'].'_2';
		}

        $category = (object)$category;

 	    $result = $this->languages->get_description($category, 'category');
        if(!empty($result->data))$category = $result->data;

		$this->db->query("INSERT INTO __categories SET ?%", $category);
		$id = $this->db->insert_id();
		$this->db->query("UPDATE __categories SET position=id WHERE id=?", $id);
		
		if ($copy_features && $category['parent_id'] > 0) {
			$query = $this->db->placehold("INSERT INTO __categories_features SELECT ?, f.feature_id FROM __categories_features f WHERE f.category_id = ?", $id, $category['parent_id']);
			$this->db->query($query);      
		}

        if(!empty($result->description)){
            $this->languages->action_description($id, $result->description, 'category');
        }

		unset($this->categories_tree);	
		unset($this->all_categories);	
		return $id;
	}
	
	// Изменение категории
	public function update_category($id, $category)
	{
	    $category = (object)$category;
	    $result = $this->languages->get_description($category, 'category');
        if(!empty($result->data))$category = $result->data;

		$query = $this->db->placehold("UPDATE __categories SET ?% WHERE id=? LIMIT 1", $category, intval($id));
		$this->db->query($query);

        if(!empty($result->description)){
            $this->languages->action_description($id, $result->description, 'category', $this->languages->lang_id());
        }

		unset($this->categories_tree);
		unset($this->all_categories);
		return intval($id);
	}
	
	// Удаление категории
	public function delete_category($ids)
	{
		$ids = (array) $ids;
		foreach($ids as $id)
		{
			if($category = $this->get_category(intval($id)))
			$this->delete_image($category->children);
			if(!empty($category->children))
			{
				$query = $this->db->placehold("DELETE FROM __categories WHERE id in(?@)", $category->children);
				$this->db->query($query);
				$query = $this->db->placehold("DELETE FROM __products_categories WHERE category_id in(?@)", $category->children);
				$this->db->query($query);
                $this->db->query("DELETE FROM __lang_categories WHERE category_id in(?@)", $category->children);
			}
		}
		unset($this->categories_tree);			
		unset($this->all_categories);	
		return $id;
	}
	
	// Добавить категорию к заданному товару
	public function add_product_category($product_id, $category_id, $position=0)
	{
		$query = $this->db->placehold("INSERT IGNORE INTO __products_categories SET product_id=?, category_id=?, position=?", $product_id, $category_id, $position);
		$this->db->query($query);
	}

	// Удалить категорию заданного товара
	public function delete_product_category($product_id, $category_id)
	{
		$query = $this->db->placehold("DELETE FROM __products_categories WHERE product_id=? AND category_id=? LIMIT 1", intval($product_id), intval($category_id));
		$this->db->query($query);
	}
	
	// Удалить изображение категории
	public function delete_image($categories_ids)
	{
		$categories_ids = (array) $categories_ids;
		$query = $this->db->placehold("SELECT image FROM __categories WHERE id in(?@)", $categories_ids);
		$this->db->query($query);
		$filenames = $this->db->results('image');
		if(!empty($filenames))
		{
			$query = $this->db->placehold("UPDATE __categories SET image=NULL WHERE id in(?@)", $categories_ids);
			$this->db->query($query);
			foreach($filenames as $filename)
			{
				$query = $this->db->placehold("SELECT count(*) as count FROM __categories WHERE image=?", $filename);
				$this->db->query($query);
				$count = $this->db->result('count');
				if($count == 0)
				{			
					@unlink($this->config->root_dir.$this->config->categories_images_dir.$filename);		
				}
			}
			unset($this->categories_tree);
			unset($this->all_categories);	
		}
	}

	// Инициализация категорий, после которой категории будем выбирать из локальной переменной
	private function init_categories()
	{
		// Дерево категорий
		$tree = new stdClass();
		$tree->subcategories = array();
		
		// Указатели на узлы дерева
		$pointers = array();
		$pointers[0] = &$tree;
		$pointers[0]->path = array();
		$pointers[0]->level = 0;

		// Выбираем все категории
		$query = $this->db->placehold("SELECT c.id, c.parent_id, c.name, c.url, c.image, c.visible, c.position
										FROM __categories c ORDER BY c.parent_id, c.position");
		
		$this->db->query($query);
		$categories = $this->db->results();
				
		$finish = false;
		// Не кончаем, пока не кончатся категории, или пока ниодну из оставшихся некуда приткнуть
		while(!empty($categories)  && !$finish)
		{
			$flag = false;
			// Проходим все выбранные категории
			foreach($categories as $k=>$category)
			{
				if(isset($pointers[$category->parent_id]))
				{
					$category->brands = $this->brands->get_brands( array('category_id'=>$category->id) );

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

					// Убираем использованную категорию из массива категорий
					unset($categories[$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;

			}
		}
		unset($pointers[0]);
		unset($ids);

		$this->categories_tree = $tree->subcategories;
		$this->all_categories = $pointers;	
	}

}

 

Link to post
Share on other sites

Вроде бы нормально.

Если у Вас выводятся лишние бренды, т.е. то есть содержащие товары с нулевым к-вом, то это соответствует тому, как запрограммировано, то есть без фильтров на активность и наличие товаров. 

А еще в цикле по категориям делаются однотипные запросы, весьма нерационально. Надо бы делать одним запросом. Может, даже  с кешированием...

Link to post
Share on other sites
18 часов назад, phukortsin сказал:

Вроде бы нормально.

Если у Вас выводятся лишние бренды, т.е. то есть содержащие товары с нулевым к-вом, то это соответствует тому, как запрограммировано, то есть без фильтров на активность и наличие товаров. 

А еще в цикле по категориям делаются однотипные запросы, весьма нерационально. Надо бы делать одним запросом. Может, даже  с кешированием...

Попробовал на стандартной simpla через cat3->brands, понял что изначально ТЗ не правильно сформулировал))) надо выводить бренды относящиеся не ко второму уровню, а к третьему. Тобишь сейчас вывод идет 3-го уровня категорий, соответственно 3-го нужно выводить бренды. Как можно это сделать?

Link to post
Share on other sites
2 часа назад, get31 сказал:

Попробовал на стандартной simpla через cat3->brands, понял что изначально ТЗ не правильно сформулировал))) надо выводить бренды относящиеся не ко второму уровню, а к третьему. Тобишь сейчас вывод идет 3-го уровня категорий, соответственно 3-го нужно выводить бренды. Как можно это сделать?

Десятками способов можно сделать. Для начала самому понимать, что хотите. Затем формулировать адекватно свои хотелки.

"соответственно 3-го нужно выводить бренды" - очень по-разному можно понимать. Например, как бренды 3-го уровня, которых стандартно в Simpla нет...

Link to post
Share on other sites
29 минут назад, phukortsin сказал:

Десятками способов можно сделать. Для начала самому понимать, что хотите. Затем формулировать адекватно свои хотелки.

"соответственно 3-го нужно выводить бренды" - очень по-разному можно понимать. Например, как бренды 3-го уровня, которых стандартно в Simpla нет...

да, выводить бренды третьего уровня категории.

То есть я вывел горизонтально категории 2-го уровня, сделал выпадающий список категорий 3-го уроня, и хочу рядом с выводом категорий 3го выводить бренды которые относятся К категориям 3-го со сменой брендов

Link to post
Share on other sites

Если хотите, чтоб при изменении выбранного пункта в списке категорий 3-его уровня автоматически менялся список брендов на привязанные к выбранной категории, то это можно сделать методом применения трудовых усилий программиста, надо реализовывать связанные списки. Если совсем не знаете как делать, то просить спецов за денежку, бесплатно вряд ли кто готовый код напишет...

 

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