avatar

Сравнение товаров, избранное

Опубликовал в блог Дополнения и модули для Simpla CMS
0


В стандартной сборке Simpla CMS нет этих очень важных функция, поэтому мы сейчас и восполним данный недостаток.

Внимание!!! Данное решение рассчитано для тех у кого стандартный шаблон default, если у вас есть изменения в шаблоне, то придется переделывать стили под дизайн вашего сайта.

И так, приступим.
Для начала качаем файл product_to_session.php и закидываем его в папку ajax в корне сайта.
Далее открываем файл View.php в папке view и после
$this->design->smarty->registerPlugin("function", "get_discounted_products", array($this, 'get_discounted_products_plugin'));

добавляем
// MyList
	$this->design->smarty->registerPlugin("function", "get_products",            array($this, 'get_products_plugin'));
	$this->design->smarty->registerPlugin("function", "get_session_products",    array($this, 'get_session_products_plugin'));
	$this->design->smarty->registerPlugin("function", "remove_product_session",  array($this, 'remove_product_session_plugin'));
	$this->design->smarty->registerPlugin("function", "add_product_session",     array($this, 'add_product_session_plugin'));
// MyList END

и после
/**
	 *
	 * Отображение
	 *
	 */
	function fetch()
	{
		return false;
	}

добавляем
// MyList
	public function add_product_session_plugin($params, &$smarty)
	{
        $key  = $params['key'];
        $id   = $params['id'];
        if(empty($key) && empty($id))
            return false;
        if(!$this->design->smarty->templateExists('products_session_'.$key.'_informer.tpl'))
            return false;
        $product = $this->products->get_product((int)$id);
        if(empty($product))
            return false;
		$_SESSION[$key][$product->id] = $product->id;
	}
	public function remove_product_session_plugin($params, &$smarty)
	{
		if(!empty($params['key']) && $params['remove'] && !empty($_SESSION[$params['key']][$params['remove']]))
        {
            unset($_SESSION[$params['key']][$params['remove']]);
		}
	}
	public function get_session_products_plugin($params, &$smarty)
	{
		if(!empty($_SESSION[$params['key']]))
        {
            $result->key   = $params['key']; // ключ
            $result->ids   = $_SESSION[$params['key']]; // сессия
            $result->count = count($_SESSION[$params['key']]); // количество
            $smarty->assign($params['key'], $result);
		}
	}
	public function get_products_plugin($params, &$smarty)
	{
		if(!empty($params['var']))
		{
            if(!empty($params['get_session_products'])){
                if(!empty($_SESSION[$params['get_session_products']])){
                    $params['id'] = $_SESSION[$params['get_session_products']];
                    $params['visible'] = 1;
                }
                else{
                    return false;
                }
            }
			foreach($this->products->get_products($params) as $p)
				$products[$p->id] = $p;
			if(!empty($products))
			{
				$products_ids = array_keys($products);
				$variants = $this->variants->get_variants(array('product_id'=>$products_ids, 'in_stock'=>true));
				foreach($variants as &$variant)
				{
					$products[$variant->product_id]->variants[] = $variant;
				}
				$images = $this->products->get_images(array('product_id'=>$products_ids));
				foreach($images as $image)
					$products[$image->product_id]->images[] = $image;

                if(!empty($params['data_features'])){
    			    $properties = $this->features->get_product_options($products_ids);
    			    foreach($properties as $property)
    				    $products[$property->product_id]->options[] = $property;
                }
                if(!empty($params['data_categories'])){
    			    $categories = $this->categories->get_categories(array('product_id'=>$products_ids));
                    $product_categories = $this->categories->get_product_categories($products_ids);
    			    foreach($product_categories as $category)
    				    $products[$category->product_id]->categories[$category->category_id] = $categories[$category->category_id];
                }
				foreach($products as &$product)
				{
					if(isset($product->variants[0]))
						$product->variant = $product->variants[0];
					if(isset($product->images[0]))
						$product->image = $product->images[0];
					if(!empty($product->categories))
						$product->category = reset($product->categories);
				}
			}
			$smarty->assign($params['var'], $products);

		}
	}
    // MyList END

