<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Блог Чуденкова Алексея, заметки с тегом: simplacms</title>
<link>https://blog.chudenkov.ru/tags/simplacms/</link>
<description></description>
<generator>E2 (v3365; Aegea)</generator>

<item>
<title>SimplaCMS: Подсчёт количества введённых символов в поля SEO-параметров</title>
<guid isPermaLink="false">68</guid>
<link>https://blog.chudenkov.ru/all/simplacms-podschyot-kolichestva-vvedyonnyh-simvolov-v-polya-seo/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-podschyot-kolichestva-vvedyonnyh-simvolov-v-polya-seo/</comments>
<description>
&lt;p&gt;Сеошники знают, что есть правила, которые ограничивают нам ввод длинных title или description. Чтобы не кидать каждый раз в Sublime для подсчёта символов, я набросал простенький скрипт, который показывает текущее значение каждого поля SEO-параметров.&lt;/p&gt;
&lt;p&gt;Потестить можно на категориях, для которых в первую очередь и писался сам скрипт. Для этого откроем /simpla/design/html/category.tpl и заменим блок&lt;/p&gt;
&lt;!-- Параметры страницы --&gt;&lt;p&gt;на код ниже:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;block layer&amp;quot;&amp;gt;
&amp;lt;h2&amp;gt;Параметры страницы&amp;lt;/h2&amp;gt;
&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;url_count&amp;quot;class=property&amp;gt;Адрес&amp;lt;/label&amp;gt;&amp;lt;div class=&amp;quot;page_url&amp;quot;&amp;gt;/catalog/&amp;lt;/div&amp;gt;&amp;lt;input name=&amp;quot;url&amp;quot; class=&amp;quot;page_url&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{$category-&amp;gt;url|escape}&amp;quot; id=&amp;quot;url_source&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;title_count&amp;quot; class=property&amp;gt;Заголовок&amp;lt;/label&amp;gt;&amp;lt;input name=&amp;quot;meta_title&amp;quot; class=&amp;quot;simpla_inp&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{$category-&amp;gt;meta_title|escape}&amp;quot; id=&amp;quot;title_source&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;keys_count&amp;quot; class=property&amp;gt;Ключевые слова&amp;lt;/label&amp;gt;&amp;lt;input name=&amp;quot;meta_keywords&amp;quot; class=&amp;quot;simpla_inp&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{$category-&amp;gt;meta_keywords|escape}&amp;quot; id=&amp;quot;keys_source&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;label id=&amp;quot;description_count&amp;quot; class=property&amp;gt;Описание&amp;lt;/label&amp;gt;&amp;lt;textarea name=&amp;quot;meta_description&amp;quot; class=&amp;quot;simpla_inp&amp;quot; id=&amp;quot;description_source&amp;quot; &amp;gt;{$category-&amp;gt;meta_description|escape}&amp;lt;/textarea&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;/ul&amp;gt;
&amp;lt;script&amp;gt;
var urlname = document.getElementById(&amp;quot;url_source&amp;quot;);
var urlcount = document.getElementById(&amp;quot;url_count&amp;quot;);
var titlename = document.getElementById(&amp;quot;title_source&amp;quot;);
var titlecount = document.getElementById(&amp;quot;title_count&amp;quot;);
var keywordname = document.getElementById(&amp;quot;keys_source&amp;quot;);
var keywordscount = document.getElementById(&amp;quot;keys_count&amp;quot;); 
var descriptionname = document.getElementById(&amp;quot;description_source&amp;quot;);
var descriptioncount = document.getElementById(&amp;quot;description_count&amp;quot;);                                   
window.onload = urlCount();
window.onload = titleCount();
window.onload = keywordsCount();
window.onload = descriptionCount();
urlname.oninput = urlCount;
titlename.oninput = titleCount;
keywordname.oninput = keywordsCount;
descriptionname.oninput = descriptionCount;                  
function urlCount() {
var x = urlname.value;
urlcount.innerHTML = &amp;quot;Адрес (&amp;quot; + x.length + &amp;quot;)&amp;quot;;
}             
function titleCount() {
var y = titlename.value;
titlecount.innerHTML = &amp;quot;Заголовок (&amp;quot; + y.length + &amp;quot;)&amp;quot;;
}                  
function keywordsCount() {
var z = keywordname.value;
keywordscount.innerHTML = &amp;quot;Ключевые слова (&amp;quot; + z.length + &amp;quot;)&amp;quot;;
}
function descriptionCount() {
var xx = descriptionname.value;
descriptioncount.textContent = &amp;quot;Описание (&amp;quot; + xx.length + &amp;quot;)&amp;quot;;
}                 
&amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_2.png" width="1185" height="489" alt="" /&gt;
&lt;/div&gt;
</description>
<pubDate>Tue, 14 Jan 2020 13:58:34 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: режим работы</title>
<guid isPermaLink="false">66</guid>
<link>https://blog.chudenkov.ru/all/simplacms-rezhim-raboty/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-rezhim-raboty/</comments>
<description>
&lt;p&gt;У некоторых компаний есть клиенты, которые не могут долистать до страницы контакты и посмотреть режим работы. Специально для таких особей в шапку написал скрипт, который в зависимости от дня показывает определённое время работы компании.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{assign var=workdays value='Работаем: с 10:00 до 20:00'}
{assign var=saturday value='Суббота: с 10:00 до 16:00'}
{assign var=holiday value='Воскресенье: не работаем'}

