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

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

Здравствуйте!

 

Есть товар на сайте в наличии с остатком > 1

Также есть товар под заказ с остатком = 0 

 

В чистой simpla есть возможность сортировки: sort - порядок товаров, возможные значения: position(по умолчанию), name, price

 

Как добавить сортировку в наличии и под заказ

 

Что то типа 

 

{* Сортировка *}
{if $products|count>0}
<div class="sort">
	Сортировать по 
	<a {if $sort=='position'} class="selected"{/if} href="{url sort=position page=null}">умолчанию</a>
	<a {if $sort=='price'}    class="selected"{/if} href="{url sort=price page=null}">цене</a>
	<a {if $sort=='name'}     class="selected"{/if} href="{url sort=name page=null}">названию</a>
       <a {if $sort=='in_stock'}     class="selected"{/if} href="{url sort=in_stock page=null}">наличию</a>
</div>
{/if}

 

+ под заказ

 

Видел реализацию на форуме, но теперь не могу найти.

 

Спасибо!

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

А что вы будете сортировать? у Вас же всего 2 варианта: есть товар, и нет. Вам фильтр наверно нужен показать все товары с  кол. >0 и =0. То тут все просто: 

файл ProductsView.php после 

// Сортировка товаров, сохраняем в сесси, чтобы текущая сортировка оставалась для всего сайта
		if($sort = $this->request->get('sort', 'string'))
			$_SESSION['sort'] = $sort;		
		if (!empty($_SESSION['sort']))
			$filter['sort'] = $_SESSION['sort'];			
		else
			$filter['sort'] = 'position';			
		$this->design->assign('sort', $filter['sort']);

добавим 

// Текущий фильтр
		if($f = $this->request->get('filter', 'string'))
		{
			if($f == 'outofstock')
				$filter['in_stock'] = 0; 
			elseif($f == 'in_stock') 
				$filter['in_stock'] = 1;
			$this->design->assign('filter', $f);
		}

В файле products.tpl после 

<div class="sort">
	Сортировать по 
	<a {if $sort=='position'} class="selected"{/if} href="{url sort=position page=null}">умолчанию</a>
	<a {if $sort=='price'}    class="selected"{/if} href="{url sort=price page=null}">цене</a>
	<a {if $sort=='name'}     class="selected"{/if} href="{url sort=name page=null}">названию</a>
</div>

Добавим 

 <div class="filter">
 
	<ul>
	<li>Показать:</li>
<li {if !$filter}class="selected"{/if}><a href="{url brand_id=null category_id=null keyword=null page=null filter=null}">Все товары</a></li>
	<li {if $filter=='in_stock'}class="selected"{/if}><a href="{url keyword=null brand_id=null category_id=null page=null filter='in_stock'}">В наличии</a></li>
	<li {if $filter=='outofstock'}class="selected"{/if}><a href="{url keyword=null brand_id=null category_id=null page=null filter='outofstock'}">Нет в наличии</a></li>
	</ul>
	
 </div>

И все. Это есть в админке, и все классы в API уже прописаны. Так же можно сделать сортировку по товарам со скидкой и если товар хит продаж.

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

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

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

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

 

сохраняйте значение фильтра в сессию 

$_SESSION['in_stock'] = $filter['in_stock'];

и передавайте эту сессию назад в шаблон

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

сохраняйте значение фильтра в сессию 

$_SESSION['in_stock'] = $filter['in_stock'];

и передавайте эту сессию назад в шаблон

Понимаю, что прошу многовато, но помогите как правильно это добавить сюда 

		// Текущий фильтр
		if($f = $this->request->get('filter', 'string'))
		{
			if($f == 'featured')
				$filter['featured'] = 1; 
			elseif($f == 'discounted')
				$filter['discounted'] = 1;
			
			elseif($f == 'outofstock')
			
				$filter['in_stock'] = 0; 
			elseif($f == 'in_stock') 
				$filter['in_stock'] = 1;
			$this->design->assign('filter', $f);
		}
Ссылка на сообщение
Поделиться на другие сайты

Понимаю, что прошу многовато, но помогите как правильно это добавить сюда 

 

так попробуйте

 

		// Текущий фильтр если был передан запрос get-параметром
		if($this->request->get('filter', 'string')) {
			$f = $this->request->get('filter', 'string');
		} 
		// если ничего не передавали, но в сессии присутствует значение фильтра
		elseif(isset($_SESSION['filter_stat'])) {
			$f = $_SESSION['filter_stat'];
		}
		
		if(isset($f)) {
			if($f == 'featured')
				$filter['featured'] = 1; 
			elseif($f == 'discounted')
				$filter['discounted'] = 1;
			elseif($f == 'outofstock')
				$filter['in_stock'] = 0; 
			elseif($f == 'in_stock') 
				$filter['in_stock'] = 1;
			
			// запишем новое значение фильтра в сессию
			$_SESSION['filter_stat'] = $f;
			//передадим значение назад в шаблон
			$this->design->assign('filter', $f);
		}
Ссылка на сообщение
Поделиться на другие сайты

 

