avatar

Отдельная страница брендов

Опубликовал в блог Дополнения и модули для Simpla CMS
0
Отдельная страница брендов с выводом изображений, описания и количества товара этого бренда.

В админке, сначала, создайте страницу, бренды, а адресом /brands. Пропишите ей метатеги и title и тд.

Открываем .htaccess и добавляем
# Каталог брендов
RewriteRule ^brands/?$ index.php?module=BrandsView [L,QSA]

Открываем файл api/Brands.php и добавляем в конце
public function get_brands_improved($filter = array())
{
$brands = array();
$category_id_filter = '';
if(!empty($filter['category_id']))
$category_id_filter = $this->db->placehold('LEFT JOIN s_products_categories pc ON p.id = pc.product_id WHERE pc.category_id in(?@)', (array)$filter['category_id']);

$query = $this->db->placehold("SELECT DISTINCT
b.id,
b.name,
b.url,
b.meta_title,
b.meta_keywords,
b.meta_description,
b.description,
b.image,
COUNT(p.id) AS `count`
FROM s_brands b LEFT JOIN s_products p ON p.brand_id=b.id $category_id_filter
WHERE p.visible = 1
GROUP BY b.id ORDER BY b.name");
$this->db->query($query);
return $this->db->results();
}

public function count_brands($filter = array())
{
$category_id_filter = '';
$brand_id_filter = '';
$keyword_filter = '';
$visible_filter = '';

if(!empty($filter['id']))
$brand_id_filter = $this->db->placehold('AND b.id in(?@)', (array)$filter['id']);

if(isset($filter['visible']))
$visible_filter = $this->db->placehold('AND b.visible=?', intval($filter['visible']));

if(isset($filter['keyword']))
{
$keywords = explode(' ', $filter['keyword']);
foreach($keywords as $keyword)
{
$kw = $this->db->escape(trim($keyword));
if($kw!=='')
$keyword_filter .= $this->db->placehold("AND (b.name LIKE '%$kw%' OR b.meta_keywords LIKE '%$kw%' OR b.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%'))");
}
}

$query = "SELECT COUNT(distinct b.id) as count
FROM __brands AS b
$category_id_filter
WHERE 1
$brand_id_filter
$keyword_filter
$visible_filter ";

$this->db->query($query);

if($this->db->query($query)) {
return $this->db->result('count');
} else {
return false;
}
}

создаем php файл BrandsView в папке view с таким содержанием
<?php
require_once('View.php');
class BrandsView extends View
{
function fetch()
{

// Количество постов на 1 странице
$items_per_page = max(1, intval($this->settings->products_num));

$filter = array();

// Текущая страница в постраничном выводе
$current_page = $this->request->get('page', 'integer');

// Если не задана, то равна 1
$current_page = max(1, $current_page);
$this->design->assign('current_page_num', $current_page);

// Вычисляем количество страниц
$brands_count = $this->brands->count_brands($filter);

// Показать все страницы сразу
if($this->request->get('page') == 'all')
$items_per_page = $brands_count;

$pages_num = ceil($brands_count/$items_per_page);

// Передаем в шаблон
$this->design->assign('total_pages_num', $pages_num);
$this->design->assign('total_brands_num', $brands_count);

$filter['page'] = $current_page;
$filter['limit'] = $items_per_page;

// Выбираем бренды из базы
$brands = $this->brands->get_brands($filter);
if(empty($brands)) {
return false;
}

// Передаем в шаблон
$this->design->assign('brands', $brands);

// Метатеги страницы
if($this->page) {
$this->design->assign('meta_title', $this->page->meta_title);
$this->design->assign('meta_keywords', $this->page->meta_keywords);
$this->design->assign('meta_description', $this->page->meta_description);
}

return $this->design->fetch('brands.tpl');
}
}

открываем файл view/View.php и после

$this->design->smarty->registerPlugin("function", "get_brands", array($this, 'get_brands_plugin'));

вставим
$this->design->smarty->registerPlugin("function", "get_brands_improved", array($this, 'get_brands_improved_plugin'));

далее в этом же файле после
* Плагины для смарти
	 *
	 */

добавим
public function get_brands_improved_plugin($params, &$smarty)
{
if(!isset($params['visible']))
$params['visible'] = 1;
if(!empty($params['var'])) {

$min = 0; $max = 0;
$steps = 5; 

if(!isset($params['steps']))
$steps = max($steps, $params['steps']);

$brands = $this->brands->get_brands_improved($params);

foreach($brands AS $v) {
if(!$max || $max < $v->count) $max = $v->count;
if(!$min || $min > $v->count) $min = $v->count;
}
$range = log($max + 1) - log($min + 1);
if(!$range) $range = 1;

foreach($brands AS $v)
$v->weigth = round((log($v->count + 1) - log($min + 1)) * $steps / $range);

$smarty->assign($params['var'], $brands);
}
}

создаем файл brands.tpl с таким содержание и закидываем его в папку вашего шаблона
{get_brands_improved var=all_brands}
{if $all_brands}
<div class='col-md-24 well well-sm paginationProductsView'>{include file='x_included_pagination.tpl'}</div>
<div class="clearfix"></div>

<ul class="row list-inline itemsList">
{foreach $all_brands as $b}
<li class="col-lg-6 col-md-8 col-xs-12">
<div class="brand">
{if $b->image}
<div class="image">
<a href="brands/{$b->url}" title="Все товары бренда {$b->name|escape}"><img src="{$b->image|resize_okaycms:145:70:false:$config->brands_resized}" alt="{$b->name|escape}"/></a>
</div>
{/if}
<h3><a data-brand="{$b->id}" href="brands/{$b->url}" title="{$b->name|escape}">{$b->name|escape|truncate:50:'...'}</a></h3>
<div class="caption">

{if $b->description}
<p>{$b->description|strip_tags|truncate:131:'...'}</p>
{/if}

{if $b->count}
<p>Всего товаров: {$b->count} </p>
{/if}

<div class="clearfix">
</div>
</div>
</div>
</li>
{/foreach}
</ul>

{else}
<div class="alert alert-warning alert-dismissable" style='margin:50px 0 300px'>
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<p><strong>Внимание!</strong></p>Сейчас в данном разделе нет предложений. Возможно список находится на редактировании.<br />Попробуйте зайти позже.
</div>
{/if}
3 комментария RSS
avatar
Добрый день!
на шаге: открываем файл view/View.php и после

$this->design->smarty->registerPlugin("function", "get_brands_improved", array($this, 'get_brands_improved_plugin'));


у меня следующий код:
$this->design->smarty->registerPlugin("function", "get_brands",					array($this, 'get_brands_plugin'));
            
avatar
исправил
avatar
сделал все по инструкции.
В итоге при нажатии на кнопку производители я перехожу на страницу /brands, а там ничего нет(((
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.