get31 Posted June 30 Report Share Posted June 30 (edited) Добрый день. Подскажите, пожалуйста, как в выпадающем меню подкатегорий менять бренды относящиеся ко второму уровню? Сейчас вывожу вот так второго уровня, где отображаются категории 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 June 30 by get31 Quote Link to post Share on other sites
phukortsin Posted July 1 Report Share Posted July 1 А с какой стати они будут меняться, если в коде в цикле используется {$category->brands}, не зависящее от итерации цикла? Пробуйте использовать {$cat3->brands}... Quote Link to post Share on other sites
get31 Posted July 1 Author Report Share Posted July 1 5 часов назад, phukortsin сказал: А с какой стати они будут меняться, если в коде в цикле используется {$category->brands}, не зависящее от итерации цикла? Пробуйте использовать {$cat3->brands}... {$category->brands} потому что нужно выводит бренды подкатегории, а если через {$cat3->brands}, то выдаст список всех брендов родителя, даже те где нет товара. Но даже через {$cat3->brands} не меняет список при наведении на подкатегории. Quote Link to post Share on other sites
get31 Posted July 1 Author Report Share Posted July 1 (edited) Точнее {$cat3->brands} меняет как надо но url, но к сожалению выводит весь список брендов родителя Edited July 1 by get31 Quote Link to post Share on other sites
phukortsin Posted July 2 Report Share Posted July 2 Если надо не весь, то меняйте код, чтоб был не весь. А то одни загадки... Quote Link to post Share on other sites
get31 Posted July 2 Author Report Share Posted July 2 2 часа назад, phukortsin сказал: Если надо не весь, то меняйте код, чтоб был не весь. А то одни загадки... Та какие загадки? Я весь код для вывода категорий показал, сказал, что {$category->brands} выводит бренды подкатегории, а через {$cat3->brands} отображает все бренды родителя. Quote Link to post Share on other sites
phukortsin Posted July 2 Report Share Posted July 2 В Simpla стандартно НЕТ {$cat3->brands}, и как оно у Вас формируется и что там находится, не известно... Что такое "бренды родителя", тоже надо гадать... Quote Link to post Share on other sites
get31 Posted July 2 Author Report Share Posted July 2 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; } } Quote Link to post Share on other sites
phukortsin Posted July 2 Report Share Posted July 2 Вроде бы нормально. Если у Вас выводятся лишние бренды, т.е. то есть содержащие товары с нулевым к-вом, то это соответствует тому, как запрограммировано, то есть без фильтров на активность и наличие товаров. А еще в цикле по категориям делаются однотипные запросы, весьма нерационально. Надо бы делать одним запросом. Может, даже с кешированием... Quote Link to post Share on other sites
get31 Posted July 3 Author Report Share Posted July 3 18 часов назад, phukortsin сказал: Вроде бы нормально. Если у Вас выводятся лишние бренды, т.е. то есть содержащие товары с нулевым к-вом, то это соответствует тому, как запрограммировано, то есть без фильтров на активность и наличие товаров. А еще в цикле по категориям делаются однотипные запросы, весьма нерационально. Надо бы делать одним запросом. Может, даже с кешированием... Попробовал на стандартной simpla через cat3->brands, понял что изначально ТЗ не правильно сформулировал))) надо выводить бренды относящиеся не ко второму уровню, а к третьему. Тобишь сейчас вывод идет 3-го уровня категорий, соответственно 3-го нужно выводить бренды. Как можно это сделать? Quote Link to post Share on other sites
phukortsin Posted July 3 Report Share Posted July 3 2 часа назад, get31 сказал: Попробовал на стандартной simpla через cat3->brands, понял что изначально ТЗ не правильно сформулировал))) надо выводить бренды относящиеся не ко второму уровню, а к третьему. Тобишь сейчас вывод идет 3-го уровня категорий, соответственно 3-го нужно выводить бренды. Как можно это сделать? Десятками способов можно сделать. Для начала самому понимать, что хотите. Затем формулировать адекватно свои хотелки. "соответственно 3-го нужно выводить бренды" - очень по-разному можно понимать. Например, как бренды 3-го уровня, которых стандартно в Simpla нет... Quote Link to post Share on other sites
get31 Posted July 3 Author Report Share Posted July 3 29 минут назад, phukortsin сказал: Десятками способов можно сделать. Для начала самому понимать, что хотите. Затем формулировать адекватно свои хотелки. "соответственно 3-го нужно выводить бренды" - очень по-разному можно понимать. Например, как бренды 3-го уровня, которых стандартно в Simpla нет... да, выводить бренды третьего уровня категории. То есть я вывел горизонтально категории 2-го уровня, сделал выпадающий список категорий 3-го уроня, и хочу рядом с выводом категорий 3го выводить бренды которые относятся К категориям 3-го со сменой брендов Quote Link to post Share on other sites
phukortsin Posted July 3 Report Share Posted July 3 (edited) Если хотите, чтоб при изменении выбранного пункта в списке категорий 3-его уровня автоматически менялся список брендов на привязанные к выбранной категории, то это можно сделать методом применения трудовых усилий программиста, надо реализовывать связанные списки. Если совсем не знаете как делать, то просить спецов за денежку, бесплатно вряд ли кто готовый код напишет... Edited July 3 by phukortsin Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.