Jump to content

Recommended Posts

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

 

Есть товар на сайте в наличии с остатком > 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}

 

+ под заказ

 

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

 

Спасибо!

Link to post
Share on other sites
  • 1 month later...
  • 3 weeks later...

А что вы будете сортировать? у Вас же всего 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 уже прописаны. Так же можно сделать сортировку по товарам со скидкой и если товар хит продаж.

Link to post
Share on other sites

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

Link to post
Share on other sites

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

 

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

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

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

Link to post
Share on other sites

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

$_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);
		}
Link to post
Share on other sites

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

 

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

 

		// Текущий фильтр если был передан запрос 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);
		}
Link to post
Share on other sites

 

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

 

		// Текущий фильтр если был передан запрос 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);
		}

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

Edited by filth
Link to post
Share on other sites

 

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

 

		// Текущий фильтр если был передан запрос 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 товаров, но то просто.... И вернуть возможность показать "все товары")))

Link to post
Share on other sites

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

 

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites
  • 5 months later...

а у меня немного другая ситуация - для товаров под заказ у меня добавлен чекбок "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. Т.е. пустых значений нет

Link to post
Share on other sites

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

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

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

 

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

 

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

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

на

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

 

или так

if(!empty($filter['zakaz']) || $filter['zakaz'] === 0) 
Edited by mishanya
Link to post
Share on other sites

 

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

 

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

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

на

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

 

или так

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

 

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

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

Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...