Исправление ошибки кодировки таблиц

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

Нажимая на знак вопроса мы видим подсказку от Битрикса где сообщает, что кодировка текущих наших таблиц, должна совпадать с кодировкой базы данных.

Подробное описание ошибки

Если перейдем по ссылке на "журнал проверки системы", то увидим список тех таблиц, где не совпали кодировки, вот нам они и нужны, на скриншоте пометил стрелочками.

Подробное описание ошибки

SQL запрос: 

ALTER TABLE b_iblock_property_feature CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Где b_iblock_property_feature - это название таблицы, у Вас могут быть другие.

Таким образом я выписал и составил список sql запросов для всех своих таблиц из журнала.

ALTER TABLE b_iblock_property_feature CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_block CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_demo CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_domain CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_file CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_hook_data CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_manifest CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_placement CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_repo CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_site CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_syspage CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_template CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_landing_template_ref CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_main_mail_blacklist CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_main_mail_sender CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_messageservice_message CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_messageservice_rest_app CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_messageservice_rest_app_lang CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_mobileapp_app CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_mobileapp_config CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_numerator CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_numerator_sequence CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rating_voting_reaction CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_ap CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_ap_permission CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_app CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_app_lang CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_app_log CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_event CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_event_offline CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_log CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_placement CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_stat CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_rest_stat_method CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_seo_service_subscription CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_user_profile_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_user_profile_record CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_utm_iblock_6_section CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_utm_iblock_8_section CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_uts_iblock_6_section CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE b_uts_iblock_8_section CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

После того как Вы собрали список SQL запросов, заходим в админку сайта битрикс (Настройки - Инструменты - SQL-запрос) или по пути, вставляете после адреса сайта /bitrix/admin/sql.php

Подробное описание ошибки

КОМПЛЕКТЫ ТОВАРОВ

В настройки ТДС Корзины добавляем код после блока 
-- // Добавление товара в корзину

/**
* Комплекты
* Начало >>
*/


$aAssoc = Core_Array::getRequest('addassoc');
    if (count($aAssoc))
    {
        foreach($aAssoc as $assoc)
        {
            $oShop_Cart_Controller = Shop_Cart_Controller::instance();
            $oShop_Cart_Controller
                ->shop_item_id($assoc)
                ->quantity(1)
                ->add();
        }
    }


