HOSTCMS v.6
НАСТРОЙКИ
Open Graph
#Вариант 1
<head prefix=
"og: http://ogp.me/ns#
fb: http://ogp.me/ns/fb#
product: http://ogp.me/ns/product#">
<?php
$bOpenGraph = FALSE;
// Open Graph
if (is_object(Core_Page::instance()->object))
{
$bInformationItem = Core_Page::instance()->object instanceof Informationsystem_Controller_Show;
$bShopItem = Core_Page::instance()->object instanceof Shop_Controller_Show;
if ($bInformationItem || $bShopItem)
{
echo'<meta property="og:site_name" content="inikSite.ru">'; // ЗАМЕНИТЬ НА URL СВОЕГО САЙТА
if (Core_Page::instance()->object->item)
{
$bOpenGraph = TRUE;
$aOpenGraph = array();
$oEntity = $bInformationItem
? Core_Entity::factory('Informationsystem_Item', Core_Page::instance()->object->item)
: Core_Entity::factory('Shop_Item', Core_Page::instance()->object->item);
$type = $bInformationItem
? 'article'
: 'product';
$aOpenGraph['og:type'] = $type;
$aOpenGraph['og:title'] = $oEntity->name;
$aOpenGraph['og:description'] = strip_tags(Core_Str::cutSentences($oEntity->description));
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
$oSite_Alias = $oSite->getCurrentAlias();
if ($oSite_Alias)
{
$sSiteURL = $oSite_Alias->name;
$protocol = Core_Page::instance()->structure->https
? 'https://'
: 'http://';
$aOpenGraph['og:url'] = $protocol . $sSiteURL
. Core_Page::instance()->structure->getPath()
. $oEntity->getPath();
if ($oEntity->image_large != '')
{
$aOpenGraph['og:image'] = $protocol . $sSiteURL . $oEntity->getLargeFileHref();
$aOpenGraph['og:image:width'] = $oEntity->image_large_width;
$aOpenGraph['og:image:height'] = $oEntity->image_large_height;
}
if ($bShopItem)
{
$aOpenGraph['product:price:amount'] = $oEntity->price;
$aOpenGraph['product:price:currency'] = $oEntity->shop_currency->code;
}
}
foreach ($aOpenGraph as $sProperty => $sContent)
{
?><meta property="<?php echo htmlspecialchars($sProperty)?>" content="<?php echo htmlspecialchars($sContent)?>" /><?php
echo PHP_EOL;
}
}
elseif (Core_Page::instance()->object->group)
{
$bOpenGraph = TRUE;
$aOpenGraph = array();
$oEntity = $bInformationItem
? Core_Entity::factory('Informationsystem_Group', Core_Page::instance()->object->group)
: Core_Entity::factory('Shop_Group', Core_Page::instance()->object->group);
$type = $bInformationItem
? 'article'
: 'website';
$aOpenGraph['og:type'] = $type;
$aOpenGraph['og:title'] = $oEntity->name;
$aOpenGraph['og:description'] = $oEntity->seo_description;
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
$oSite_Alias = $oSite->getCurrentAlias();
if ($oSite_Alias)
{
$sSiteURL = $oSite_Alias->name;
$protocol = Core_Page::instance()->structure->https
? 'https://'
: 'http://';
$aOpenGraph['og:url'] = $protocol . $sSiteURL
. Core_Page::instance()->structure->getPath()
. $oEntity->getPath();
if ($oEntity->image_large != '')
{
$aOpenGraph['og:image'] = $protocol . $sSiteURL . $oEntity->getLargeFileHref();
}else{
$aOpenGraph['og:image'] = 'https://inikSite.ru/images/logo.jpg'; // ЗАМЕНИТЬ НА ПУТЬ К ЛОГОТИПУ СВОЕГО САЙТА
}
}
foreach ($aOpenGraph as $sProperty => $sContent)
{
?><meta property="<?php echo htmlspecialchars($sProperty)?>" content="<?php echo htmlspecialchars($sContent)?>" /><?php
echo PHP_EOL;
}
}
}
}
if (!$bOpenGraph && Core_Page::instance()->structure)
{
$aOpenGraph = array();
$oEntity = Core_Page::instance()->structure;
$type = 'website';
$aOpenGraph['og:type'] = $type;
$aOpenGraph['og:title'] = $oEntity->Site->name;
$aOpenGraph['og:description'] = strip_tags(Core_Str::cutSentences($oEntity->seo_description));
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
$oSite_Alias = $oSite->getCurrentAlias();
if ($oSite_Alias)
{
$sSiteURL = $oSite_Alias->name;
$protocol = Core_Page::instance()->structure->https
? 'https://'
: 'http://';
$aOpenGraph['og:url'] = $protocol . $sSiteURL
. $oEntity->getPath();
$aOpenGraph['og:image'] = 'https://inikSite.ru/images/logo.jpg'; // ЗАМЕНИТЬ НА ПУТЬ К ЛОГОТИПУ СВОЕГО САЙТА
}
foreach ($aOpenGraph as $sProperty => $sContent)
{
?><meta property="<?php echo htmlspecialchars($sProperty)?>" content="<?php echo htmlspecialchars($sContent)?>" /><?php
echo PHP_EOL;
}
}
?>
#Вариант 2
<?php
// Open Graph
if (is_object(Core_Page::instance()->object))
{
$bInformationItem = Core_Page::instance()->object instanceof Informationsystem_Controller_Show;
$bShopItem = Core_Page::instance()->object instanceof Shop_Controller_Show;
if ($bInformationItem || $bShopItem)
{
if (Core_Page::instance()->object->item)
{
$aOpenGraph = array();
$oEntity = $bInformationItem
? Core_Entity::factory('Informationsystem_Item', Core_Page::instance()->object->item)
: Core_Entity::factory('Shop_Item', Core_Page::instance()->object->item);
$type = $bInformationItem
? 'article'
: 'website';
$aOpenGraph['og:type'] = $type;
$aOpenGraph['og:title'] = $oEntity->name;
$aOpenGraph['og:description'] = strip_tags(Core_Str::cutSentences($oEntity->description));
if ($oEntity->image_large != '')
{
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
$oSite_Alias = $oSite->getCurrentAlias();
if ($oSite_Alias)
{
$sSiteURL = $oSite_Alias->name;
$protocol = Core_Page::instance()->structure->https
? 'https://'
: 'http://';
$aOpenGraph['og:image'] = $protocol . $sSiteURL . $oEntity->getLargeFileHref();
}
}
foreach ($aOpenGraph as $sProperty => $sContent)
{
?><meta property="<?php echo htmlspecialchars($sProperty)?>" content="<?php echo htmlspecialchars($sContent)?>" /><?php
echo PHP_EOL;
}
}
}
}
?>
ROBOTS.TXT для HOSTCMS
Простой файл robots.txt
User-agent: *
Disallow: /admin
Disallow: /search
Disallow: /templates
Disallow: /captcha.php
Disallow: /403
Disallow: /404
Disallow: /*filter=*
Disallow: /*cart/*
Disallow: /*search/*
Disallow: /*sorting=*
Disallow: /*?comments=*
Disallow: /*?producer_id=*
Disallow: /*?on_page=*
Disallow: /showbanner/
Allow: /hostcmsfiles/css/*
Allow: /hostcmsfiles/js/*
User-agent: Yandex
Crawl-delay: 50
Host: site.ru
Sitemap: http://site.ru/sitemap.xml
Расширенный вариант
User-agent: Yandex
Disallow: /admin
Disallow: /search
Disallow: /templates
Disallow: /showbanner
Disallow: /captcha.php
Disallow: /403
Disallow: /404
Disallow: /users/
Disallow: /*tag
Disallow: /*page
Disallow: */page/
Disallow: /compare_items/
Disallow: /*?
Disallow: /*filter=*
Disallow: /*cart/*
Disallow: /*sorting=*
Disallow: /*?comments=*
Disallow: /*?producer_id=*
Disallow: /*?on_page=*
Disallow: /*?text=*
Disallow: *.pdf
Disallow: *.xls
Disallow: *.doc
Disallow: *.ppt
Disallow: *.txt
Allow: /hostcmsfiles/css/*
Allow: /hostcmsfiles/js/*
Allow: /hostcmsfiles/jquery/*
Allow: */upload/*.jpg
Allow: */upload/*.jpeg
Allow: */upload/*.png
Allow: */upload/*.gif
Clean-param: sort
Clean-param: utm_source&utm_medium&utm_term&utm_content&utm_campaign&yclid&gclid&_openstat&from /
Clean-param: openstat
User-agent: Googlebot
Disallow: /admin
Disallow: /search
Disallow: /templates
Disallow: /showbanner
Disallow: /captcha.php
Disallow: /403
Disallow: /404
Disallow: /users/
Disallow: /*tag
Disallow: /*page
Disallow: */page/
Disallow: /compare_items/
Disallow: /*?
Disallow: /*filter=*
Disallow: /*cart/*
Disallow: /*sorting=*
Disallow: /*?comments=*
Disallow: /*?producer_id=*
Disallow: /*?on_page=*
Disallow: /*?text=*
Disallow: *.pdf
Disallow: *.xls
Disallow: *.doc
Disallow: *.ppt
Disallow: *.txt
Disallow: *utm
Disallow: *clid=
Disallow: *openstat
Disallow: *from
Allow: /hostcmsfiles/css/*
Allow: /hostcmsfiles/js/*
Allow: /hostcmsfiles/jquery/*
Allow: */upload/*.jpg
Allow: */upload/*.jpeg
Allow: */upload/*.png
Allow: */upload/*.gif
User-agent: *
Disallow: /admin
Disallow: /search
Disallow: /templates
Disallow: /showbanner
Disallow: /captcha.php
Disallow: /403
Disallow: /404
Disallow: /users/
Disallow: /*tag
Disallow: /*page
Disallow: */page/
Disallow: /catalogs/
Disallow: /compare_items/
Disallow: /*?
Disallow: /*filter=*
Disallow: /*cart/*
Disallow: /*sorting=*
Disallow: /*?comments=*
Disallow: /*?producer_id=*
Disallow: /*?on_page=*
Disallow: /*?text=*
Disallow: *.pdf
Disallow: *.xls
Disallow: *.doc
Disallow: *.ppt
Disallow: *.txt
Disallow: *utm
Disallow: *clid=
Disallow: *openstat
Disallow: *from
Allow: /hostcmsfiles/css/*
Allow: /hostcmsfiles/js/*
Allow: /hostcmsfiles/jquery/*
Allow: */upload/*.jpg
Allow: */upload/*.jpeg
Allow: */upload/*.png
Allow: */upload/*.gif
Host: https://www.site.ru
Sitemap: https://www.site.ru/sitemap.xml
Где управлять разрешенными для загрузки типами файлов?
Открываем фал \modules\core\config\config.php
'availableExtension' => array ('JPG', 'JPEG', 'GIF', 'PNG', 'PDF', 'ZIP', 'DOC'),
и меняем на эту:
'availableExtension' => array ('JPG', 'JPEG', 'GIF', 'PNG', 'PDF', 'ZIP', 'TXT', 'CSV', 'DOC', 'DOCX', 'RTF', 'PDF', 'PPT', 'PPTX', 'XLS', 'XLSX')
Делаем магазин каталог на Главной странице сайта
INDEX_PAGE_IS_DEFAULT = true-
Идем в структуру сайта, открываем редактирование узла "Главная", переключаем тип с документа на ТДС, выбираем ТДС Интернет-магазин, указываем id магазина и нужные xsl-шаблоны.
-
Идем в раздел "Интернет-магазины", заходим в редактор нужного магазина и меняем в списке узел структуры, к которому он привязан.
Для показа групп товаров при переносе групп и товаров в админке сайта

'switchSelectToAutocomplete' => 100,
Доступ по защищенному протоколу HTTPS. SSL сертификаты
Установка внешних ссылок без протокола
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.js"><script type="text/javascript" src="//code.jquery.com/jquery-1.7.js">Использование HTTPS при работе с клиентским разделом
UPDATE `structures` SET `https` = 1 WHERE `site_id` = 2;Указание HTTPS в Яндекс.Вебмастер
Указание директивы Host с https:// в robots.txt
Host: https://www.myhost.ruДоступ в центр администрирования с использованием HTTPS
USE_ONLY_HTTPS_AUTHORIZATIONКОНСТАНТЫ
Отключаем Вебвизор в коде Метрики
webvisor:<?php if (defined('WEBVISOR')) {echo 'true';}else{ echo 'false';};?>,
Загрузка бета обновлений
Отключаем чат в админпанели, чтобы уменьшить нагрузку
'chat' => FALSE,
Меняем путь к базе данных database.php
Открываем файл /modules/core/config/database.php и заменяем параметры
<?php
return array (
'default' => array (
'driver' => 'mysql',
'host' => 'securitysf.mysql',
'username' => 'securitysf_mysql',
'password' => 'auotczlo',
'database' => 'securitysf_hs'
)
);Настройка memcahe
'memcache' => array(
'name' => 'Memcache',
'driver' => 'Cache_Memcache',
'server' => '127.0.0.1',
'port' => 11211,
'checksum' => FALSE,
'caches' => $aTypicalCaches,
),
<?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.
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.
Конфигурационный файл
-
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
Настройка почты, отправка через 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
'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 версии), активировать его в можете в списке плагинов.
Отслеживание продаж в Я.Метрике
Владельцы интернет-магазинов могут получать в Яндекс.Метрике детальную информацию о заказах, совершенных на сайте магазина.
Подключение Ecommerce
Перейдите в Метрику. Выберите счетчик, к которому нужно подключить электронную коммерцию. В настройках счетчика включите опцию Электронная коммерция. В код счетчика добавится контейнер для сбора данных dataLayer.

Убедитесь, что код счетчика на сайте содержит строку:
ecommerce:"dataLayer"
Установите код счетчика на страницах вашего сайта.
Представление и передача данных в Ecommerce
Чтобы передать данные в виде Ecommerce-объектов сервису Яндекс.Метрики, необходимо поместить их в специальный JavaScript-массив методом push. Такой массив будем называть контейнером данных.
- В разделе Настройки перейдите на вкладку Цели.
- Нажмите кнопку Добавить цель.
- Укажите тип условия JavaScript-событие, которое позволяет указать событие на сайте, которое является индикатором эффективности работы сайта.
- Установите Идентификатор цели в ORDER, сохраните номер цели.

- Нажмите кнопку Добавить цель. Созданная цель отображается в списке целей.
- Нажмите кнопку "Сохранить".
- В конец файла
bootstrap.phpдобавьте наблюдателя к событию создания заказа Shop_Payment_System_Handler.onAfterProcessOrder и внесите следующий код обработчика события. Не забудьте заменить идентификатор цели (goal_id) в коде обработчика:
PHP
-
// Цели Яндекс.Метрики при оформлении заказа class HostCms_Yandex_Metrika { static public function onAfterProcessOrder($oShop_Payment_System_Handler) { $oShop_Order = $oShop_Payment_System_Handler->getShopOrder(); // ЗАМЕНИТЕ ЗНАЧЕНИЕ goal_id НА ИДЕНТИФИКАТОР ВАШЕЙ ЦЕЛИ ORDER // Код метрики должен быть выше блока оформления заказа ?> <script type="text/javascript"> // $(window).load(function(){ try { window.dataLayer = window.dataLayer || []; dataLayer.push({ "ecommerce": { "currencyCode": "<?php echo htmlspecialchars($oShop_Order->Shop_Currency->code)?>", "purchase": { "actionField": { "id" : "<?php echo htmlspecialchars($oShop_Order->invoice)?>", "goal_id" : "999999999" }, "products": [ <?php $aShop_Order_Items = $oShop_Order->Shop_Order_Items->findAll(FALSE); $len = count($aShop_Order_Items); foreach ($aShop_Order_Items as $key => $oShop_Order_Item) { ?>{ name: "<?php echo htmlspecialchars($oShop_Order_Item->name)?>", price: <?php echo htmlspecialchars($oShop_Order_Item->getPrice())?>, quantity: <?php echo htmlspecialchars($oShop_Order_Item->quantity)?> }<?php if ($key < $len - 1) { echo "," . PHP_EOL; } } ?> ] } } }); } catch(e) { } //}); </script> <?php } } Core_Event::attach('Shop_Payment_System_Handler.onAfterProcessOrder', array('HostCms_Yandex_Metrika', 'onAfterProcessOrder')); // /Цели Яндекс.Метрики - Проверьте оформление заказа, информация о достижении цели должна появиться в конверсиях.
Сессии
Доступ к данным сессии
$_SESSION.$value = $_SESSION['foo'];
$value = Core_Array::getSession('foo');
$value = Core_Array::getSession('foo', 'default');
Открытие и закрытие сессии
// Открыть сессиюCore_Session::start();
// Записать в сессию
$_SESSION['foo'] = 'bar';
// Закрыть сессиюCore_Session::close();
$bStarted = Core_Session::isStarted();
$bAcive = Core_Session::isAcive();
$session_name = Core_Session::getName();
if (Core_Session::hasSessionId()){
Core_Session::start();
print_r($_SESSION);}
Времени жизни сессии
Конфигурационный файл
-
driver — название драйвера;
-
class — имя класса драйвера (необязательный параметр).
'session' => array(
'driver' => 'database',
'class' => 'Core_Session_Database'
),
-
driver — название драйвера;
-
class — имя класса драйвера (необязательный параметр);
-
server — адрес сервера, по умолчанию 127.0.0.1;
-
port — порт, по умолчанию 6379;
-
auth —авторизационный пароль, если сервер не требует пароль, то не устанавливайте опцию или укажите NULL;
'session' => array(
'driver' => 'phpredis',
'class' => 'Core_Session_Phpredis',
'server' => '127.0.0.1',
'port' => 6379,
'auth' => 'авторизационный пароль'
),