так попробуйте

 

		// Текущий фильтр если был передан запрос get-параметром
		if($this->request->get('filter', 'string')) {
			$f = $this->request->get('filter', 'string');
		} 
		// если ничего не передавали, но в сессии присутствует значение фильтра
		elseif(isset($_SESSION['filter_stat'])) {
			$f = $_SESSION['filter_stat'];
		}
		
		if(isset($f)) {
			if($f == 'featured')
				$filter['featured'] = 1; 
			elseif($f == 'discounted')
				$filter['discounted'] = 1;
			elseif($f == 'outofstock')
				$filter['in_stock'] = 0; 
			elseif($f == 'in_stock') 
				$filter['in_stock'] = 1;
			
			// запишем новое значение фильтра в сессию
			$_SESSION['filter_stat'] = $f;
			//передадим значение назад в шаблон
			$this->design->assign('filter', $f);
		}

Работает на отлично! Спасибо огромное, уверен много кому будет полезно. 

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

 

так попробуйте

 

		// Текущий фильтр если был передан запрос get-параметром
		if($this->request->get('filter', 'string')) {
			$f = $this->request->get('filter', 'string');
		} 
		// если ничего не передавали, но в сессии присутствует значение фильтра
		elseif(isset($_SESSION['filter_stat'])) {
			$f = $_SESSION['filter_stat'];
		}
		
		if(isset($f)) {
			if($f == 'featured')
				$filter['featured'] = 1; 
			elseif($f == 'discounted')
				$filter['discounted'] = 1;
			elseif($f == 'outofstock')
				$filter['in_stock'] = 0; 
			elseif($f == 'in_stock') 
				$filter['in_stock'] = 1;
			
			// запишем новое значение фильтра в сессию
			$_SESSION['filter_stat'] = $f;
			//передадим значение назад в шаблон
			$this->design->assign('filter', $f);
		}

Теперь надо бороться с случаем, если фильтр нашел 0 товаров, но то просто.... И вернуть возможность показать "все товары")))

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

Теперь надо бороться с случаем, если фильтр нашел 0 товаров, но то просто.... И вернуть возможность показать "все товары")))

 

чтобы показать все товары просто передайте в параметр filter любое другое значение что отличается от ваших условий, например empty, тогда фильтры скинуться. и в сессию запишеться что фильтр пустой 

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

чтобы показать все товары просто передайте в параметр filter любое другое значение что отличается от ваших условий, например empty, тогда фильтры скинуться. и в сессию запишеться что фильтр пустой 

Уже так и сделал, спасибо)

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

а у меня немного другая ситуация - для товаров под заказ у меня добавлен чекбок "zakaz" по инструкции с форума, для товаров в наличии zakaz = 0, под заказ zakaz = 1. 

Пытаюсь сделать фильтр как выше писали, вставляю в ProductsView.php:

// Фильтр по наличию
		if($f = $this->request->get('filter', 'string'))
		{
			if($f == 'instock')
				$filter['zakaz'] = 0;
			elseif($f == 'outofstock') 
				$filter['zakaz'] = 1;
			$this->design->assign('filter', $f);
		}

 

В шаблоне вывожу так:

<a href="{url brand_id=null category_id=null keyword=null page=null filter=null}" {if !$filter}class="selected"{/if}>Все</a>

<a href="{url keyword=null brand_id=null category_id=null page=null filter='instock'}" {if $filter=='instock'}class="selected"{/if}>В наличии</a>

<a href="{url keyword=null brand_id=null category_id=null page=null filter='outofstock'}" {if $filter=='outofstock'}class="selected"{/if}>Под заказ</a>
                

И ничего не выходит, точнее работает фильтр только для товаров под заказ (zakaz = 1), а товары в наличии (zakaz = 0) отдельно не показывает, показывает все вместе в наличии и под заказ.

 

Посмотрел файл api/Products.php, там для zakaz указано по аналогии с discounted:

if(!empty($filter['zakaz']))
			$is_zakaz_filter = $this->db->placehold('AND p.zakaz=?', intval($filter['zakaz']));

 

Не подскажите в какую сторону копать?

 

Р.S. в базе данных глянул, у всех товаров проставлен zakaz как 0 или 1. Т.е. пустых значений нет

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

пробовал так:

$filter['zakaz'] = '0';

Тоже не помогает. Народ, выручайте!

 

дело в том что empty() возвращает false при пустом и нулевом значении.

 

верните на 0 и замените

if(!empty($filter['zakaz']))

на

if(isset($filter['zakaz']))

 

или так

if(!empty($filter['zakaz']) || $filter['zakaz'] === 0) 
Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

 

дело в том что empty() возвращает false при пустом и нулевом значении.

 

верните на 0 и замените

if(!empty($filter['zakaz']))

на

if(isset($filter['zakaz']))

 

или так

if(!empty($filter['zakaz']) || $filter['zakaz'] === 0) 

 

сделал как вы сказали, но почему то не сработало( 

странно, в чем может быть дело?

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

сделал как вы сказали, но почему то не сработало( 

странно, в чем может быть дело?

ну вроде должно выводить. надо смотреть что там у вас еще в Products.php. хотите пишите в личку фтп, так нет времени гадать).

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

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

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

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

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

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

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

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

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

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