/**
* << Конец
*/
Добавляем в макет Каталога скрипт:
/**
* Обработчик решения set-of-goods
*/
var lastCheck="";$(document).ready(function(){function t(){total=parseInt($("#mainprice").data("price")),$("select.associated option").each(function(){$(this).prop("selected")&&$(this).data("price")&&(total+=parseInt($(this).data("price")))}),$("input.associated").each(function(){$(this).prop("checked")&&(total+=parseInt($(this).data("price")))}),totalStr="",totalStr+=total,total=totalStr.replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1 "),$("#bz_price").val(total),$("#mainprice").html(total)}$("input[type='radio'].associated").click(function(){lastCheck=lastCheck==this?($(this).prop("checked",!$(this).prop("checked")),""):this}),$("input.associated").click(function(){t()}),$("select.associated").change(function(){t()}),$("input[type=radio].associated:checked").click(),t(),$("select.associated option:selected").click(),t(),jQuery.extend({kaddIntoCart:function(t,a,e,c){c=c||0;var i="";return $(".associated"+a).each(function(){$(this).prop("checked")&&$.clientRequest({path:t,data:{add:$(this).data("item"),count:1},callBack:function(){},context:$("#little_cart")})}),$("select.associated option").each(function(){$(this).prop("selected")&&(i+="&addassoc[]="+$(this).data("item"))}),c?$.bootstrapAddIntoCart(t,a+i,e):$.addIntoCart(t,a+i,e),!1}})});


var lastCheck = ""; 
$(document).ready(function() { 
    function t() { 
        total = parseInt($("#mainprice").data("price")), $("select.associated option").each(function() { 
            $(this).prop("selected") && $(this).data("price") && (total += parseInt($(this).data("price"))) 
        }), $("input.associated").each(function() { 
            $(this).prop("checked") && (total += parseInt($(this).data("price"))) 
        }), totalStr = "", totalStr += total, total = totalStr.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1 "), $("#bz_price").val(total), $("#mainprice").html(total) 
    } 
    $("input[type='radio'].associated").click(function() { 
        lastCheck = lastCheck == this ? ($(this).prop("checked", !$(this).prop("checked")), "") : this 
    }), $("input.associated").click(function() { 
        t() 
    }), $("select.associated").change(function() { 
        t() 
    }), $("input[type=radio].associated:checked").click(), t(), $("select.associated option:selected").click(), t(), jQuery.extend({ 
        kaddIntoCart: function(t, a, e, c) { 
            c = c || 0; 
            var i = ""; 
            return $(".associated" + a).each(function() { 
                $(this).prop("checked") && $.clientRequest({ 
                    path: t, 
                    data: { 
                        add: $(this).data("item"), 
                        count: 1 
                    }, 
                    callBack: function() {}, 
                    context: $("#little_cart") 
                }) 
            }), $("select.associated option").each(function() { 
                $(this).prop("selected") && (i += "&addassoc[]=" + $(this).data("item")) 
            }), c ? $.bootstrapAddIntoCart(t, a + i, e) : $.addIntoCart(t, a + i, e), !1 
        } 
    }) 
});

В XSL шаблон "КарточкаТовара" добавляем блок вывода комплектов
<!--
                    *
                    * Комплекты
                    * Начало >>
                    -->
                    <xsl:if test="count(associated/shop_item) &gt; 0">
                        <div class="associated-block gifts-list clearfix">
                        <p class="h5 text-center red bold"><i class="fa fa-gift"></i>  Выберите подарок: </p>
                            
                            <div class="slider-similar-wrapper">
                                <div id="gifts" class="slick-slider">
                                    <xsl:apply-templates select="associated/shop_item" mode="assoc"><xsl:sort select="sorting"  data-type="number"/></xsl:apply-templates>
                                </div>
                            </div>
                            <span class="hr"></span>
                            
                        </div>
                    </xsl:if>
                    
                    <!--
                    * << Конец
                            -->

Настройка memcahe

в секции memcahe указываются данные доступа к серверу:
modules/core/config/cache.php
PHP
'memcache' => array(
'name' => 'Memcache',
'driver' => 'Cache_Memcache',
'server' => '127.0.0.1',
'port' => 11211,
'checksum' => FALSE,
'caches' => $aTypicalCaches,
),
а в 'defaultCache' указываете 'memcache'
PHP
<?php
return array (
'skin' => 'bootstrap',
'dateFormat' => 'd.m.Y',
'dateTimeFormat' => 'd.m.Y H:i:s',
//'reverseDateTimeFormat' => '',
'datePickerFormat' => 'DD.MM.YYYY',
'dateTimePickerFormat' => 'DD.MM.YYYY HH:mm:ss',
'timezone' => 'Europe/Moscow',
'translate' => TRUE,
'chat' => FALSE,
'switchSelectToAutocomplete' => 100,
'autocompleteItems' => 10,
'backendSessionLifetime' => 14400,
'availableExtension' => array ('JPG', 'JPEG', 'GIF', 'PNG', 'WEBP', 'PDF', 'ZIP', 'DOC', 'DOCX', 'XLS', 'XLSX'),
'defaultCache' => 'file',
'session' => array(
'driver' => 'database',
'class' => 'Core_Session_Database'
),...

Конфигурационный файл

Конфигурационный файл размещается в modules/core/config/cache.php и содержит переменную $aTypicalCaches с массивом имен кэшей и их конфигурациями, например:

PHP

$aTypicalCaches = array(
'default' => array('expire' => 3600, 'size' => 262144, 'tags' => FALSE),
'Core_ORM' => array('expire' => 3600, 'size' => 262144, 'tags' => FALSE),
'Core_ORM_ColumnCache' => array('expire' => 3600, 'size' => 262144, 'tags' => FALSE),
'Core_ORM_RelationCache' => array('expire' => 3600, 'size' => 262144, 'tags' => FALSE),
'informationsystem_rss' => array('expire' => 14400, 'size' => 262144),
'informationsystem_show' => array('expire' => 14400, 'size' => 262144, 'compress' => TRUE),
'informationsystem_tags' => array('expire' => 14400, 'size' => 262144, 'compress' => TRUE),
'shop_show' => array('expire' => 14400, 'size' => 262144, 'compress' => TRUE),
'shop_tags' => array('expire' => 14400, 'size' => 262144, 'compress' => TRUE),
'search' => array('expire' => 14400, 'size' => 262144, 'tags' => FALSE),
'structure_breadcrumbs' => array('expire' => 14400, 'size' => 262144),
'structure_show' => array('expire' => 14400, 'size' => 262144, 'compress' => TRUE),
'counter_allSession' => array('expire' => 1800, 'size' => 1024, 'tags' => FALSE),
);
Индексом элемента массива является имя кэша, значением - массив опций, где:
  • expire — время жизни закэшированного элемента, указывается в секундах;
  • size — максимальный размер кэшируемого элемента, указывается в байтах;
  • tags — использовать теггирование кэша, по умолчанию TRUE;
  • compress — сжимать значение перед сохранением в кэш, по умолчанию FALSE.
Далее конфигурационный файл возвращает массив со списком доступных хранилищ кэша, например:
PHP
return array (
'memory' => array(
'name' => 'Memory',
'driver' => 'Core_Cache_Memory',
'caches' => array(
'default' => array()
),
),
'file' => array(
'name' => 'File',
'driver' => 'Cache_File',
'checksum' => FALSE,
'caches' => $aTypicalCaches,
),
'eaccelerator' => array(
'name' => 'eAccelerator',
'driver' => 'Cache_Eaccelerator',
'checksum' => TRUE,
'caches' => $aTypicalCaches,
),
'apc' => array(
'name' => 'APC',
'driver' => 'Cache_APC',
'checksum' => TRUE,
'caches' => $aTypicalCaches,
),
'memcache' => array(
'name' => 'Memcache',
'driver' => 'Cache_Memcache',
'server' => '127.0.0.1',
'port' => 11211,
'checksum' => FALSE,
'caches' => $aTypicalCaches,
),
'xcache' => array(
'name' => 'XCache',
'driver' => 'Cache_XCache',
'checksum' => TRUE,
'caches' => $aTypicalCaches,
),
'static' => array(
'name' => 'Static',
'driver' => 'Cache_Static',
'caches' => array(
'default' => array('expire' => 3600, 'size' => NULL),
),
),);
где индексом является уникальное название кэша, а значением массив опций, например:
  • name — текстовое название вида кэширования;
  • driver — имя драйвера, осуществляющего работу с кэшем. Файлы дополнительных драйверов располагаются в директории modules/cache/;
  • checksum — сохранять контрольную сумму кэшируемого объекта и проверять ее при извлечении элемента из кэша, позволяет исключить извлечение поврежденных данных;
  • caches — массив доступных кэшей, чаще всего подставляется переменная $aTypicalCaches.

Конфигурационный файл

Конфигурационный файл размещается в modules/core/config/config.php и содержит следующие настройки:
  • skin — шаблон центра администрирования, по умолчанию 'bootstrap';
  • dateFormat — формат даты, по умолчанию 'd.m.Y';
  • dateTimeFormat — формат даты-времени, по умолчанию 'd.m.Y H:i:s';
  • timezone — временная зона, по умолчанию 'Europe/Moscow';
  • translate — использовать в пути элемента перевод, по умолчанию TRUE. В случае указания FALSE используется транслитерация;
  • chat — использовать чат между пользователями в центре администрирования, по умолчанию TRUE;
  • switchSelectToAutocomplete — количество элементов, при которых большие списки переключать на автоподстановку, по умолчанию 100. Используется, например, при выборе группы для товаров и информационных элементов;
  • autocompleteItems — количество элементов, предлагаемых в автоподстановке, по умолчанию 10;
  • availableExtension — массив расширений файлов, разрешенных для загрузки в атрибуты элементов центра администрирования. При указании дополнительных элементов не забывайте указывать их в верхнем регистре;
  • defaultCache — вид кэширования по умолчанию;
  • fileIcons — массив соответствий расширений файлов и иконок.

PHP . config.php

<?php
return array (
'skin' => 'bootstrap',
'dateFormat' => 'd.m.Y',
'dateTimeFormat' => 'd.m.Y H:i:s',
//'reverseDateTimeFormat' => '',
'datePickerFormat' => 'DD.MM.YYYY',
'dateTimePickerFormat' => 'DD.MM.YYYY HH:mm:ss',
'timezone' => 'Europe/Moscow',
'translate' => TRUE,
'chat' => FALSE,
'switchSelectToAutocomplete' => 100,
'autocompleteItems' => 10,
'backendSessionLifetime' => 14400,
'availableExtension' => array ('JPG', 'JPEG', 'GIF', 'PNG', 'PDF', 'ZIP', 'DOC'),
'defaultCache' => 'file',
'adminMenu' => array(
0 => array(
'image' => '/admin/images/structure.gif'
),
1 => array(
'image' => '/admin/images/service.gif'
),
2 => array(
'image' => '/admin/images/users.gif'
),
3 => array(
'image' => '/admin/images/system.gif'
)
),
'fileIcons' => array(
'sql' => 'sql.gif',
'txt' => 'txt.gif',
'htaccess' => 'config.gif',
'css' => 'css.gif',
'php' => 'php.gif',
'php3' => 'php.gif',
'jpg' => 'jpg.gif',
'jpeg' => 'jpg.gif',
'gif' => 'gif.gif',
'bmp' => 'bmp.gif',
'png' => 'png.gif',
'ico' => 'image.gif', //
'htm' => 'html.gif',
'html' => 'html.gif',
'xml' => 'xml.gif', //
'xsl' => 'xsl.gif',
'zip' => 'zip.gif',
'gz' => 'zip.gif',
'7z' => 'zip.gif',
'rar' => 'rar.gif',
'pdf' => 'pdf.gif',
'doc' => 'doc.gif',
'docx' => 'doc.gif',
'cdr' => 'vector.gif',
'ai' => 'vector.gif',
'eps' => 'vector.gif',
'rb' => 'rb.gif',
'ppt' => 'ppt.gif',
'pptx' => 'ppt.gif',
'pptm' => 'ppt.gif',
'mdb' => 'mdb.gif',
'h' => 'h.gif',
'fh1' => 'fh1.gif',
'fh2' => 'fh2.gif',
'fh3' => 'fh3.gif',
'fh4' => 'fh4.gif',
'fh5' => 'fh5.gif',
'fh6' => 'fh6.gif',
'fh7' => 'fh7.gif',
'fh8' => 'fh8.gif',
'fh9' => 'fh9.gif',
'fla' => 'flash.gif',
'swf' => 'flash.gif',
'xls' => 'xls.gif',
'cpp' => 'cpp.gif',
'chm' => 'chm.gif'
));

Настройка почты, отправка через SMTP, настройка DKIM

Конфигурационный файл размещается в modules/core/config/mail.php. Стандартно используется опция default, для которой задан драйвер sendmail:

   'default' => array (
       'driver' => 'sendmail',
    ),

вместо sendmail укажите драйвер smtp.

Далее настройте секцию с параметрами драйвера smtp:

'smtp' => array (
       'driver' => 'smtp',
       'username' => 'address@domain.com', // Логин
       'password' => 'password', // Пароль
       'host' => 'ssl://smtp.server.com', // для SSL используйте 'ssl://smtp.server.com', для TLS 'smtp.server.com'
       'port' => 465, // порт 25, для SSL порт 465, для TLS порт 587
       'timeout' => 10,
       'log' => FALSE,
       'options' => array(
            'ssl' => array(
                'verify_peer' => FALSE,
                'verify_peer_name' => FALSE,
                'allow_self_signed' => TRUE
            )
        )
    )
В качестве пароля чаще всего указывается пароль приложений, созданный в интерфейсе почтовой службы, а не пароль от самого ящика!

Мы можем подключиться к портам 465 (SMTP over SSL) или 587 (STARTTLS), если необходим TLS, то установите опцию tls в TRUE и порт в 587:

'smtp' => array (
       'driver' => 'smtp',
       ...
       'port' => 587,
       'tls' => TRUE,
       'timeout' => 10,
       ...
    )

Если адрес электронной почты отличается от username, то используйте дополнительную опцию from с указанием адреса электронной почты:

 'smtp' => array (
       'driver' => 'smtp',
       'username' => 'username', // Логин
       'password' => 'password', // Пароль
       'from' => 'address@domain.com', // Адрес эл. почты
       'host' => 'smtp.server.com', // для SSL используйте ssl://smtp.server.com
       'port' => '25', // Порт, для SSL укажите порт 465
        'options' => array(
            'ssl' => array(
                'verify_peer' => FALSE,
                'verify_peer_name' => FALSE,
                'allow_self_signed' => TRUE
            )
        )
    )

Для отладки включите опцию 'log' в значение TRUE, не забудьте отключить опцию после завершения отладки, так как данные имеют большой размер в логах.

Указание отдельных опций для сайтов

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

'smtp' => array (
        'driver' => 'smtp',
        // Общие настройки для всех сайтов
        'username' => 'address@domain.com', // Адрес электронной почты
        'port' => '25', // Порт, для SSL укажите порт 465
        'host' => 'smtp.server.com', // для SSL используйте ssl://smtp.server.com
        'password' => 'password', // Пароль
        // Индивидуальные настройки для сайта с ID 17
        17 => array(
            'username' => 'address2@domain2.com', // Адрес электронной почты
            'port' => '25', // Порт, для SSL укажите порт 465
            'host' => 'smtp.server.com', // для SSL используйте ssl://smtp.server.com
            'password' => 'password', // Пароль
        )
    )

Отдельное указание доступно с версии 6.5.9. Секция 'options' добавлена в версии 6.6.8. Поддержка TLS и указание timeout добавлены в версии 6.8.4.

DKIM

Для того, чтобы письма, отправляемые из системы управления, проходили проверку DKIM, необходимо соединиться с сервером по SSH и создать открытый и закрытый ключ. * доступно с версии 7.0.6

Генерация открытого и закрытого ключа

Создаем закрытый ключ, указав вместо domain.com имя домена:

openssl genrsa -out domain.com.privatekey.pem 1024

где «domain.com.privatekey.pem» — файл приватного ключа, «1024» — длина ключа.

Сохранить путь к сгенерированному ключу, файл будет создан в той же директории, откуда выполнялась команда.

Создаем открытый ключ, указав вместо domain.com имя вашего домена:

openssl rsa -in domain.com.private.pem -out domain.com.public.pem -pubout

где «domain.com.public.pem» — файл публичного ключа

Содержимое файла открытого ключа domain.com.public.pem после генерирования ключа будет следующим:

-----BEGIN PUBLIC KEY-----
ваш открытый ключ
-----END PUBLIC KEY-----

Указание открытого ключа в NS-записи домена

Через панель регистратора домена, в настройках домена создайте TXT-запись для поддомена mail._domainkey со следующим содержимым:

v=DKIM1; k=rsa; p=ваш-открытый-ключ

Ключ должен быть указан в одну строку, без BEGIN и END.

Указание ключа в настройках системы управления

В настройках драйвера или в настройках конкретного сайта укажите использование DKIM и путь к ключу, пример указания для сайта с кодом 2:

return array (
	'default' => array (
		'driver' => 'sendmail',
	),
	'sendmail' => array (
		'driver' => 'sendmail',
		2 => array(
			'dkim' => array(
				'private_key' => '/home/user4567/domain.com.private.pem',
				'selector' => 'mail',
			)
		),
	);

Кроме приведенных опций, для DKIM могут быть заданы следующие:

array(
	'hash' => 'sha256', // sha256|sha1
	'passphrase' => '',
	'selector' => 'mail',
	'domain' => NULL,
	'identity' => NULL,
	'body_canonicalization' => 'relaxed',
)

Особенности настройки почтовых серверов

Яндекс.Почта

Для подключения к почтовому ящику Яндекс из стороннего приложения не подходит обычный пароль, который используется для входа в учетную запись на Яндексе, создайте специальный пароль приложения.

Также может понадобиться разрешить доступ к почтовому ящику с помощью почтовых клиентов, для этого в почте выберите шестерёнку, затем Все настройки  Почтовые программы.

В качестве SMTP-сервера укажите ssl://smtp.yandex.ru, порт 465, не указывать TLS.

Mail.ru

Для подключения к почтовому ящику Mail.ru из стороннего приложения не подходит обычный пароль, который используется для входа в учетную запись, создайте специальный пароль приложения. Перейдите в настройки Mail ID → «Безопасность» → «Пароли для внешних приложений», нажмите Добавить, введите название приложения, чтобы не забыть, для какой программы пароль, скопируйте сгенерированный пароль приложения.

Настройки TinyMCE

Конфигурация визуального редактора

Конфигурация визуального редактора размещена в файле modules/core/config/wysiwyg.php и содержит параметры его инициализации.

Указание стиля для body редактора

В случае, если контент на вашем сайте отображается внутри блока с определенным стилем, например внутри <div class="myclass">здесь текст</div>, то укажите редактору этот стиль в опции body_class:

    'body_class' => '"myclass"',

Скрытие части кнопок

Для скрытия части кнопок интерфейса используйте опцию toolbar_mode в значении "sliding", чтобы показать все опции сразу укажите "wrap"

    'toolbar_mode' => '"sliding"',

Вставка блочных элементов внутри строчных

Стандартно вставка блочных элементов, например, <div> внутрь <a>, не допускается. Для разрешения такой вставки необходимо внести следующие изменения в конфигурацию визуального редактора:

//'forced_root_block' => '"p"',
'forced_root_block'=> 'false',
'valid_children' => '"+body[style],+a[div|h1|h2|h3|h4|h5|h6|p|#text]"' ,

Вставка тега <p> для первого абзаца

Начиная писать текст в визуальном редакторе, он стандартно оборачивается в тег первого абзаца <p>, чтобы исключить такое поведение внесите следующие изменения в конфигурацию визуального редактора:

//'forced_root_block' => '"p"',
'forced_root_block'=>'false',
'force_p_newlines' => 'false' ,

Добавление плагинов TinyMCE

В файле \modules\core\config\wysiwyg.php строка:
'plugins' => '"safari,pagebreak,style,layer,table,save,advhr,advimage,advlink, emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,inlinepopups"',

Вставка тега <meta> в тексте документа

Стандартно визуальный редактор вырезает теги <meta> из документа. Для изменения данного поведения нужно внести изменения в конфигурацию визуального редактора:

'extended_valid_elements'=>'"meta[*],i[*],noindex[*]"',
'valid_children' => '"+body[style|meta],+a[div|h1|h2|h3|h4|h5|h6|p|#text]"' ,

Если хотите добавлять <meta> в определенных тегах, то расширьте правило. Например, добавление в <footer>:

'valid_children' => '"+body[style|meta],+footer[meta],+a[div|h1|h2|h3|h4|h5|h6|p|#text]"',

Вставка данных из Word

С версии редактора TinyMCE 6 плагин paste стал частью ядра TinyMCE. Разработчики предлагают PowerPaste плагин с ежемесячной оплатой.

С версии 7.0.7 в поставку редактора включен плагин paste, которые осуществляет улучшенную вставку данных из Word (как в TinyMCE 5.x версии), активировать его в можете в списке плагинов.

Удаление всех товаров из корзины

Для того, чтобы дать возможность пользователю удалить из корзины сразу все товары необходимо:

1. Добавить в настройки ТДС корзины перед строкой 

Core_Page::instance()->object = $Shop_Cart_Controller_Show 

вот этот код:

// Удаление всех товаров из корзины
 if (Core_Array::getGet('delete_all'))
{
        $oShop_Cart_Controller = Shop_Cart_Controller::instance();
        $oItemsInCart = $oShop_Cart_Controller->getAll($oShop);
        foreach( $oItemsInCart as $oItemInCart)
        {
                        $oShop_Cart_Controller
                                ->shop_item_id($oItemInCart->shop_item_id)
                                ->delete();
        }
}

2. Для удаления всех товаров в XSL шаблоне Корзины разместить ссылку

<a title="Удалить все товары из заказа" onclick="return confirm('Вы уверены, что хотите удалить все товары из заказа?')" href="/shop/cart/?delete_all=1">Удалить все</a>

УДАЛЕНИЕ И ДОБАВЛЕНИЕ ТОВАРОВ В КРАТКОЙ КОРЗИНЕ

Открываем типовые динамические страницы интернет магазина, далее "Интернет-магазин корзина" и "Настройки страницы"
Находим:
// Добавление товара в корзину
if (Core_Array::getRequest('add')) ...
И выше добавляем:
// Ajax Обновление товара в корзине
if (Core_Array::getRequest('updateCart')) {
    $shop_item_id = intval(Core_Array::getRequest('updateCart'));    
    $count = intval(Core_Array::getRequest('count'));    
    if (($shop_item_id) && ($count)) {    
        $oShop_Cart_Controller = Shop_Cart_Controller::instance();
        $oShop_Cart_Controller
        ->checkStock($bCheckStock)
        ->shop_item_id($shop_item_id)
        ->quantity($count)
        ->update();
    }
}
// Ajax Удаляение товара из корзины
if (Core_Array::getRequest('deleteCart')) {
    $shop_item_id = intval(Core_Array::getRequest('deleteCart'));
    if ($shop_item_id) {
        $oShop_Cart_Controller = Shop_Cart_Controller::instance();
        $oShop_Cart_Controller
        ->shop_item_id($shop_item_id)
        ->delete();
    }
}
Находим:
// Ajax
if (Core_Array::getRequest('_', FALSE) && (Core_Array::getRequest('add') || Core_Array::getRequest('loadCart')))
И заменяем на:
// Ajax
if (Core_Array::getRequest('_', FALSE) && (Core_Array::getRequest('add') || Core_Array::getRequest('loadCart') || Core_Array::getRequest('updateCart') || Core_Array::getRequest('deleteCart')))
Изменения в JS:
Открываем скрипт магазина /templates/template_НОМЕР/script.js 
Находим:
// Функции без создания коллекции
$.extend({
...
И добалвяем в них 3 функции:
updateCart: function(path, shop_item_id, count){
    $.clientRequest({
        path: path + '?updateCart=' + shop_item_id + '&count=' + count,
        callBack: $.updelCallback,
        context: $('.little-cart')
    });
    return false;
    },
deleteCart: function(path, shop_item_id){
    $.clientRequest({
        path: path + '?deleteCart=' + shop_item_id,
        callBack: $.updelCallback,
        context: $('.little-cart')
    });
    return false;
},
updelCallback: function(data, status, jqXHR){
    $.loadingScreen('hide');
    $(this).html(data);
}
Изменения в XSL-шаблоне:
В XSL-шаблон добавляем для товара:
<xsl:variable name="kol" select="../quantity" />
<xsl:variable name="cena" select="format-number(price, '#####0,##', 'my')" />                                
Стоимость: <xsl:value-of select="$cena * $kol"/>    
<br />
Кол-во: <xsl:value-of select="$kol"/>
<br />
<a href="#" onclick="return $.updateCart('{/shop/url}cart/', {@id}, {$kol}+1)">Добавить</a>
<br />
<a href="#" onclick="return $.updateCart('{/shop/url}cart/', {@id}, {$kol}-1)">Убавить</a>
<br />
<a href="#" onclick="return $.deleteCart('{/shop/url}cart/', {@id})">Удалить</a>
Для вывода общей суммы покупок можно добавить:
<p>Сумма: <xsl:value-of select="total_amount"/><xsl:text> </xsl:text><xsl:value-of select="shop_currency/name"/></p>
Получаем 
Добавить, Убавить и Удалить лучше всего доработать и заменить на иконки