esistema1 Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 Всем привет! Прошу помощи.. Есть {$category->name} выводит название категории в виде "Категория", как сделать так чтобы вывод был с маленькой буквы "категория", без изменения в самой таблице? Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 Стилями сделайте. style="text-transform: lowercase;" если прямо в шаблоне или добавьте text-transform: lowercase; в нужный класс в стилях Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 14 июля, 2017 Автор Жалоба Поделиться Опубликовано 14 июля, 2017 Через стили не подойдет мне это в title надо вывести... Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 14 июля, 2017 Автор Жалоба Поделиться Опубликовано 14 июля, 2017 Немного разобрался надо сделать так {$category->name|lower}. Но работает только с английским языком, на русском не срабатывает. Как исправить? Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) А что мешает титлу задать стиль? <title style="text-transform: lowercase;">{$category->name|lower}</title> Или Вы это всё в PHP пытаетесь сделать?Тогда strtolower() Вам в помощь. Изменено 14 июля, 2017 пользователем koteyka Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 14 июля, 2017 Автор Жалоба Поделиться Опубликовано 14 июля, 2017 на title стиль не действует...делаю в index.tpl Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) Немного разобрался надо сделать так {$category->name|lower}. Но работает только с английским языком, на русском не срабатывает. Как исправить?Работает и с кириллицей. Я проверил. <title>{$meta_title|lower}</title> вывел <title>кровати</title> хотя категория называется Кровати Изменено 14 июля, 2017 пользователем koteyka Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 14 июля, 2017 Автор Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) у меня не работает с кириллицей... возможно из за того что simpla 1.4 Изменено 14 июля, 2017 пользователем esistema1 Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) Возможно. Т.к. там версия смарти еще старая стоит.А на строне PHP не подходит? Если сразу в шаблон выводить строчными буквами?А там, где нужно с заглавной, потом стилями править. Изменено 14 июля, 2017 пользователем koteyka Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 14 июля, 2017 Автор Жалоба Поделиться Опубликовано 14 июля, 2017 а как в php сделать? надо только в title сделать маленькие буквы во всех остальных местах должно быть с заглавной.. Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) -- Изменено 14 июля, 2017 пользователем Maksclub Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) $categories = $this->categories->get_categories_tree(); foreach($categories as $c) { $c->name = mb_strtolower($c->name); } $this->design->assign('categories', $categories); Это вставьте в view/IndexView.php вместо // Категории товаров $this->design->assign('categories', $this->categories->get_categories_tree()); Код правда для 2.3.х версий, но думаю, что у Вас на особо отличается, если отличается. Потом. если нужно с заглавной стилями правите то, где выводится $c->name Изменено 14 июля, 2017 пользователем koteyka Цитата Ссылка на сообщение Поделиться на другие сайты
ЯкЦинДрак Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 $categories = $this->categories->get_categories_tree(); foreach($categories as $c) { $c->name = strtolower($c->name); } $this->design->assign('categories', $categories); Это вставьте в view/IndexView.php вместо // Категории товаров $this->design->assign('categories', $this->categories->get_categories_tree()); Код правда для 2.3.х версий, но думаю, что у Вас на особо отличается, если отличается. Метод содержит ДВЕ ошибки:1. Он переписывает названия в нижний регистр только в категориях верхнего уровня, у остальных останется по-прежнему.2. У тех, у которых переписывает, нижний регистр будет на страницах ВЕЗДЕ, а надо только в title. Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) 1. Он переписывает названия в нижний регистр только в категориях верхнего уровня, у остальных останется по-прежнему.Тут нужно, чтобы ТС уточнял, что он этим преследует. Как я понял, он хочет к какому-то титлу добавлять еще и название категории.Тогда возникает вопрос, на каких страницах ему это нужно. Если везде, то реализация будет одна. Если на странице с категориями, то другая и т.д.Вопрос "как сделать так чтобы вывод был с маленькой буквы "категория", без изменения в самой таблице" мало о чем говорит. Вариантов реализации много.Дописать цикл с перебором подкатегорий не сложно. Нужно для начала чтобы ТС сказал, на каких страницах это ему нужно.Можно вообще выводить в шаблон отдельной переменной $title_category, например. Изменено 14 июля, 2017 пользователем koteyka Цитата Ссылка на сообщение Поделиться на другие сайты
ЯкЦинДрак Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 По-моему, ТС поставил задачу весьма точно и понятно.Тут нужно, чтобы ТС уточнял, что он этим преследует. Как я понял, он хочет к какому-то титлу добавлять еще и название категории. Тогда возникает вопрос, на каких страницах ему это нужно. Если везде, то реализация будет одна. Если на странице с категориями, то другая и т.д.Ясно сказано - преследует цель, чтобы в title название категории было маленькими буквами. Естестествено, не у всех страниц, а у тех, в которых он захочет прописать в шаблоне.Вопрос как сделать так чтобы вывод был с маленькой буквы "категория", без изменения в самой таблице" мало о чем говорит.По-моему, смысл прост. БД запись может быть с заглавной "Диваны", а при выводе в title надо маленькими буквами "диваны".Дописать цикл с перебором подкатегорий не сложно. Нужно для начала чтобы ТС сказал, на каких страницах это ему нужно. Видимо, надо делать так, чтоб работало на ВСЕХ страницах.Можно вообще выводить в шаблон отдельной переменной $title_category, например.Хорошая идея. Цитата Ссылка на сообщение Поделиться на другие сайты
koteyka Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 (изменено) Мда. Смена ника сущности человека не поправила. Ты, как обычно, в своем репертуаре. Лишь бы рассусоливать Ясно сказано - преследует цель, чтобы в title название категории было маленькими буквами.Что тут ясно? На странице какой? Там, где категория выводится в шаблон или на странице с постами? Видимо, надо делать так, чтоб работало на ВСЕХ страницах.Да что ты ....?И какую категорию выводить на странице корзины? Изменено 14 июля, 2017 пользователем koteyka Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 Прекращайте срач.Корс, тебе последнее предупреждение.Если нечего сказать ПО-СУЩЕСТВУ (конкретный код) то лучше молчи.А то опять в бан угодишь. Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 Если по сути:В последних версиях Смарти прекрасно работает такая конструкция {mb_strtolower($category->name)} Что там было в 1.4 - уже давно не помню.Как вариант - написать свой модификатор для Смарти. Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 14 июля, 2017 Жалоба Поделиться Опубликовано 14 июля, 2017 Если по сути:В последних версиях Смарти прекрасно работает такая конструкция {mb_strtolower($category->name)} Что там было в 1.4 - уже давно не помню.Как вариант - написать свой модификатор для Смарти.Для этого нужно а php.ini доп. строчку прописать, кажись mb_string = true я точно не помню. Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 15 июля, 2017 Автор Жалоба Поделиться Опубликовано 15 июля, 2017 mb_strtolower - не работает..., даже если прописать mb_string = true в php.ini Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 15 июля, 2017 Автор Жалоба Поделиться Опубликовано 15 июля, 2017 (изменено) Может смарти как нибудь обновить можно или еще что? Чтобы lower заработало с кириллицей .. Изменено 15 июля, 2017 пользователем esistema1 Цитата Ссылка на сообщение Поделиться на другие сайты
ЯкЦинДрак Опубликовано 15 июля, 2017 Жалоба Поделиться Опубликовано 15 июля, 2017 (изменено) Что тут ясно? На странице какой? Там, где категория выводится в шаблон или на странице с постами?В посте #4 автор привел способ - вставка {$category->name|lower}, который работает, но частично. Надо так же, то чтоб работало полностью. На каких страницах и в каких местах - на всех тех, где работает способ из коробки {$category->name}. В этой теме как раз очень понятно задание. Скорее непонятен способ реализации - только потому, что способов много и глаза разбегаются - какой выбрать. Хороший способ - со своим модификатором - предложил Kosjak76. Предложу и я свой способ, он по сравнению с уже предложенными проще: 1. В api/Categories.php вместо SELECT c.id, c.parent_id, c.name, вставить SELECT c.id, c.parent_id, c.name, lower(c.name) lower_name, 2. После этого в шаблонах наряду с {$category->name} работает {$category->lower_name} Проверял на последней версии, у меня работает. Изменено 15 июля, 2017 пользователем ЯкЦинДрак Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 15 июля, 2017 Автор Жалоба Поделиться Опубликовано 15 июля, 2017 В 1.4 нет api/Categories.php - там видимо надо править storefront Код ниже. Куда тут можно вставить lower(c.name)? <?PHP /** * Simpla CMS * Storefront class: Каталог товаров * * @copyright 2009 Denis Pikusov * @link http://simp.la * @author Denis Pikusov * * Этот класс использует шаблоны catalog.tpl, products.tpl, product.tpl * */ require_once('Widget.class.php'); class Storefront extends Widget { var $items_per_page = 48; // Количество товаров на странице var $categories = array(); var $error = ''; /** * * Конструктор * */ function Storefront($parent) { Widget::Widget($parent); // Если у родителя уже выбраны категории if(is_array($parent->categories)) { $this->categories = $parent->categories; } else { // иначе выбираем $this->categories = $this->get_categories(); } } /** * * Отображение * */ function fetch() { // Проверяем не передает ли пользователь нам через POST-данные кол-во товаров для отображения на одной странице // Если передает, то записываем это дело в сессию if (isset($_POST['products_per_page']) AND (int)$_POST['products_per_page'] > 0) { $_SESSION['products_per_page'] = (int)$_POST['products_per_page']; } // Если пользователем задано кол-во товаров на страницу, то устанавливаем переменную для шаблона // Эта переменная поможет определить текущее "активное" кол-во страниц в списке выбора на сайте // ибо при попытке использовать сессии напрямую в шаблонах столкнулся с непонятным глюком, // когда не всегда корректно срабатывало определение сессийной переменной if ( ! empty($_SESSION['products_per_page'])) { $this->smarty->assign('user_products_per_page', (int)$_SESSION['products_per_page']); } // Берем количество товаров из настроек в админке либо из сессии пользователя (сессия имеет преимущество) if (isset($_SESSION['products_per_page']) AND ! empty($_SESSION['products_per_page'])) { $this->items_per_page = (int)$_SESSION['products_per_page']; } elseif ( ! empty($this->settings->products_num)) { $this->items_per_page = $this->settings->products_num; } // Устанавливаем переменную для шаблона с кол-вом товаров на страницу, заданное администратором либо системой // Эта переменная нужна при формировании списка с вариантами количества товаров // Её можно использовать как угодно. Я же формирую её только первый вариант, так сказать "по-умолчанию" if ( ! empty($this->settings->products_num)) { $this->smarty->assign('admin_products_per_page', $this->settings->products_num); } else { $this->smarty->assign('admin_products_per_page', 48); } // Все возможные GET-параметры. Фильтруем для безопасности $category = $this->url_filtered_param('category'); $brand = $this->url_filtered_param('brand'); $product = $this->url_filtered_param('product'); // Параметр по размерам $size = $this->url_filtered_param('size'); //$size = $_REQUEST['size']; if (!empty($product)) { // Если задан товар, выводим его return $this->fetch_product($product); } elseif (!empty($category) || !empty($size)) { //print_r($_REQUEST); //echo $size.' >3> '.$_REQUEST['size']; // Если задана категория, выводим товары этой категории return $this->fetch_products($category, $brand, $size); } elseif (!empty($category) || !empty($brand) || !empty($size) ) { //print_r($_REQUEST); //echo $size.' -1- '.$_REQUEST['size']; // Если задана категория, выводим товары этой категории return $this->fetch_products($category, $brand, $size); } // ИНДИВИДУАЛЬНАЯ ВСТАВКА ПО РАЗМЕРАМ. ДОБАВЛЕН ПАРАМЕТР $size В ФУНКЦИЮ fetch_products elseif (!empty($category) || !empty($brand) /*|| !empty($size)*/) { //print_r($_REQUEST); //echo $size.' >2> '.$_REQUEST['size']; // Если задана категория, выводим товары этой категории return $this->fetch_products($category, $brand, $size); } else { // По умолчанию выводим каталог return $this->fetch_catalog(); } } /** * * Отображение каталога товаров * */ function fetch_catalog() { // Если пользователь залогиен, применим сразу его скидку к ценам на товар $discount=isset($this->user->discount)?$this->user->discount:0; // Популярные товары $products = $this->get_products(null, null, null, null, null, 1, null, null); $this->smarty->assign('products', $products); $this->body = $this->smarty->fetch('catalog.tpl'); return $this->body; } /** * * Отображение списка товаров в категории * */ function fetch_products($category_url, $brand_url, $size_url) { //echo $category_url.' - '.$brand_url.' -- '.$size_url; // берем количество товаров из настроек if(!empty($this->settings->products_num)) $this->items_per_page = $this->settings->products_num; // Если задан бренд, выберем его из базы if (isset($brand_url) && !empty($brand_url)) { $query = sql_placeholder('SELECT * FROM brands WHERE url=? LIMIT 1', $brand_url); $this->db->query($query); $brand = $this->db->result(); if (empty($brand)) { return false; } $this->smarty->assign('brand', $brand); } // ИНДИВИДУАЛЬНАЯ ВСТАВКА // Если задан размер, выберем его из базы if (isset($size_url) && !empty($size_url)) { $query = sql_placeholder('SELECT * FROM sizes WHERE url=? LIMIT 1', $size_url); $this->db->query($query); $size = $this->db->result(); if (empty($size)) { return false; } $this->smarty->assign('size', $size); } // ИНДИВИДУАЛЬНАЯ ВСТАВКА(КОНЕЦ) // Выберем текущую категорию if (isset($category_url) && !empty($category_url)) { $category = $this->category_by_url($this->categories, $category_url); if (empty($category)) { return false; } $this->smarty->assign('category', $category); } // Текущая страница в постраничном выводе // Единицу отнимаем, потому что в коде страницы нумеруются с 0 а не с 1 как снаружи $current_page = intval($this->param('page'))-1; // Если не задана, то равна 0 $current_page = max(0, $current_page); $this->smarty->assign('page', $current_page); // Порядковый номер первого товара на странице $start_item = $current_page*$this->items_per_page; // Выбираем свойства категории $query = sql_placeholder("SELECT * FROM properties, properties_categories WHERE properties.property_id = properties_categories.property_id AND properties_categories.category_id=? AND enabled AND in_filter AND options!='' ORDER BY properties.order_num", $category->category_id); $this->db->query($query); if($properties = $this->db->results()) { foreach($properties as $k=>$property) $this->add_param($property->property_id); foreach($properties as $k=>$property) { $properties[$k]->clear_url = $this->form_get(array($property->property_id=>'')); $options = array(); $opts = unserialize($property->options); foreach($opts as $i=>$o) { $options[$i]->value = $o; $options[$i]->url = $this->form_get(array($property->property_id=>$o)); } $properties[$k]->options = $options; } $this->smarty->assign('properties', $properties); //$this->smarty->assign('filter_params', $this->form_get(array())); //////////////////////// // Переданные значения свойств для фильтра $filter = array(); foreach($properties as $k=>$property) { if($val = $this->param($property->property_id)) $filter[$property->property_id] = $val; } } $extra_params = array(); if($this->add_param('order')) $extra_params['order'] = $this->param('order'); $this->smarty->assign('filter_params', $this->form_get($extra_params)); // Выбираем из базы товары //$products = $this->get_products(null, $category->subcats_ids, isset($brand->brand_id)?$brand->brand_id:null, $start_item, $filter, NULL, $this->param('order')); // Выбираем из базы товары //echo $category->subcats_ids.' > '.$brand->brand_id.' > '.$start_item.' > '.$filter.' > '.$size->size_id; $products = $this->get_products(null, $category->subcats_ids, isset($brand->brand_id)?$brand->brand_id:null, $start_item, $filter, null, $this->param('order'), isset($size->size_id)?$size->size_id:null); //print_r($products); $this->smarty->assign('products', $products); // Вычисляем количество страниц $products_count = $this->count_products(null, $category->subcats_ids, isset($brand->brand_id)?$brand->brand_id:null, $start_item, $filter, isset($size->size_id)?$size->size_id:null); //echo $products_count.' - '.$pages_num.' - '.$size->size_id; $pages_num = ceil($products_count/$this->items_per_page); $this->smarty->assign('total_pages', $pages_num); // Устанавливаем мета-теги if($category) { $this->title = $category->meta_title; $this->description = $category->meta_description; $this->keywords = $category->meta_keywords; }elseif($brand) { $this->title = $brand->meta_title; $this->description = $brand->meta_description; $this->keywords = $brand->meta_keywords; } // Выбираем все бренды, они нужны нам в шаблоне if(is_array($category->subcats_ids)) { if($this->use_optional_categories) { //С дополнительными категориями // Если задана категория, добавляем фильт по категории $category_filter = "AND ( (products.category_id in(".join($category->subcats_ids, ',').") ) OR (products_categories.category_id in(".join($category->subcats_ids, ',').") ) )"; $query = sql_placeholder("SELECT DISTINCT brands.* FROM brands, products LEFT JOIN products_categories ON products.product_id = products_categories.product_id WHERE products.brand_id = brands.brand_id AND products.enabled=1 $category_filter ORDER BY brands.name", $category->category_id); }else{ $category_filter = "AND products.category_id in(".join($category->subcats_ids, ',').")"; $query = sql_placeholder("SELECT DISTINCT brands.* FROM brands, products WHERE products.brand_id = brands.brand_id AND products.enabled=1 $category_filter ORDER BY brands.name", $category->category_id); } $this->db->query($query); $brands = $this->db->results(); } $this->smarty->assign('brands', $brands); // ИНДИВИДУАЛЬНАЯ ВСТАВКА ПО РАЗМЕРАМ // Выбираем все РАЗМЕРЫ, они нужны нам в шаблоне if(is_array($category->subcats_ids)) { if($this->use_optional_categories) { //С дополнительными категориями // Если задана категория, добавляем фильтр по категории $category_filter = "AND ( (products.category_id in(".join($category->subcats_ids, ',').") ) OR (products_categories.category_id in(".join($category->subcats_ids, ',').") ) )"; // ЗАПРОСЫ ВЫВОДЯТ ТЕ РАЗМЕРЫ, КОТОРЫЕ ЕСТЬ В КАТЕГОРИИ ВЫБРАННОЙ $query = sql_placeholder("SELECT DISTINCT sizes.* FROM sizes, products LEFT JOIN products_categories ON products.product_id = products_categories.product_id WHERE products.brand_id = brands.brand_id AND products.enabled=1 $category_filter AND products_variants.stock != 0 ORDER BY brands.name", $category->category_id); //echo '<br>1 >'.$query.'<br>'; // ТУТ ВЫШЕ С ЗАПРОСОМ ОСТАНОВИЛСЯ/ ПРОБЛЕМА С ВЫБОРКОЙ ПРОДУКТОВ ПО РАЗМЕРАМ А НЕ БРЕНДАМ _ РАЗОБРАТЬСЯ }else{ $category_filter = "AND products.category_id in(".join($category->subcats_ids, ',').")"; // Правленный запрос $query = sql_placeholder("SELECT DISTINCT sizes.* FROM sizes, products, products_variants WHERE products.product_id = products_variants.product_id and products_variants.name = sizes.name AND products.enabled=1 $category_filter AND products_variants.stock != 0 ORDER BY sizes.name", $category->category_id); //echo '<br>2 >'.$query.'<br>'; } $this->db->query($query); $sizes = $this->db->results(); } $this->smarty->assign('sizes', $sizes); // ОКОНЧАНИЕ ИНДИВИДУАЛЬНОЙ ВСТАВКИ ПО РАЗМЕРАМ $this->body = $this->smarty->fetch('products.tpl'); return $this->body; } /** * * Отображение отдельного товара * */ function fetch_product($product_url) { // Выбираем товар из базы $product = $this->get_product($product_url); if (empty($product)) { // страница 404 return false; } $query = sql_placeholder("UPDATE products SET counter=counter+1 WHERE product_id = ?", $product->product_id); $this->db->query($query); // Дополнительные фото товара $query = sql_placeholder("SELECT * FROM products_fotos WHERE product_id = ?", $product->product_id); $this->db->query($query); $product->fotos = $this->db->results(); // И передаем его в шаблон $this->smarty->assign('product', $product); // Выберем текущую категорию $category = $this->category_by_url($this->categories, $product->category_url); if (empty($category)) { // страница 404 return false; } $this->smarty->assign('category', $category); if(isset($this->user->name)) { $this->smarty->assign('name', $this->user->name); } ### Принимает отзыв if (isset($_POST['comment'])) { $name = trim(strip_tags($_POST['name'])); $email3 = trim(strip_tags($_POST['email3'])); $comment = trim(strip_tags($_POST['comment'])); if ($this->gd_loaded && ($_SESSION['captcha_code'] != $_POST['captcha_code'] || empty($_POST['captcha_code']))) { $this->error = 'Неверно введено число с картинки'; } elseif (empty($name)) { $this->error = 'Введите имя'; } elseif (empty($email3)) { $this->error = 'Введите E-mail'; } elseif (empty($comment)) { $this->error = 'Пустой комментарий'; } else { $query = sql_placeholder("INSERT INTO products_comments (date, product_id, ip, name, email2, comment) VALUES(NOW(), ?, ?, ?, ?, ?)", $product->product_id, $_SERVER['REMOTE_ADDR'], $name, $email3, $comment); $this->db->query($query); } // Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую unset($_SESSION['captcha_code']); if($this->error) { $this->smarty->assign('name', $name); $this->smarty->assign('email3', $email3); $this->smarty->assign('comment', $comment); } } ### $this->title = $product->meta_title; $this->keywords = $product->meta_keywords; $this->description = $product->meta_description; // Отзывы о товаре $query = sql_placeholder("SELECT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM products_comments WHERE product_id=? ORDER BY comment_id DESC", $product->product_id); $this->db->query($query); $comments = $this->db->results(); // Соседние товары $query = sql_placeholder("SELECT products.model as model, products.url as url, brands.name as brand, categories.single_name as category FROM categories, products LEFT JOIN brands ON products.brand_id = brands.brand_id WHERE categories.category_id = products.category_id AND categories.category_id=? AND products.enabled=1 AND categories.enabled=1 AND products.order_num<? ORDER BY products.order_num DESC LIMIT 1", $product->category_id, $product->order_num); $this->db->query($query); $next_product = $this->db->result(); $this->smarty->assign('next_product', $next_product); $query = sql_placeholder("SELECT products.model as model, products.url as url, brands.name as brand, categories.single_name as category FROM categories, products LEFT JOIN brands ON products.brand_id = brands.brand_id WHERE categories.category_id = products.category_id AND categories.category_id=? AND products.enabled=1 AND categories.enabled=1 AND products.order_num>? ORDER BY products.order_num LIMIT 1", $product->category_id, $product->order_num); $this->db->query($query); $prev_product = $this->db->result(); $this->smarty->assign('prev_product', $prev_product); /// $this->smarty->assign('comments', $comments); $this->smarty->assign('error', $this->error); $this->body = $this->smarty->fetch('product.tpl'); return $this->body; } // Функция возвращает подкатегории function categories_tree($categories) { $tree = array(); // Указатели на узлы дерева $used_items = array(); $end = false; // Не кончаем, пока не кончатся категории, или пока ниодну из оставшихся некуда приткнуть while(!empty($categories) && !$end) { $flag = false; foreach($categories as $k=>$category) { if($category->parent == 0) { // Добавляем элемент в дерево $cat = null; $cat->name = $category->name; $cat->category_id = $category->category_id; $cat->url = $category->url; $category->path[0] = $cat; $tree[$category->category_id] = $category; $used_items[$category->category_id] = &$tree[$category->category_id]; unset($categories[$k]); $flag = true; }else { if($used_items[$category->parent]) { $cat = null; $cat->name = $category->name; $cat->category_id = $category->category_id; $cat->url = $category->url; $category->path = $used_items[$category->parent]->path; $category->path[] = $cat; $used_items[$category->parent]->subcategories[$category->category_id] = $category; $used_items[$category->category_id] = &$used_items[$category->parent]->subcategories[$category->category_id]; unset($categories[$k]); $flag = true; } } } if(!$flag) $end = true; } $used_items = array_reverse($used_items, true); foreach($used_items as $k=>$item) { $used_items[$item->category_id]->subcats_ids[] = $item->category_id; if(is_array($used_items[$item->parent]->subcats_ids)) $used_items[$item->parent]->subcats_ids = array_merge($used_items[$item->parent]->subcats_ids, $item->subcats_ids); else $used_items[$item->parent]->subcats_ids = $item->subcats_ids; } return $tree; } // Функция возвращает рекурсивно подкатегории function category_by_url($categories, $url) { foreach ($categories as $category) { if ($category->url == $url) { return $category; } elseif(is_array($category->subcategories)) { if ($result = Storefront::category_by_url($category->subcategories, $url)) { return $result; } } } return false; } // Функция возвращает категории товаров, и их подкатегории function get_categories($parent=0) { // Выбираем все категории $query = sql_placeholder("SELECT * FROM categories WHERE enabled=1 ORDER BY parent, order_num", $parent); $this->db->query($query); $temp_categories = $this->db->results(); $categories = Storefront::categories_tree($temp_categories); return $categories; } // Функция возвращает товары function get_products($ids = null, $categories = null, $brand_id = null, $start_item=null, $filter=null, $hit=null, $order = false, $size_id = null) { // Если заданы id $id_filter = ''; if (is_array($ids)) { foreach ($ids as $k=>$id) { $ids[$k]=intval($id); } $id_filter = is_null($ids)?"":"AND (products.product_id in(".join($ids, ',')."))"; } // Если задан бренд, добавляем фильт по бренду $brand_filter = is_null($brand_id)?"":"AND brands.brand_id = $brand_id"; // ИНДИВИДУАЛЬНАЯ ВСТАВКА // Если задан размер, добавляем фильт по размеру $size_filter = is_null($size_id)?"":" AND (sizes.size_id = $size_id AND products_variants.stock != 0) "; // ОКОНЧАНИЕ ИНДИВИДУАЛЬНОЙ ВСТАВКИ // Если задан хит, добавляем фильт по хитам $hit_filter = is_null($hit)?"":"AND products.predzakaz = $hit"; // Выбираем сортировку if($order) { switch ($order) { case 'name_desc': $order_filter = "products.model DESC"; $variant = ""; break; case 'price': $order_filter = "products_variants.price"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; break; case 'price_desc': $order_filter = "products_variants.price DESC"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; break; case 'product_id': $order_filter = "products_variants.product_id"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; break; case 'date_new': $order_filter = "products_variants.product_id DESC"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; break; case 'date_new2': $order_filter = "products.modified DESC"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; break; case 'counter': $order_filter = "products.counter DESC"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; break; case 'defaylt': $order_filter = is_null($hit) ? "products.order_num desc" : "rand(), products.order_num desc"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; break; default: $order_filter = is_null($hit) ? "products.model" : "rand(), products.model"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; } } else { $order_filter = is_null($hit) ? "products.order_num desc" : "rand(), products.order_num desc"; $variant = " LEFT JOIN products_variants ON products_variants.product_id = products.product_id"; } // Если задан бренд, добавляем фильт по бренду $limit = is_null($start_item)?"":"LIMIT $start_item, $this->items_per_page"; // Фильтр по свойствам $properties_filter = ''; if($filter) { foreach($filter as $property=>$value) $properties_filter .= sql_placeholder(" AND products.product_id in (SELECT properties_values.product_id FROM properties_values WHERE properties_values.product_id = products.product_id AND properties_values.value=? AND properties_values.property_id=?) ", $value, $property); } //С дополнительными категориями // Если задана категория, добавляем фильт по категории $category_filter = is_null($categories)?"":"AND ( (categories.category_id in(".join($categories, ',').") ) OR (products_categories.category_id in(".join($categories, ',').") ) )"; $query = "SELECT products.product_id, products.url, products.category_id, products.brand_id, products.model, products.description, products.body, products.hit, products.predzakaz, products.color_asort, products.order_num, products.small_image, products.large_image, DATE_FORMAT(products.created, '%Y-%m-%d') as created, DATE_FORMAT(products.modified, '%Y-%m-%d') as modified, products.enabled, brands.name as brand, brands.url as brand_url, categories.single_name as category, categories.url as category_url, categories.image as category_image, products.rating, products.votes, sizes.size_id FROM products LEFT JOIN categories ON categories.category_id = products.category_id LEFT JOIN brands ON products.brand_id = brands.brand_id LEFT JOIN products_categories ON products.product_id = products_categories.product_id $variant LEFT JOIN sizes ON sizes.name = products_variants.name WHERE categories.enabled=1 and products.enabled=1 $id_filter $category_filter $brand_filter $size_filter $properties_filter $hit_filter $predzakaz_filter $color_asort_filter GROUP BY products.product_id ORDER BY $order_filter $limit"; //echo 'SQL = '.$query; $this->db->query($query); $temp_products = $this->db->results(); $cnt = 0; foreach($temp_products as $product) { $products[$product->product_id] = $product; $cnt++; if (!is_null($hit) && $cnt == 4) break; } if(is_array($products)) { $ids = array_keys($products); // Если пользователь залогиен, применим сразу его скидку к ценам на товар $discount=isset($this->user->discount)?$this->user->discount:0; $query = sql_placeholder("SELECT products_variants.*, products_variants.price*(100-$discount)/100 as discount_price, products_variants.stock as stock, products_variants.name as variant_name FROM products_variants WHERE products_variants.product_id in (?@) AND products_variants.stock>0 AND products_variants.price>0 ORDER BY products_variants.position", $ids); $this->db->query($query); $variants = $this->db->results(); foreach($variants as $variant) { if(!empty($products[$variant->product_id])) { $products[$variant->product_id]->variants[]=$variant; } } } $query = sql_placeholder("SELECT * FROM properties, properties_values WHERE properties_values.product_id in (?@) AND properties_values.property_id = properties.property_id AND enabled ORDER BY properties.order_num, properties_values.product_id", $ids); $this->db->query($query); $properties = $this->db->results(); foreach($properties as $property) {if(!empty($products[$property->product_id])) {$products[$property->product_id]->properties[]=$property;} } return $products; } // Функция возвращает товары function count_products($ids = null, $categories = null, $brand_id = null, $start_item=null, $filter=null, $size_id=null) { // Если заданы id $id_filter = ''; if (is_array($ids)) { foreach ($ids as $k=>$id) { $ids[$k]=intval($id); } $id_filter = is_null($ids)?"":"AND (products.product_id in(".join($ids, ',')."))"; } // Если задан бренд, добавляем фильт по бренду $brand_filter = is_null($brand_id)?"":"AND brands.brand_id = $brand_id"; // ПОДСЧЕТ количества товаров - ИНДИВИДУАЛЬНАЯ ВСТАВКА // Если задан размер, добавляем фильт по размеру //$size_filter = is_null($size_id)?"":"group by products.product_id having sizes.size_id = $size_id "; $size_filter = is_null($size_id)?"":" AND (sizes.size_id = $size_id AND products_variants.stock != 0) "; //$size_stock = is_null($size_id)?"":" AND products_variants.stock != 0 "; // Наличие данного размера у товара $size_stock = ""; //$for_size = is_null($size_id)?"":", products_variants.name, sizes.size_id "; $for_size = ""; $size_join = is_null($size_id)?"":" LEFT JOIN products_variants ON products_variants.product_id = products.product_id LEFT JOIN sizes ON sizes.name = products_variants.name "; // Две вставки для запроса сделаны для подсчета кол-ва товаров при выбранном размере, для формирования постраничного вывода. //$size_new_begin = is_null($size_id)?"":" select count(*) from ( "; $size_new_begin = ""; //$size_new_end = is_null($size_id)?"":" ) as count"; $size_new_end = ""; // ОКОНЧАНИЕ ИНДИВИДУАЛЬНОЙ ВСТАВКИ, ПИПЕЦ ПРИШЛОСЬ ПОДОЛБАТЬСЯ!!! // Если задан бренд, добавляем фильт по бренду $limit = is_null($start_item)?"":"LIMIT $start_item, $this->items_per_page"; // Если пользователь залогиен, применим сразу его скидку к ценам на товар $discount=isset($this->user->discount)?$this->user->discount:0; // Фильтр по свойствам $properties_filter = ''; if($filter) { foreach($filter as $property=>$value) $properties_filter .= sql_placeholder(" AND products.product_id in (SELECT properties_values.product_id FROM properties_values WHERE properties_values.product_id = products.product_id AND properties_values.value=? AND properties_values.property_id=?) ", $value, $property); } //С дополнительными категориями // Если задана категория, добавляем фильт по категории $category_filter = is_null($categories)?"":"AND ( (categories.category_id in(".join($categories, ',').") ) OR (products_categories.category_id in(".join($categories, ',').") ) )"; $query = $size_new_begin."SELECT count(distinct products.product_id) as count $for_size FROM products LEFT JOIN categories ON categories.category_id = products.category_id LEFT JOIN brands ON products.brand_id = brands.brand_id LEFT JOIN products_categories ON products.product_id = products_categories.product_id $size_join WHERE categories.enabled=1 and products.enabled=1 $id_filter $category_filter $brand_filter $properties_filter $size_stock $size_filter $size_new_end"; //echo '<br> >>'.$query; $this->db->query($query); $count_products = $this->db->result(); return $count_products->count; } // Функция возвращает товар по url function get_product($product_url) { $query = sql_placeholder("SELECT products.*, brands.name as brand, brands.url as brand_url, categories.single_name as category, categories.url as category_url, categories.image as category_image, products.rating, products.votes FROM products LEFT JOIN brands ON products.brand_id = brands.brand_id, categories WHERE products.url = ? AND categories.category_id = products.category_id AND categories.enabled=1 GROUP BY products.product_id LIMIT 1", $product_url); $this->db->query($query); $product = $this->db->result(); if(empty($product)) return false; // связанные товары $products = array(); $query = sql_placeholder('SELECT products_variants.product_id FROM products_variants, related_products WHERE products_variants.sku=related_products.related_sku AND related_products.product_id = ?', $product->product_id); $this->db->query($query); $related = $this->db->results(); if(!empty($related)) { foreach($related as $r) $ids[] = $r->product_id; $product->related_products = Storefront::get_products($ids); } // параметры товара $query = sql_placeholder("SELECT * FROM properties, properties_values WHERE properties_values.product_id = ? AND properties_values.property_id = properties.property_id AND enabled ORDER BY properties.order_num", $product->product_id); $this->db->query($query); $product->properties = $this->db->results(); // варианты товара // Если пользователь залогиен, применим сразу его скидку к ценам на товар $discount=isset($this->user->discount)?$this->user->discount:0; $query = sql_placeholder("SELECT products_variants.variant_id as variant_id, products_variants.sku as sku, products_variants.name as name, products_variants.price as price, products_variants.stock as stock, products_variants.discont as discont, products_variants.price*(100-$discount)/100 as discount_price FROM products_variants WHERE products_variants.product_id = ? AND products_variants.stock>0 AND products_variants.price>0 ORDER BY products_variants.position", $product->product_id); $this->db->query($query); $product->variants = $this->db->results(); $product->properties; return $product; } // Функция возвращает вариант товара function get_variant($variant_id) { // Если пользователь залогиен, применим сразу его скидку к ценам на товар $discount=isset($this->user->discount)?$this->user->discount:0; $query = sql_placeholder("SELECT products_variants.*, products_variants.price*(100-$discount)/100 as discount_price FROM products_variants WHERE products_variants.variant_id = ? LIMIT 1", $variant_id); $this->db->query($query); $variant = $this->db->result(); if(empty($variant)) return false; return $variant; } // Функция возвращает дерево категорий с товарами function get_catalog() { // Выбираем все категории $query = sql_placeholder("SELECT * FROM categories WHERE enabled=1 ORDER BY parent, order_num", $parent); $this->db->query($query); $temp_categories = $this->db->results(); foreach($temp_categories as $temp_category) $categories[$temp_category->category_id] = $temp_category; $products = Storefront::get_products(); foreach($products as $product) $categories[$product->category_id]->products[] = $product; $categories = Storefront::categories_tree($categories); return $categories; } } Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.