Качаем архив и содержимое закидываем в папку html вашего шаблона.
Открываем файл index.tpl вашего шаблона и после
<!-- Поиск-->
			<div id="search">
				<form action="products">
					<input class="input_search" type="text" name="keyword" value="{$keyword|escape}" placeholder="Поиск товара"/>
					<input class="button_search" value="" type="submit" />
				</form>
			</div>
<!-- Поиск (The End)-->

добавляем
<style type="text/css">
                .mylist{
                    padding:5px;
                    margin:5px 0;
                    background: #FFFFFF;
                    border: 1px solid #E8E8E8;
                    border-radius:3px;
                    width:190px;
                }
                .mylist_add{
                    padding:5px;
                    margin:2px 0;
                    background: #FFFFFF;
                    border: 1px solid #E8E8E8;
                    border-radius:3px;
                    width:190px;
                }
            </style>

            {get_session_products key=compare}
		    <div id="compare_informer" class='mylist'>
            {include file='products_session_compare_informer.tpl' session=$compare}
            </div>

            {get_session_products key=wishlist}
		    <div id="wishlist_informer" class='mylist'>
            {include file='products_session_wishlist_informer.tpl' session=$wishlist}
            </div>

далее тут же, после
<script src="design/{$settings->theme}/js/ajax_cart.js"></script>

добавляем
<script src="design/{$settings->theme}/js/product_to_session.js"></script>

Качаем файл product_to_session.js и закидываем в папку js вашего шаблона.
Далее открываем файл products.tpl и ищем
<!-- Список товаров-->
<ul class="products">

	{foreach $products as $product}
	<!-- Товар-->
	<li class="product">
		
		<!-- Фото товара -->
		{if $product->image}
		<div class="image">
			<a href="products/{$product->url}"><img src="{$product->image->filename|resize:200:200}" alt="{$product->name|escape}"/></a>
		</div>
		{/if}
		<!-- Фото товара (The End) -->

		<div class="product_info">
		<!-- Название товара -->
		<h3 class="{if $product->featured}featured{/if}"><a data-product="{$product->id}" href="products/{$product->url}">{$product->name|escape}</a></h3>
		<!-- Название товара (The End) -->

		<!-- Описание товара -->
		<div class="annotation">{$product->annotation}</div>
		<!-- Описание товара (The End) -->
		
		{if $product->variants|count > 0}
		<!-- Выбор варианта товара -->
		<form class="variants" action="/cart">
			<table>
			{foreach $product->variants as $v}
			<tr class="variant">
				<td>
					<input id="variants_{$v->id}" name="variant" value="{$v->id}" type="radio" class="variant_radiobutton" {if $v@first}checked{/if} {if $product->variants|count<2}style="display:none;"{/if}/>
				</td>
				<td>
					{if $v->name}<label class="variant_name" for="variants_{$v->id}">{$v->name}</label>{/if}
				</td>
                <td width="60">
					{if $v->sku}Арт.{$v->sku}{/if}
				</td>
				<td>
					{if $v->compare_price > 0}<span class="compare_price">{$v->compare_price|convert}</span>{/if}
					<span class="price">{$v->price|convert} <span class="currency">{$currency->sign|escape}</span></span>
				</td>
			</tr>
			{/foreach}
			</table>
			<input type="submit" class="button" value="в корзину" data-result-text="добавлено"/>
		</form>
		<!-- Выбор варианта товара (The End) -->
		{else}
			Нет в наличии
		{/if}

		</div>
		
	</li>
	<!-- Товар (The End)-->
	{/foreach}
			
</ul>

и меняем на
{get_session_products key=compare}
{get_session_products key=wishlist}

<!-- Список товаров-->
<ul class="products">
    {include file='products_list.tpl'}
</ul>

должно получится так
{include file='pagination.tpl'}

{get_session_products key=compare}
{get_session_products key=wishlist}

<!-- Список товаров-->
<ul class="products">
    {include file='products_list.tpl'}
