16 заметок с тегом

simplacms

Позднее Ctrl + ↑

Функция вывода товаров в Simpla CMS

Создадим вызов функции в /view/View.php

$this->design->smarty->registerPlugin("function", "get_products", array($this, 'get_products_plugin'));

Далее там же добавим саму функцию, например, после get_discounted_products:

public function get_products_plugin($params, &$smarty)
{
    if(!isset($params['visible']))
        $params['visible'] = 1;
    if(!empty($params['var']))
    {
        foreach($this->products->get_products($params) as $p)
            $products[$p->id] = $p;
 
        if(!empty($products))
        {
            // id выбраных товаров
            $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;
 
            foreach($products as &$product)
            {
                if(isset($product->variants[0]))
                    $product->variant = $product->variants[0];
                if(isset($product->images[0]))
                    $product->image = $product->images[0];
            }               
        }
 
        $smarty->assign($params['var'], $products);
         
    }
}

Пример использования:

{get_products var=all_products limit=3}
{if $all_products}
{foreach $all_products as $p}
//выводим товар в цикле
{/foreach}
{/if}
  1. limit с числовым значение указывает какое количество товара долно быть в выборке
  2. discounted — передав данный параметр со значение 1 мы получим товары со скидкой
  3. featured со значение 1 вернет рекомендуемые товары
  4. sort может принимать 4 значения — name, created, position и price — вернет товары в той сортировке, которую указали
  5. in_stock со значением 1 указывает, что надо только те товары, которые есть в наличии
  6. brand_id с числовым индексом бренда вернет товары указанного бренда
  7. category_id с числовым индексом категории вернет товары указанной категории
  8. keyword со значение к примеру «Samsung» вернет товары где в названии или META встречается указанное слово (поиск по названию)

Найдено в интернете, но пользуюсь регулярно.

2018   simplacms
2018   htaccess   simplacms

Simpla CMS: JS & CSS Minify + Combine

Велосипед не мой, но очень полезный. Сначала поработаем под капотом:

  1. Распаковать из архива в корень сайта файлы
  2. Добавим в api/Simpla.php:
'js'     => 'Javascript',
'css'     => 'Stylesheet',
  1. Добавим в файл view/View.php после строки:
$this->design->smarty->registerPlugin('block', 'js',        array($this, 'add_javascript_block'));
$this->design->smarty->registerPlugin('function', 'unset_js',        array($this, 'unset_javascript_function'));
$this->design->smarty->registerPlugin('function', 'javascript',        array($this, 'print_javascript'));
$this->design->smarty->registerPlugin('block', 'css',        array($this, 'add_stylesheet_block'));
$this->design->smarty->registerPlugin('function', 'unset_css',        array($this, 'unset_stylesheet_function'));
$this->design->smarty->registerPlugin('function', 'stylesheet',        array($this, 'print_stylesheet'));
  1. Далее в этом же файле перед строкой:
public function get_discounted_products_plugin($params, &$smarty)

Добавим:

public function add_javascript_block($params, $content, $smarty, &$repeat)
    {
        if(!isset($params['id']) || $repeat || (empty($content)) && empty($params['include']))
            return false;
        if(!isset($params['priority']))
            $params['priority'] = 10;
        if(!empty($params['include']))
            $this->js->add_files($params['id'], $params['include'], $params['priority']);
        if(!empty($content))
            $this->js->add_code($params['id'], $content, $params['priority']);
        if(!empty($params['render']))
        {
            if(!isset($params['minify']))
                $params['minify'] = null;    
            if(!isset($params['combine']))
                $params['combine'] = true;
            return $this->js->render($params['id'], $params['minify'], $params['combine']);
        }
    }    
    public function unset_javascript_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;
        $this->js->unplug($params['id']);
    }
    public function print_javascript($params)
    {
        if(!isset($params['id']))
            $params['id'] = null;
        if(!isset($params['combine']))
            $params['combine'] = true;
        if(!isset($params['minify']))
            $params['minify'] = null;
        return $this->js->render($params['id'], $params['minify'], $params['combine']);
    }    
    public function add_stylesheet_block($params, $content, $smarty, &$repeat)
    {
        if(!isset($params['id']) || $repeat || (empty($content)) && empty($params['include']))
            return false;
        if(!isset($params['priority']))
            $params['priority'] = 10;
        if(!isset($params['less']))
            $params['less'] = false;
        if(!empty($params['include']))
            $this->css->add_files($params['id'], $params['include'], $params['priority'], $params['less']);
        if(!empty($content))
            $this->css->add_code($params['id'], $content, $params['priority'], $params['less']);
        if(!empty($params['render']))
        {
            if(!isset($params['minify']))
                $params['minify'] = null;    
            if(!isset($params['combine']))
                $params['combine'] = true;
            return $this->css->render($params['id'], $params['minify'], $params['combine']);
        }
    }    
    public function unset_stylesheet_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;
        $this->css->unplug($params['id']);
    }
    public function print_stylesheet($params)
    {
        if(!isset($params['id']))
            $params['id'] = null;
        if(!isset($params['combine']))
            $params['combine'] = true;
        if(!isset($params['minify']))
            $params['minify'] = null;
        return $this->css->render($params['id'], $params['minify'], $params['combine']);
    }
  1. В config-файл добавляем:
