
Сравнение товаров, избранное
Опубликовал
Dmitriy
в блог Дополнения и модули для 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.
ДЕМО
Момент с версией php решен?
/**
* @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);
}
}
/**
* @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);
}
}
$result = new stdClass();
перед
$result->key = $key; // ключ
И аякс заработает.
А то PHP7 ругался на динамический объект.