</ul>

{include file='pagination.tpl'}	
<!-- Список товаров (The End)-->

Дальше открываем файл page.tpl вашего шаблона и после
<!-- Тело страницы -->
{$page->body}

добавляем
{if $page->url == 'compare'}
    {include file='products_session_compare.tpl'}
{/if}

{if $page->url == 'wishlist'}
    {include file='products_session_wishlist.tpl'}
{/if}

Теперь создаем в админке страницы «Сравнения товаров» с адресом /compare и страницу «Избранное» с адресом /wishlist и радуемся.

Спасибо DaVinci.

ДЕМО

19 комментариев RSS
avatar
В инструкции сравнение и избранное заданы только для products.tpl, подскажите что прописать в product.tpl, чтобы сравнение и избранное появлялось в каждом товаре?
avatar
Сделал все строго по инструкции на дефолтном шаблоне, не работает аякс-обновление, то есть когда нажимаешь" Добавить в желаемые" или «сравнение», то ничего не происходит, а когда обновляешь страницу, то тогда надпись меняется «уже в списке». То есть все по сути работает, но требуется обновление страницы. Пробовал на чистой официальной версии 2.3.4 и 2.3.6 — никаких изменений. Видимо что-то в Вашей инструкции упущено, или же в файлах product_to_session.js что-то н так.
avatar
проверим, если что, исправлю
avatar
Когда сможете глянуть? Проделать эти все действия по инструкици занимает минуты 3, я уже раз 5 делал на чистых установках — и одно и то же, нет аякс-обновления, или как оно там называется. А корзина обновляется нормально при нажатии «Купить».
avatar
Проблема была в весрии PHP, поменял с 5.3 на 5.2 и заработало… Подскажите как заставить работать на 5.3
avatar
Уважаемые, файла product_to_session.php по указанное ссылке нет, есть другие ссылки?
avatar
Спасибо! еще вопрос по платным модулям, по разработке, понял что занимаетесь, нужен модуль для Simpla 2.3.x для покупки услуги по времени (то есть чтобы покупать время (а точнее забронировать, без оплаты) при этом сам клиент чтоб мог выбрать #c 8:00 до 12:30, после этого доступно к примеру с 12:30 до 20:00 ) и редактированием из адмики — существует ли подобное решение? Из ряда фантастики сделать такое? Готов обсудить ПОКУПКУ в случаи чего
avatar
Так никто и не смог сделать для php 5.3?
avatar
Что то так и не понял до конца. Решение которое переставлено выше рабочие или нет?
Момент с версией php решен?
avatar
И еще одно, ссылка на «product_to_session.js» не работает, мол ничего не найдено ;)
avatar
Как автор данного дополнения буду рад если оно кому то поможет, а автора темы прошу сделать ссылку на мой профиль на форму симплы.
avatar
добавил ссылку в конце статьи
avatar
Ссылка на файл product_to_session.js не рабочая.
avatar
исправил, спасибо за бдительность 8-)
avatar
Рабочая функция get_session_products_plugin:
/**
* @param $params
* @param $smarty Smarty()
*/
public function get_session_products_plugin($params, &$smarty)
{
if(!empty($_SESSION[$params['key']]))
{
$this->key = $params['key']; // ключ
$this->ids = $_SESSION[$params['key']]; // сессия
$this->count = count($_SESSION[$params['key']]); // количество
$smarty->assign($params['key'], $this);
}
}
avatar
Или лучше так:
/**
* @param $params
* @param $smarty Smarty()
*/
public function get_session_products_plugin($params, &$smarty)
{
if(!empty($_SESSION[$params['key']]))
{
$result = new stdClass();
$result->key = $params['key']; // ключ
$result->ids = $_SESSION[$params['key']]; // сессия
$result->count = count($_SESSION[$params['key']]); // количество
$smarty->assign($params['key'], $result);
}
}
avatar
В product_to_session.php добавить:
$result = new stdClass();
перед
$result->key = $key; // ключ
И аякс заработает.
А то PHP7 ругался на динамический объект.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.