{if $smarty.now|date_format:'%w' == '1' || $smarty.now|date_format:'%w' == '2' || $smarty.now|date_format:'%w' == '3' || $smarty.now|date_format:'%w' == '4' || $smarty.now|date_format:'%w' == '5'}{$workdays}{elseif $smarty.now|date_format:'%w' == '6'}{$saturday}{else}{$holiday}{/if}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;С понедельника по пятницу будет отображаться режим работы с 10 до 20 часов.&lt;br /&gt;
В субботу — с 10 до 16 часов.&lt;br /&gt;
В воскресенье — не работаем.&lt;/p&gt;
</description>
<pubDate>Sat, 09 Nov 2019 12:06:32 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: вывод закупочной цены</title>
<guid isPermaLink="false">61</guid>
<link>https://blog.chudenkov.ru/all/simplacms-vyvod-zakupochnoy-ceny/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-vyvod-zakupochnoy-ceny/</comments>
<description>
&lt;p&gt;Потребовалось сделать вывод закупочной цены в админке. Итак, сначала добавим поля в шаблон в админке.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Откроем /simpla/design/html/product.tpl и добавим колонки Закупка и Прибыль для вариантов товаров:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;li class=&amp;quot;variant_move&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_name&amp;quot;&amp;gt;Название варианта&amp;lt;/li&amp;gt;	
&amp;lt;li class=&amp;quot;variant_sku&amp;quot;&amp;gt;Артикул&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_fprice&amp;quot;&amp;gt;Закупка, {$currency-&amp;gt;sign}&amp;lt;/li&amp;gt;	
&amp;lt;li class=&amp;quot;variant_price&amp;quot;&amp;gt;Цена, {$currency-&amp;gt;sign}&amp;lt;/li&amp;gt;	
&amp;lt;li class=&amp;quot;variant_discount&amp;quot;&amp;gt;Старая, {$currency-&amp;gt;sign}&amp;lt;/li&amp;gt;	
&amp;lt;li class=&amp;quot;variant_amount&amp;quot;&amp;gt;Кол-во&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Прибыль&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;Далее добавим поля для указания данных в цикл $product_variants:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;li class=&amp;quot;variant_move&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;move_zone&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_name&amp;quot;&amp;gt;      &amp;lt;input name=&amp;quot;variants[id][]&amp;quot;            type=&amp;quot;hidden&amp;quot; value=&amp;quot;{$variant-&amp;gt;id|escape}&amp;quot; /&amp;gt;&amp;lt;input name=&amp;quot;variants[name][]&amp;quot; type=&amp;quot;&amp;quot; value=&amp;quot;{$variant-&amp;gt;name|escape}&amp;quot; /&amp;gt; &amp;lt;a class=&amp;quot;del_variant&amp;quot; href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;design/images/cross-circle-frame.png&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_sku&amp;quot;&amp;gt;       &amp;lt;input name=&amp;quot;variants[sku][]&amp;quot;           type=&amp;quot;text&amp;quot;   value=&amp;quot;{$variant-&amp;gt;sku|escape}&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_fprice&amp;quot;&amp;gt;     &amp;lt;input name=&amp;quot;variants[fprice][]&amp;quot;         type=&amp;quot;text&amp;quot;   value=&amp;quot;{$variant-&amp;gt;fprice|escape}&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_price&amp;quot;&amp;gt;     &amp;lt;input name=&amp;quot;variants[price][]&amp;quot;         type=&amp;quot;text&amp;quot;   value=&amp;quot;{$variant-&amp;gt;price|escape}&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_discount&amp;quot;&amp;gt;  &amp;lt;input name=&amp;quot;variants[compare_price][]&amp;quot; type=&amp;quot;text&amp;quot;   value=&amp;quot;{$variant-&amp;gt;compare_price|escape}&amp;quot; /&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&amp;quot;variant_amount&amp;quot;&amp;gt;    &amp;lt;input name=&amp;quot;variants[stock][]&amp;quot;         type=&amp;quot;text&amp;quot;   value=&amp;quot;{if $variant-&amp;gt;infinity || $variant-&amp;gt;stock == ''}∞{else}{$variant-&amp;gt;stock|escape}{/if}&amp;quot; /&amp;gt;{$settings-&amp;gt;units}&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;{if $variant-&amp;gt;fprice} +{math equation = $variant-&amp;gt;price - $variant-&amp;gt;fprice} {$currency-&amp;gt;sign}{/if}&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_4-1.jpg" width="934" height="338" alt="" /&gt;
&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Теперь добавим отображение закупки в список товаров, для этого откроем файл /simpla/design/html/products.tpl и добавим в цикл $product_variants:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;li {if !$variant@first}class=&amp;quot;variant&amp;quot; style=&amp;quot;display:none;&amp;quot;{/if}&amp;gt;
	&amp;lt;i title=&amp;quot;{$variant-&amp;gt;name|escape}&amp;quot;&amp;gt;{$variant-&amp;gt;name|escape|truncate:30:'…':true:true}&amp;lt;/i&amp;gt;
	&amp;lt;input class=&amp;quot;fprice&amp;quot; type=&amp;quot;text&amp;quot; name=&amp;quot;fprice[{$variant-&amp;gt;id}]&amp;quot; value=&amp;quot;{$variant-&amp;gt;fprice}&amp;quot; /&amp;gt;
	&amp;lt;input class=&amp;quot;price {if $variant-&amp;gt;compare_price&amp;gt;0}compare_price{/if}&amp;quot; type=&amp;quot;text&amp;quot; name=&amp;quot;price[{$variant-&amp;gt;id}]&amp;quot; value=&amp;quot;{$variant-&amp;gt;price}&amp;quot; {if $variant-&amp;gt;compare_price&amp;gt;0}title=&amp;quot;Старая цена &amp;amp;mdash; {$variant-&amp;gt;compare_price} {$currency-&amp;gt;sign}&amp;quot;{/if} /&amp;gt;{$currency-&amp;gt;sign}  
	&amp;lt;input class=&amp;quot;stock&amp;quot; type=&amp;quot;text&amp;quot; name=&amp;quot;stock[{$variant-&amp;gt;id}]&amp;quot; value=&amp;quot;{if $variant-&amp;gt;infinity}∞{else}{$variant-&amp;gt;stock}{/if}&amp;quot; /&amp;gt;{$settings-&amp;gt;units}
