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

Вывод данных из таблицы с маленькой буквы


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

Всем привет!

 

Прошу помощи..

 

Есть {$category->name} выводит название категории в виде "Категория", как сделать так чтобы вывод был с маленькой буквы "категория", без изменения в самой таблице?

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

Стилями сделайте.

style="text-transform: lowercase;" если прямо в шаблоне или добавьте text-transform: lowercase; в нужный класс в стилях
Ссылка на сообщение
Поделиться на другие сайты

Немного разобрался надо сделать так {$category->name|lower}. Но работает только с английским языком, на русском не срабатывает. Как исправить?

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

А что мешает титлу задать стиль?

<title style="text-transform: lowercase;">{$category->name|lower}</title>


Или Вы это всё в PHP пытаетесь сделать?

Тогда strtolower() Вам в помощь.

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

Немного разобрался надо сделать так {$category->name|lower}. Но работает только с английским языком, на русском не срабатывает. Как исправить?

Работает и с кириллицей. Я проверил.

<title>{$meta_title|lower}</title>

вывел

<title>кровати</title>

хотя категория называется Кровати

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

у меня не работает с кириллицей... возможно из за того что simpla 1.4

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

Возможно. Т.к. там версия смарти еще старая стоит.

А на строне PHP не подходит? Если сразу в шаблон выводить строчными буквами?

А там, где нужно с заглавной, потом стилями править.

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

а как в php сделать? надо только в title сделать маленькие буквы во всех остальных местах должно быть с заглавной..

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

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

 

$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.

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

 

 1. Он переписывает названия в нижний регистр только в категориях верхнего уровня, у остальных останется по-прежнему.

Тут нужно, чтобы ТС уточнял, что он этим преследует. Как я понял, он хочет к какому-то титлу добавлять еще и название категории.

Тогда возникает вопрос, на каких страницах ему это нужно. Если везде, то реализация будет одна. Если на странице с категориями, то другая и т.д.

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

Дописать цикл с перебором подкатегорий не сложно. Нужно для начала чтобы ТС сказал, на каких страницах это ему нужно.

Можно вообще выводить в шаблон отдельной переменной $title_category, например.

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

По-моему, ТС поставил задачу весьма точно и понятно.

Тут нужно, чтобы ТС уточнял, что он этим преследует. Как я понял, он хочет к какому-то титлу добавлять еще и название категории.

Тогда возникает вопрос, на каких страницах ему это нужно. Если везде, то реализация будет одна. Если на странице с категориями, то другая и т.д.

Ясно сказано - преследует цель, чтобы в title название категории было маленькими буквами.

Естестествено, не у всех страниц, а у тех, в которых он захочет прописать в шаблоне.

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

По-моему, смысл прост. БД запись может быть с заглавной "Диваны", а при выводе в title надо маленькими буквами "диваны".

Дописать цикл с перебором подкатегорий не сложно. Нужно для начала чтобы ТС сказал, на каких страницах это ему нужно.

Видимо, надо делать так, чтоб работало на ВСЕХ страницах.

Можно вообще выводить в шаблон отдельной переменной $title_category, например.

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

Мда. Смена ника сущности человека не поправила. Ты, как обычно, в своем репертуаре. Лишь бы рассусоливать ;)

Ясно сказано - преследует цель, чтобы в title название категории было маленькими буквами.

Что тут ясно? На странице какой? Там, где категория выводится в шаблон или на странице с постами?

 

Видимо, надо делать так, чтоб работало на ВСЕХ страницах.

Да что ты ....?

И какую категорию выводить на странице корзины?

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

Прекращайте срач.

Корс, тебе последнее предупреждение.

Если нечего сказать ПО-СУЩЕСТВУ (конкретный код) то лучше молчи.

А то опять в бан угодишь.

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

Если по сути:

В последних версиях Смарти прекрасно работает такая конструкция

{mb_strtolower($category->name)}

Что там было в 1.4 - уже давно не помню.

Как вариант - написать свой модификатор для Смарти.

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

Если по сути:

В последних версиях Смарти прекрасно работает такая конструкция

{mb_strtolower($category->name)}
Что там было в 1.4 - уже давно не помню.

Как вариант - написать свой модификатор для Смарти.

Для этого нужно а php.ini доп. строчку прописать, кажись mb_string = true я точно не помню.
Ссылка на сообщение
Поделиться на другие сайты

Может смарти как нибудь обновить можно или еще что? Чтобы lower заработало с кириллицей ..

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

Что тут ясно? На странице какой? Там, где категория выводится в шаблон или на странице с постами?

В посте #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}

 

Проверял на последней версии, у меня работает.

Изменено пользователем ЯкЦинДрак
Ссылка на сообщение
Поделиться на другие сайты

В 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;

	}

}

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

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

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

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

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

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

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

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

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

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