minify_js    = false;
minify_css    = false;
minify_gzip_level    = 0;
minify_cache_dir    = cache/minify/;
  1. В .htaccess после RewriteEngine on добавляем:
<FilesMatch "(js|css).gz[1-9]$">
	<IfModule mod_headers.c>
		Header set Content-Encoding: gzip
	</IfModule>
    <FilesMatch "css.gz[1-9]$">
        ForceType text/css
    </FilesMatch>
    <FilesMatch "js.gz[1-9]$">
        ForceType text/javascript
    </FilesMatch>
</FilesMatch>
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cache/minify/(.+).gz([1-9])$ resize/gzip.php [L,END]

Чтобы всё заработало:

{stylesheet minify=true}
{javascript combine=true}

Группировка файлов:

{css id="libs" include=[
"design/{$settings->theme}/css/bootstrap.css",
"design/{$settings->theme}/css/animate.css",
"design/{$settings->theme}/css/style.css"
]}{/css}

{js id="libs" priority=99 include=[
"design/{$settings->theme}/js/jquery-2.1.1.min.js",
"design/{$settings->theme}/js/bootstrap.min.js"
]}{/js}

Функции принимают параметры:

id — служит для идентификации (обязательный параметр)
include — строка или массив строк для добавления в очередь
priority — приоритет вывода. По умолчанию равен 10 (если не указывать файлы будут становится один за одним согласно вызову функций) Чем больше приоритет тем он быстрее будет на выводе
less — если установлено true то данному ресурсу будет применен синтаксис less и перекодирован в css. (по умолчанию: false)
render — если данный параметр установлен в true то код на очередь не станет, а будет выведен прямо в месте вызова функции. Параметры minify и combine буриться глобальные.
minify — если данный параметр установлен в true то к данному ресурсу будет применяться сжатие. Если false — то файлы принадлежащие данному id не будут сжиматься. (по умолчанию: значение config.php)
combine — если данный параметр установлен в true то к данному ресурсу будет применяться упаковка в один файл. Если false — то файлы принадлежащие данному id не будут паковаться в один файл. (по умолчанию: значение config.php)

2018   htaccess   simplacms

SimplaCMS: Определение города пользователя по IP

Работает через Yandex API. Подключим jQuery, если до этого не подключён:

<script src="http://yastatic.net/jquery/2.1.1/jquery.min.js"></script>

Далее разместим в подвале скрипт:

<script type="text/javascript">
  window.onload = function () {
      jQuery("#user-city").text(ymaps.geolocation.city);
  }
</script>
<script src="http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU" type="text/javascript"></script>

А чтобы вывести, в шаблоне в необходимом месте пишем:

<div id="user-city"></div> или <span id="user-city"></span>
2018   simplacms

SimplaCMS: Автогенерация Title и Meta Description для товаров и категорий

Для генерации Title категорий

{$meta_title = "{$category->name|escape}{if $brand->name} Бренд {$brand->name|escape}{/if}{if $page->name}{$page->name}{/if} - купить в интернет-магазине {$settings->name}" scope=parent}

Для генерации Title товаров

{$meta_title = "{$product->name|escape} {if ($brand->name)}({$brand->name|escape}){/if}{if $product->variant->sku} артикул {$product->variant->sku|escape}{/if} - купить в интернет-магазине {$settings->name}" scope=parent}

Для генерации Meta Description товаров открыть ProductView.php и добавить после:

// Добавим текущий товар
$product->meta_description = 'Товар ' .$product->name $product->variant->sku. ' можно приобрести в интернет-магазине по цене '.$product->variant->price.' с доставкой по России.';
2018   seo   simplacms

Simpla CMS: OpenGraph разметка для соцсетей

Открываем index.tpl вашего шаблона и пишем:

<meta property="og:title" content="{if $module == 'ProductsView' || $module == 'ProductView'}{$product->name|escape}{else}{$page->header|escape}{/if}" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{$config->root_url}{url}" />
<meta property="og:image" content="{if $module == 'ProductsView' || $module == 'ProductView'}{$product->image->filename|resize:330:300}{else}https://olmatex.com/design/olmatex/images/logo.png{/if}" />
{if $module == 'ProductsView' || $module == 'ProductView'}<meta property="og:description" content="{$product->annotation|strip_tags}" />{/if}

В результате получим красивые ссылки на товары и другие страницы вашего интернет-магазина в соцсетях и мессенджерах.

2018   simplacms