&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_5-1.jpg" width="1275" height="475" alt="" /&gt;
&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Отображение сделали, теперь нужно поработать над функционалом. Откроем файл /api/Variants.php и обновим в двух местах SQL-запрос для функции get_variants:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$query = $this-&amp;gt;db-&amp;gt;placehold(&amp;quot;SELECT v.id, v.product_id , v.price, v.fprice, NULLIF(v.compare_price, 0) as compare_price, v.sku, IFNULL(v.stock, ?) as stock, (v.stock IS NULL) as infinity, v.name, v.attachment, v.position&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;Теперь откроем файл /simpla/ProductsAdmin.php и добавим возможность управления закупочной ценой на списке товаров:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;// Обработка действий 	
if($this-&amp;gt;request-&amp;gt;method('post'))
{
// Сохранение цен и наличия
$prices = $this-&amp;gt;request-&amp;gt;post('price');
$fprices = $this-&amp;gt;request-&amp;gt;post('fprice');
$stocks = $this-&amp;gt;request-&amp;gt;post('stock'); 
		    foreach($fprices as $id=&amp;gt;$fprice)
{
	$this-&amp;gt;variants-&amp;gt;update_variant($id, array('fprice'=&amp;gt;$fprice));
}
foreach($prices as $id=&amp;gt;$price)
{
	$stock = $stocks[$id];
	if($stock == '∞' || $stock == '')
	$stock = null;
	$this-&amp;gt;variants-&amp;gt;update_variant($id, array('price'=&amp;gt;$price, 'stock'=&amp;gt;$stock));
}&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Fri, 31 May 2019 22:04:57 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: подключаем dadata для клёвых подсказок</title>
<guid isPermaLink="false">59</guid>
<link>https://blog.chudenkov.ru/all/simplacms-podklyuchaem-dadata-dlya-klyovyh-podskazok/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-podklyuchaem-dadata-dlya-klyovyh-podskazok/</comments>
<description>
&lt;p&gt;Есть клёвый сервис, который позволяет в вашей корзине вызывать подсказки.&lt;br /&gt;
Подсказки могут быть разными — фамилии, имена, отчества, адреса, почты, огрн, инн и ещё большая куча других подсказок. Для простых интернет-магазинов очень нужны ФИО, электропочты и адреса. Это реально упрощает процесс оформления заказа и в какой-то степени увеличивает конверсию.&lt;/p&gt;
&lt;h2&gt;Как подключить&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Регистрируемся на сайте dadata.ru, получаем API ключик.&lt;/li&gt;
&lt;li&gt;Открываем файл /design/ваша_тема/html/cart.tpl и добавляем в него:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{literal}
&amp;lt;link href=&amp;quot;https://cdn.jsdelivr.net/npm/suggestions-jquery@19.4.2/dist/css/suggestions.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/suggestions-jquery@19.4.2/dist/js/jquery.suggestions.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
     $(&amp;quot;.cart input[name='name']&amp;quot;).suggestions({
         serviceUrl: &amp;quot;https://dadata.ru/api/v2&amp;quot;,
         token: &amp;quot;a8fe6329cfa81666be66deb370d2c364ccfddeaa&amp;quot;,
         type: &amp;quot;NAME&amp;quot;,
         params: {
             parts: [&amp;quot;SURNAME&amp;quot;, &amp;quot;NAME&amp;quot;, &amp;quot;PATRONYMIC&amp;quot;]
         }
     });
     $(&amp;quot;.cart input[name='address']&amp;quot;).suggestions({
         serviceUrl: &amp;quot;https://dadata.ru/api/v2&amp;quot;,
         token: &amp;quot;a8fe6329cfa81666be66deb370d2c364ccfddeaa&amp;quot;,
         type: &amp;quot;ADDRESS&amp;quot;
     });
     $(&amp;quot;.cart input[name='email']&amp;quot;).suggestions({
        serviceUrl: &amp;quot;https://dadata.ru/api/v2&amp;quot;,
        token: &amp;quot;a8fe6329cfa81666be66deb370d2c364ccfddeaa&amp;quot;,
        type: &amp;quot;EMAIL&amp;quot;,
        /* Вызывается, когда пользователь выбирает одну из подсказок */
        onSelect: function(suggestion) {
            console.log(suggestion);
        }
    });
 &amp;lt;/script&amp;gt;
 {/literal}&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Чтобы скрипт заработал, нужно указать свой API-ключик во всех token-параметрах.&lt;/li&gt;
&lt;li&gt;Обратите внимание, что у меня используется нестандартный класс для формы корзины. Чтобы узнать какой класс формы корзины используется у вас, найдите в cart.tpl html-тег &lt;form&gt; и посмотрите какой класс ему принадлежит. Далее просто замените &lt;b&gt;cart&lt;/b&gt; на свой класс в этих полях:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(&amp;quot;.cart input[name='name']&amp;quot;).suggestions({
...
$(&amp;quot;.cart input[name='address']&amp;quot;).suggestions({
...
$(&amp;quot;.cart input[name='email']&amp;quot;).suggestions({
...
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Результат работы&lt;/h2&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_1_3.jpg" width="937" height="673" alt="" /&gt;
&lt;/div&gt;
</description>
<pubDate>Wed, 15 May 2019 14:10:56 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: обновляем TinyMCE до 4 версии</title>
<guid isPermaLink="false">57</guid>
<link>https://blog.chudenkov.ru/all/simplacms-obnovlyaem-tinymce-do-4-versii/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-obnovlyaem-tinymce-do-4-versii/</comments>
<description>
&lt;p&gt;Кривой TinyMCE 3 версии в 2019 году уже невозможно использовать. Он регулярно вставляет всякие спаны и непечатаемые пробелы, поэтому нужно было обновить его версию. &lt;br /&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Открываем /simpla/design/js/ и создаём папку tinymce&lt;/li&gt;
&lt;li&gt;&lt;a href="http://download.moxiecode.com/tinymce/tinymce_4.1.7_jquery.zip"&gt;Скачаем&lt;/a&gt; сам TinyMCE и положим содержимое папки js в папку tinymce. Краткая структура файлов и папок в папке tinymce должна быть такой:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;-langs
-plugins
-skins
-themes
--jquery.tinymce.min.js
--tinymce.min.js&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Открываем файл  /simpla/design/html/tinymce_init.tpl и меняем полностью его содержимое на:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;design/js/tinymce/tinymce.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt;
tinymce.init({
    selector: &amp;quot;textarea.editor_large,textarea.editor_small&amp;quot;,
    language : &amp;quot;ru&amp;quot;,
    plugins: [
        &amp;quot;advlist autosave autolink lists link image charmap print preview hr anchor pagebreak&amp;quot;,
        &amp;quot;searchreplace wordcount charactercount charmap visualblocks visualchars code fullscreen&amp;quot;,
        &amp;quot;insertdatetime media nonbreaking save table contextmenu directionality&amp;quot;,
        &amp;quot;emoticons template paste textcolor colorpicker textpattern  &amp;quot;
   ],
   toolbar1: &amp;quot;undo redo | bold italic underline | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link unlink anchor | image media charmap blockquote | forecolor backcolor | removeformat print preview code emoticons &amp;quot;,
menubar: '',
   verify_html: false, 
   image_advtab: true,
        setup : function(ed) {
        if(typeof set_meta == 'function')
        {
            ed.on('keyUp', function() {
                set_meta();
            });
            ed.on('change', function() {
                set_meta();
            });
        }
    }
    {literal}}{/literal});
    function myCustomGetContent( id ) {
        if( typeof tinymce != &amp;quot;undefined&amp;quot; ) {
            var editor = tinymce.get( id );
            if( editor &amp;amp;&amp;amp; editor instanceof tinymce.Editor ) {
                return editor.getContent{literal}({format : 'text'}{/literal}).substr(0, 512);
            } else {
                return  jQuery('textarea[name='+id+']').val().replace(/(&amp;lt;([^&amp;gt;]+)&amp;gt;)/ig,&amp;quot; &amp;quot;).replace(/(\&amp;amp;nbsp;)/ig,&amp;quot; &amp;quot;).replace(/^\s+|\s+$/g, '').substr(0, 255);
            }
        }
        return '';
    }
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="4"&gt;
&lt;li&gt;Далее необходимо поправить автогенерацию meta description в админке. Для этого нужно полностью заменить функцию generate_meta_description() в файлах:
&lt;ul&gt;
  &lt;li&gt;/simpla/design/html/product.tpl&lt;/li&gt;
  &lt;li&gt;/simpla/design/html/post.tpl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;// Обновлённая функция, которую нужно вставить в файлы
function generate_meta_description()
{
	if( typeof tinymce != &amp;quot;undefined&amp;quot; )
	{
		return myCustomGetContent( &amp;quot;annotation&amp;quot; );
	}
	else
		return $('textarea[name=annotation]').val().replace(/(&amp;lt;([^&amp;gt;]+)&amp;gt;)/ig,&amp;quot; &amp;quot;).replace(/(\&amp;amp;nbsp;)/ig,&amp;quot; &amp;quot;).replace(/^\s+|\s+$/g, '').substr(0, 255);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В файле /simpla/design/html/category.tpl полностью обновляем функцию:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;function generate_meta_description()
{
	if( typeof tinymce != &amp;quot;undefined&amp;quot; )
	{
		return myCustomGetContent( &amp;quot;description&amp;quot; );
	}
	else
		return $('textarea[name=description]').val().replace(/(&amp;lt;([^&amp;gt;]+)&amp;gt;)/ig,&amp;quot; &amp;quot;).replace(/(\&amp;amp;nbsp;)/ig,&amp;quot; &amp;quot;).replace(/^\s+|\s+$/g, '').substr(0, 255);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В файле /simpla/design/html/page.tpl полностью обновляем функцию:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;function generate_meta_description()
{
	if( typeof tinymce != &amp;quot;undefined&amp;quot; )
	{
		return myCustomGetContent( &amp;quot;body&amp;quot; );
	}
	else
		return $('textarea[name=body]').val().replace(/(&amp;lt;([^&amp;gt;]+)&amp;gt;)/ig,&amp;quot; &amp;quot;).replace(/(\&amp;amp;nbsp;)/ig,&amp;quot; &amp;quot;).replace(/^\s+|\s+$/g, '').substr(0, 255);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Результат работы&lt;/b&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/tinymcesimplacms.jpg" width="1477" height="795" alt="" /&gt;
&lt;/div&gt;
</description>
<pubDate>Tue, 14 May 2019 19:37:36 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: соседние товары, вывод бренда</title>
<guid isPermaLink="false">56</guid>
<link>https://blog.chudenkov.ru/all/simplacms-sosednie-tovary-vyvod-brenda/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-sosednie-tovary-vyvod-brenda/</comments>
<description>
&lt;p&gt;Откроем файл /view/ProductView.php, отыщем строчку&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;//Соседние товары&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И заменим содержимое блока на:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$next = $this-&amp;gt;products-&amp;gt;get_next_product($product-&amp;gt;id);
		$next_brand = $this-&amp;gt;brands-&amp;gt;get_brand(intval($next-&amp;gt;brand_id));
		$i = $this-&amp;gt;products-&amp;gt;get_images(array('product_id'=&amp;gt;$next-&amp;gt;id));
		$next-&amp;gt;image = reset($i);
		$next-&amp;gt;brand = $next_brand;

		$prev = $this-&amp;gt;products-&amp;gt;get_prev_product($product-&amp;gt;id);
		$prev_brand = $this-&amp;gt;brands-&amp;gt;get_brand(intval($prev-&amp;gt;brand_id));
		$i = $this-&amp;gt;products-&amp;gt;get_images(array('product_id'=&amp;gt;$prev-&amp;gt;id));
		$prev-&amp;gt;image = reset($i);
		$prev-&amp;gt;brand = $prev_brand;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь, чтобы вывести бренд соседнего товара:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{$prev_product-&amp;gt;brand-&amp;gt;name} или {$next_product-&amp;gt;brand-&amp;gt;name}&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Sun, 05 May 2019 16:40:14 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: подключаем Яндекс Турбо для новостей</title>
<guid isPermaLink="false">54</guid>
<link>https://blog.chudenkov.ru/all/simplacms-podklyuchaem-yandeks-turbo-dlya-novostey/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-podklyuchaem-yandeks-turbo-dlya-novostey/</comments>
<description>
&lt;p&gt;Создадим новый файл RssView.php в папке /view/ со следующим содержимым:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;?PHP
require_once('View.php');
class RssView extends View
{
  public function fetch()
  {
    $items_per_page = 20;
    $params = array();
    $params['visible'] = 1;
    $params['limit'] = $items_per_page;
     
    switch($this-&amp;gt;request-&amp;gt;get('type', 'string')) {
        default:
            $items = $this-&amp;gt;blog-&amp;gt;get_posts($params);  
            $category = 'Статьи компании';  
            $cat_url = $this-&amp;gt;config-&amp;gt;root_url.'/blog';
            $base_url = $this-&amp;gt;config-&amp;gt;root_url.'/blog/';
    }
    header(&amp;quot;Content-Type: application/rss+xml; charset=UTF-8&amp;quot;); 
    $p = $items[0];
    $rssfeed = '&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;';
    $rssfeed .= '&amp;lt;rss xmlns:yandex=&amp;quot;http://news.yandex.ru&amp;quot; xmlns:media=&amp;quot;http://search.yahoo.com/mrss/&amp;quot; xmlns:turbo=&amp;quot;http://turbo.yandex.ru&amp;quot; version=&amp;quot;2.0&amp;quot;&amp;gt;';
    $rssfeed .= '&amp;lt;channel&amp;gt;';
    $rssfeed .= '&amp;lt;title&amp;gt;'.$this-&amp;gt;settings-&amp;gt;site_name.'&amp;lt;/title&amp;gt;';
    $rssfeed .= '&amp;lt;link&amp;gt;'.$cat_url.'&amp;lt;/link&amp;gt;';
    $rssfeed .= '&amp;lt;description&amp;gt;'.$this-&amp;gt;settings-&amp;gt;company_name.'&amp;lt;/description&amp;gt;';
    $rssfeed .= '&amp;lt;language&amp;gt;ru-ru&amp;lt;/language&amp;gt;';
    $rssfeed .= '&amp;lt;category&amp;gt;' . $category . '&amp;lt;/category&amp;gt;';
    $rssfeed .= '&amp;lt;copyright&amp;gt;Copyright '.date('Y').' '.$this-&amp;gt;settings-&amp;gt;company_name.'&amp;lt;/copyright&amp;gt;';
    $rssfeed .= '&amp;lt;pubDate&amp;gt;' . date(&amp;quot;D, d M Y H:i:s O&amp;quot;, strtotime($p-&amp;gt;date)) . '&amp;lt;/pubDate&amp;gt;';
    $rssfeed .= '&amp;lt;lastBuildDate&amp;gt;' . date(&amp;quot;D, d M Y H:i:s O&amp;quot;, strtotime($p-&amp;gt;date)) . '&amp;lt;/lastBuildDate&amp;gt;';
    foreach($items as $p) {
        $rssfeed .= '&amp;lt;item turbo=&amp;quot;true&amp;quot;&amp;gt;';
        $rssfeed .= '&amp;lt;guid isPermaLink=&amp;quot;true&amp;quot;&amp;gt;'. $base_url . $p-&amp;gt;url . '&amp;lt;/guid&amp;gt;';
        $rssfeed .= '&amp;lt;link&amp;gt;'. $base_url . $p-&amp;gt;url . '&amp;lt;/link&amp;gt;';
        $rssfeed .= '&amp;lt;turbo:content&amp;gt;';
        $rssfeed .= '&amp;lt;![CDATA[';
        $rssfeed .= '&amp;lt;header&amp;gt;';
        $rssfeed .= '&amp;lt;h1&amp;gt;' . $p-&amp;gt;name . '&amp;lt;/h1&amp;gt;';
        $rssfeed .= '&amp;lt;/header&amp;gt;';
        $rssfeed .= '&amp;lt;p&amp;gt;'. ($p-&amp;gt;text) . '&amp;lt;/p&amp;gt;';
        $rssfeed .= '&amp;lt;div data-block=&amp;quot;share&amp;quot; data-network=&amp;quot;twitter, facebook&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;';
        $rssfeed .= ']]&amp;gt;';
        $rssfeed .= '&amp;lt;/turbo:content&amp;gt;';
        $rssfeed .= '&amp;lt;title&amp;gt;' . $p-&amp;gt;name . '&amp;lt;/title&amp;gt;';
        $rssfeed .= '&amp;lt;description&amp;gt;&amp;lt;![CDATA[' . ($p-&amp;gt;annotation) . ']]&amp;gt;&amp;lt;/description&amp;gt;';
        $rssfeed .= '&amp;lt;comments&amp;gt;'. $base_url . $p-&amp;gt;url . '#comments&amp;lt;/comments&amp;gt;';
        $rssfeed .= '&amp;lt;pubDate&amp;gt;' . date(&amp;quot;D, d M Y H:i:s O&amp;quot;, strtotime($p-&amp;gt;date)) . '&amp;lt;/pubDate&amp;gt;';
        $rssfeed .= '&amp;lt;/item&amp;gt;';
    }
    $rssfeed .= '&amp;lt;/channel&amp;gt;';
    $rssfeed .= '&amp;lt;/rss&amp;gt;';    
    print($rssfeed);
    exit();
  }  
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее откроем в корне сайта .htaccess и после строчки&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;RewriteRule ^blog(.*)$ /news$1 [L,R=301]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Добавим в него новое правило:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;RewriteRule ^rss?$  index.php?module=RssView  [L,QSA]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь у вас есть RSS лента, оптимизированная под Яндекс.Турбо по адресу ваш_сайт.ру/rss&lt;br /&gt;
Далее откроем Вебмастер Яндекса, откроем раздел Турбо Страницы -&gt; Источники и добавим ссылку на ваш RSS-канал:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_1_1.jpg" width="1087" height="474" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Нажимаем кнопку добавить и ждём когда канал загрузится в систему. После этого проверяем, чтобы всё работало без ошибок и нажимаем кнопку Вкл:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_2_2.jpg" width="788" height="623" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Теперь нужно несколько часов на модерацию вашего источника, а после завершения ваши новости будут в формате Яндекс Турбо ;-)&lt;/p&gt;
</description>
<pubDate>Thu, 18 Apr 2019 04:10:47 +0300</pubDate>
</item>

<item>
<title>Simpla CMS: названия изображений без хеша</title>
<guid isPermaLink="false">53</guid>
<link>https://blog.chudenkov.ru/all/simpla-cms-nazvaniya-izobrazheniy-bez-hesha/</link>
<comments>https://blog.chudenkov.ru/all/simpla-cms-nazvaniya-izobrazheniy-bez-hesha/</comments>
<description>
&lt;p&gt;Решение принадлежит DaVinci и большая ему благодарность за это.&lt;br /&gt;
Решение позволяет избавиться от хеша в названии изображения, что позволит изображениям залетать в индекс поисковых систем.  Базовое имя у изображений весьма кривое:&lt;/p&gt;
&lt;p&gt;В стандарной симпле адрес изображения имеет абракадабру на конце:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;8b8a7e13a7e2e5a7ee9f&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Чтобы от него изобавиться нужно открыть /resize/resize.php и закомментировать:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;/*
if(!$simpla-&amp;gt;config-&amp;gt;check_token($filename, $token))
	exit('bad token');
*/&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее открываем Design.php и добавим в функцию public function resize_modifier после переменных $resized_filename и $resized_filename_encode:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$size = ($width?$width:0).'x'.($height?$height:0).($set_watermark?&amp;quot;w&amp;quot;:'');
        $image_sizes = array();
        if($this-&amp;gt;settings-&amp;gt;image_sizes)
            $image_sizes = explode('|',$this-&amp;gt;settings-&amp;gt;image_sizes);
        if(!in_array($size, $image_sizes)){
            $image_sizes[] = $size;
            $this-&amp;gt;settings-&amp;gt;image_sizes = implode('|',$image_sizes);
        }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В этой же функции ниже нужно закомментировать хвост у строчки:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;return $this-&amp;gt;config-&amp;gt;root_url.'/'.$this-&amp;gt;config-&amp;gt;resized_images_dir.$resized_filename_encoded/*.'?'.$this-&amp;gt;config-&amp;gt;token($resized_filename)*/;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее открываем файл Image.php и в функцию function resize добавить после конструкции list:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$size = ($width?$width:0).'x'.($height?$height:0).($set_watermark?&amp;quot;w&amp;quot;:'');
        $image_sizes = array();
        if($this-&amp;gt;settings-&amp;gt;image_sizes)
            $image_sizes = explode('|',$this-&amp;gt;settings-&amp;gt;image_sizes);
        if(!in_array($size, $image_sizes)){
            header(&amp;quot;http/1.0 404 not found&amp;quot;);
            exit();
        }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Всё. Теперь все изображения без абракадабры на конце.&lt;/p&gt;
</description>
<pubDate>Wed, 10 Apr 2019 22:02:09 +0300</pubDate>
</item>

<item>
<title>SimplaCMS: Итоговая стоимость на ThankYou Page</title>
<guid isPermaLink="false">39</guid>
<link>https://blog.chudenkov.ru/all/simplacms-itogovaya-stoimost-na-thankyou-page/</link>
<comments>https://blog.chudenkov.ru/all/simplacms-itogovaya-stoimost-na-thankyou-page/</comments>
<description>
&lt;p&gt;Не нашёл переменной, которая выводит стоимость заказа с учётом доставки, пришлось написать костылёк прям в шаблоне. Работает просто — забираем данные из переменных (total_price и delivery_price), складываем (math equation), преобразовываем в переменную (assign) и выводим значение в отформатированном виде (total|convert).&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{math equation = $order-&amp;gt;total_price + $order-&amp;gt;delivery_price assign = 'total'}
{$total|convert} {$currency-&amp;gt;sign}&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Sun, 13 May 2018 11:46:56 +0300</pubDate>
</item>

<item>
<title>Simpla: Показываем JivoSite в определённое время</title>
<guid isPermaLink="false">27</guid>
<link>https://blog.chudenkov.ru/all/simpla-pokazyvaem-blok-v-opredelyonnoe-vremya/</link>
<comments>https://blog.chudenkov.ru/all/simpla-pokazyvaem-blok-v-opredelyonnoe-vremya/</comments>
<description>
&lt;p&gt;Сделал на одном сайте привязку кнопок «Обратный звонок» и «Отправить заявку» к &lt;a href="https://www.jivosite.ru/?partner_id=16528&amp;lang=ru&amp;pricelist_id=105"&gt;JivoSite&lt;/a&gt;.&lt;br /&gt;
Возможно для кого-то это покажется дикостью, но это на самом деле удобно — обратный звонок должен происходить моментально, а не через три часа, когда менеджер по продажам, который отсиживает жопу на зарплате, накурится сигарет и напьется кофе. И JivoSite в этом плане оказался очень удобен.&lt;/p&gt;
&lt;p&gt;Но столкнулся с интересной проблемой. В JivoSite есть настройки времени, когда можно совершать звонок с сайта. Чтобы появилась форма обратного звонка нужно нажать на соответствующую кнопку/ссылку. Конкретный пример:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_2_1.jpg" width="648" height="153" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Предположим мы поставим в настройках JivoSite часы работы с 9 до 18 часов. Как вы думаете, что произойдет, если мы нажмём на ссылку «Обратный звонок» в 18:02? Правильно. Ничего. Она не сработает, а это проёбаный лид. Техподдержке передал, но нужно сохранить лид уже сегодня и своими силами.&lt;/p&gt;
&lt;p&gt;Чтобы лид остался с нами, нужно проверить сколько сейчас на часах и предложить альтернативу, например, оффлайн форму того же JivoSite. И в SimplaCMS это решалось так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;a href=&amp;quot;tel:{$settings-&amp;gt;company_phone|escape}&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;{$settings-&amp;gt;company_phone|escape}&amp;lt;/h3&amp;gt;&amp;lt;/a&amp;gt;
{if $smarty.now|date_format:'%H.%M' &amp;gt; '09.00' &amp;amp;&amp;amp; $smarty.now|date_format:'%H.%M' &amp;lt; '18.00' }
{literal}&amp;lt;a href=&amp;quot;#&amp;quot; onclick=&amp;quot;jivo_api.open({start : 'call'});&amp;quot;&amp;gt;Обратный звонок&amp;lt;/a&amp;gt;{/literal}
{else}
&amp;lt;a href=&amp;quot;#&amp;quot; onclick=&amp;quot;jivo_api.open();&amp;quot;&amp;gt;Обратный звонок&amp;lt;/a&amp;gt;
{/if}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если время сервера попадает в заданный интервал, показать ссылку №1. В противном случае №2.&lt;/p&gt;
</description>
<pubDate>Tue, 10 Apr 2018 01:55:17 +0300</pubDate>
</item>


</channel>
</rss>