Boilerplate. Базовая настройка сайта.

Список устанавливаемых дополнений
  • FormIt (обработка форм, отправка заявок на электронную почту)
  • MIGX (для создания табличек у ресурсов)
  • TinyMCE Rich Text Editor (визуальный редактор)
  • translit (автоматическая транслитерация адресов страниц)
  • SEO Tab (настройка страницы для поисковых систем)
  • SEO Pro (настройка шаблона сайта в поисковой выдачи)
MODSTORE.PRO
  • Ace (лучший редактор кода)
  • AjaxForm (отправка форм через Ajax)
  • controlErrorLog (управление журналом ошибок)
  • MinifyX (автоматизированное сжатие скриптов и стилей сайта)
  • mixedImage (смешанная загрузка файла)
  • phpThumbOn (для изменения размера и сжатия изображения)
  • pdoTools (быстрая выборка страниц и пользователей сайта)
  • tinyCompressor (автоматическая оптимизация загружаемых файлов)

Ресурсы
  • Главная
  • Сервис
    • 403 (страница ошибки 403 «Доступ запрещен»)
    • 404 (страница ошибки 404 «Документ не найден»)
    • 503 (страница «Сайт недоступен»)
    • Карта сайта (HTML)
    • SiteMap (sitemap.xml)
    • Robots (robots.txt)
Чанки
  • head (файловый элемент)

Плагины
  • Boilerplate
    • привязывается CSS-файл к странице редактирования ресурсов (assets/boilerplate/mgr/manager.css)
    • сжимает вывод html для Google (можно отменить в системной настройке boilerplate_compress_output_html)
    • возможность спрятать вертикальный таб для tv(системная настройка boilerplate_hide_vtabs_tv)
    • модификаторы fenom:
      • alias (транслитерация строки)
      • m2 (модифицирует строку m2 в квадратные метры)
      • phone (убирает лишние символы)
      • table (модифицирует значение поля table в таблицу)
  • managerBreadCrumbs (хлебные крошки в админке)

Системные настройки
CORE
  • allow_multiple_emails = Да (чтобы у каждого пользователя была своя электронная почта)
  • friendly_alias_realtime = Да (генерация псевдонима в реальном времени)
  • friendly_urls = Да (включение дружественных URL)
  • friendly_urls_strict = Да (строгий режим)
  • publish_default = Да (по умолчанию ресурс создаётся опубликованным)
  • use_alias_path = Да (чтобы в URL учитывался псевдоним родителя, а не его замороженный URL)
  • friendly_alias_translit = russian (настройка транслитерации)
  • resource_tree_node_name = menutitle (чтобы названия ресурсов в дереве были покороче)
  • resource_tree_node_tooltip = alias (чтобы можно было понять, какой у ресурса адрес)
  • locale = ru_RU.utf8 (для генерации даты с названиями месяцев)
  • request_method_strict = Да (отключение доступа к странице по id)
  • unauthorized_page = {id} (id 403 страницы)
  • error_page_header = HTTP/1.0 404 Not Found (заголовок для 404 ошибки)
  • error_page = {id} (id 404 страницы)
  • site_unavailable_page = {id} (id 503 страницы)
PDOTOOLS
  • pdotools_fenom_default = Да (использование Fenom в чанках)
  • pdotools_fenom_modx = Да (разрешаем MODX в Fenom)
  • pdotools_fenom_parser = Да (использование Fenom на страницах)
  • pdotools_elements_path = {core_path}/ (для загрузки файловых элементов)

TINYCOMPRESSOR
  • tinycompressor_tinypng_upload_enable = Да (сжимает загружаемые изображения)

TINYMCERTE
  • tinymcerte.plugins = advlist autolink lists modximage charmap print preview anchor visualblocks searchreplace code fullscreen insertdatetime media table contextmenu paste modxlink textcolor colorpicker
  • tinymcerte.toolbar1 = undo redo | styleselect | backcolor forecolor bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image

BOILERPLATE
boilerplate_compress_output_html = Да (сжимает вывод html для Google)
boilerplate_tpl_css ( шаблон загрузки css ) =
<link rel="preload" href="[[+file]]" as="style" onload="this.onload=null;this.rel='stylesheet'">
boilerplate_tpl_js (шаблон загрузки js) =
<link rel="preload" href="[[+file]]" as="script"><script src="[[+file]]" defer></script>
boilerplate_social = [[«behance»,«Behance»], [«dribbble», «Dribbble»], [«facebook-f»,«Facebook»], ...] (список соц. сетей)
boilerplate_hide_vtabs_tv = нет

Другое
  • Установка HTTP заголовков
    • X-Frame-Options:deny
    • X-XSS-Protection:1;mode=block
    • X-Content-Type-Options:nosniff
    • Referrer-Policy:no-referrer
    • Cache-Control: max-age=31536000, must-revalidate
  • Удаляется файл changelog.txt, чтобы убрать сообщение о том, что безопасность сайта не в порядке
  • Переименовываются файлы ht.access в корне и в папке /core/, чтобы заработали дружественные URL
  • Меняем контент главного шаблона и делаем его статичным
  • Хуки для minifyX
    • libs.php (для загрузки библиотек)
    • ms2 (инициализации minishop2, для поддержки асинхронной загрузке скриптов)
Ссылка на компонент
Aleksandr Huz
04 мая 2019, 13:12
8
847
+10
Поблагодарить автора Отправить деньги

Комментарии: 27

Алексей Ерохин
05 мая 2019, 16:49
-2
Удаляется файл changelog.txt, чтобы убрать сообщение о том, что безопасность сайта не в порядке
Переименовываются файлы ht.access в корне и в папке /core/, чтобы заработали дружественные URL
Для дружественных URL — htaccess в корне сайта.
В htaccess в папке core закрывает доступ извне, и как раз убирает предупреждение, которое вы убираете удалением файла :facepalm:
    Николай Савин
    05 мая 2019, 17:47
    0
    Убирает предупреждение для серверов на apache, а вот для серверов на ngnix, которых большинство — фокус не удастся, там только текстовый файл физически удалять
      Алексей Ерохин
      05 мая 2019, 18:21
      0
      Можно закрыть через конфигурацию хоста в nginx
      Но скрывать потенциальную проблему — лучший способ.
        g0dzilla
        05 мая 2019, 23:51
        0
        на шаред хостингах иногда нет доступа к конфигуратору nginx, и удаление changelog — единственное решение убрать оповещение о нарушении безопасности
Лазарев Роман
05 мая 2019, 18:53
0
Можно настроить под себя? Удалить что то из списка и добавить свое?
    Aleksandr Huz
    06 мая 2019, 14:29
    0
    На данный момент нет.
iWatchYouFromAfar
06 мая 2019, 01:09
0
Можно сделать свою собственную сборку на основе siteExtra. Я сейчас сайты на modx делаю именно так, сделал свою базовую сборку и в ней пишу всю основу для создания чистого сайта. Сайт на такой сборке можно легко пустить в работу, а все фундаментальные изменения делать именно в установщике. Это позволит нам избежать правок в админке и все наши изменения будут жить в скрипте. Ну и плюс это опыт по работе с modx/компонентами программно.

Так же я интегрировал в свою сборку gulp (для внесения изменений в верстку на лету). Ну это мне просто так удобно, когда верстка рядом с кодом лежит.

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

Возможно @Илья Уткин подскажет или поможет с реализацией этой идеи. Это нужно для установки собственных пакетов, которых нет в репозиториях. Свой репозиторий делать ради этого, такая себе идея. Конечно можно установить ручками — но идея как раз избежать этого! :)

Возможно кто-то уже делал такой резолвер и поделится решением.
    Илья Уткин
    06 мая 2019, 07:50
    +2
    Вот кусочек кода, думаю, этого хватит, чтобы по примеру написать свой резолвер:
    $signature = $packageName . '-' . $data['version'];
    $filename = $signature . '.transport.zip';
    $file_source = MODX_BASE_PATH . RELATIVE_PATH . 'packages/' . $filename;
    if (file_exists($file_source)) {
        system('cp -R ' . MODX_BASE_PATH . RELATIVE_PATH . 'packages/' . $filename . ' ' . MODX_CORE_PATH . 'packages/');
    
        $package = $this->modx->getObject('transport.modTransportPackage',array(
            'signature' => $signature,
        ));
        if (empty($package)) {
            $package = $this->modx->newObject('transport.modTransportPackage');
            $package->set('signature', $signature);
            $package->set('state', 1);
            $package->set('created',strftime('%Y-%m-%d %H:%M:%S'));
            $package->set('workspace', 1);
    
            /* set package version data */
            $sig = explode('-',$signature);
            $package->set('package_name',$sig[0]);
            if (!empty($sig[1])) {
                $v = explode('.',$sig[1]);
                if (isset($v[0])) $package->set('version_major',$v[0]);
                if (isset($v[1])) $package->set('version_minor',$v[1]);
                if (isset($v[2])) $package->set('version_patch',$v[2]);
            }
            if (!empty($sig[2])) {
                $r = preg_split('/([0-9]+)/',$sig[2],-1,PREG_SPLIT_DELIM_CAPTURE);
                if (is_array($r) && !empty($r)) {
                    $package->set('release',$r[0]);
                    $package->set('release_index',(isset($r[1]) ? $r[1] : '0'));
                } else {
                    $package->set('release',$sig[2]);
                }
            }
            $package->save();
            $package->install();
        }
    } else {
        $this->modx->log('Could not find package file: ' . $filename, 'ERROR');
        return false;
    }
      iWatchYouFromAfar
      06 мая 2019, 10:30
      0
      Спасибо! Насколько я понял, нужно получить signature всех пакетов в указанной папке, signature состоит из (название-версия). Как это можно реализовать?
        Илья Уткин
        06 мая 2019, 12:50
        0
        Ну просто пробегись по списку файлов в папке и составь массив из signature.
Андрей
07 мая 2019, 09:05
2
+1
Я себе такой скрипт написал, просто запускаешь после установки модх через консоль

php modx_config.php

Часть с установкой пакетов взял из заметки Василия Наумкина.
Просто в массивах указываете нужные параметры и запускаете.
Не забываем указать логин и пароль администратора в конфигурации.

<?php

set_time_limit(0);
ini_set('max_execution_time', 0);

// API

require_once 'config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');

$cache = $modx->getCacheManager();

function installPackage($packageName, $provider = 1) {
	global $modx;

	$provider = $modx->getObject('transport.modTransportProvider', $provider);
	$provider->getClient();
	$modx->getVersionData();
	$productVersion = $modx->version['code_name'].'-'.$modx->version['full_version'];

	$response = $provider->request('package','GET',array(
		'supports' => $productVersion,
		'query' => $packageName
	));

	if (!empty($response)) {

		$foundPackages = simplexml_load_string($response->response);

		foreach($foundPackages as $foundPackage) {
			/* @var modTransportPackage $foundPackage */
			if($foundPackage->name == $packageName) {
				$sig = explode('-',$foundPackage->signature);
				$versionSignature = explode('.',$sig[1]);
				$url = $foundPackage->location;

				if (!download($url, $modx->getOption('core_path').'packages/'.$foundPackage->signature.'.transport.zip')) {
					return array(
						'success' => 0,
						'message' => 'Could not download package <b>'.$packageName.'</b>.',
					);
				}

				$package = $modx->newObject('transport.modTransportPackage');
				$package->set('signature',$foundPackage->signature);
				$package->fromArray(array(
					'created' => date('Y-m-d h:i:s'),
					'updated' => null,
					'state' => 1,
					'workspace' => 1,
					'provider' => $provider->id,
					'source' => $foundPackage->signature.'.transport.zip',
					'package_name' => $sig[0],
					'version_major' => $versionSignature[0],
					'version_minor' => !empty($versionSignature[1]) ? $versionSignature[1] : 0,
					'version_patch' => !empty($versionSignature[2]) ? $versionSignature[2] : 0,
				));

				if (!empty($sig[2])) {
					$r = preg_split('/([0-9]+)/',$sig[2],-1,PREG_SPLIT_DELIM_CAPTURE);

					if (is_array($r) && !empty($r)) {
						$package->set('release',$r[0]);
						$package->set('release_index',(isset($r[1]) ? $r[1] : '0'));
					} else {
						$package->set('release',$sig[2]);
					}
				}

				if ($package->save() && $package->install()) {
					return array(
						'success' => 1,
						'message' => '<b>'.$packageName.'</b> was successfully installed',
					);
				}
				else {
					return array(
						'success' => 0,
						'message' => 'Could not save package <b>'.$packageName.'</b>',
					);
				}
				break;
			}
		}
	}
	else {
		return array(
			'success' => 0,
			'message' => 'Could not find <b>'.$packageName.'</b> in MODX repository',
		);
	}
	return true;
}

function download($src, $dst) {
	if (ini_get('allow_url_fopen')) {
		$file = @file_get_contents($src);
	}
	else if (function_exists('curl_init')) {
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $src);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT,180);
		$safeMode = @ini_get('safe_mode');
		$openBasedir = @ini_get('open_basedir');
		if (empty($safeMode) && empty($openBasedir)) {
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		}

		$file = curl_exec($ch);
		curl_close($ch);
	}
	else {
		return false;
	}
	file_put_contents($dst, $file);

	return file_exists($dst);
}

// LOGIN

$_user = [
	'username' => 'ваш_логи',
	'password' => 'ваш_пароль',
	'rememberme' => true,
	'login_context' => 'mgr'
];
$response = $modx->runProcessor('/security/login', $_user);
$user = $modx->getObject('modUser', array('username' => $_user['username']));
$modx->user = $user;


print "LOGIN: Done!\n";

// FOLDERS

$_folders = [
	'userdata/',
	'templates/'
];

foreach ($_folders as $folder) {
	$cache->writeTree(MODX_BASE_PATH.$folder);
}

print "FOLDERS: Done!\n";

// RENAME ht.access

rename(MODX_BASE_PATH.'ht.access', MODX_BASE_PATH.'.htaccess');
rename(MODX_BASE_PATH.'core/docs/changelog.txt', MODX_BASE_PATH.'core/docs/_changelog.txt');

print "RENAME: Done!\n";

// MEDIA SOURCES

$_media_sources = [
	[
		'name' => 'Userdata',
		'basePath' => 'userdata/',
		'baseUrl' => 'userdata/'
	]
];

foreach ($_media_sources as $config) {
	$source = $modx->runProcessor('source/create', [
		'name' => $config['name'],
		'class_key' => 'sources.modFileMediaSource'
	]);

	if ($source->isError()) {
		$modx->log(1, 'Failed to create Source. Message: '.$source->getMessage());
	}

	$source = $modx->getObject('modMediaSource', $source->response['object']['id']);
	$properties = $source->getProperties();
	$properties['basePath']['value'] = $config['basePath'];
	$properties['baseUrl']['value'] = $config['baseUrl'];
	$source->setProperties($properties);
	$source->save();
}

print "MEDIA SOURCES: Done!\n";

// PROVIDERS

$_providers = [
	[
		'name' => 'modstore.pro',
		'service_url' => 'https://modstore.pro/extras/',
		'username' => '',
		'api_key' => '',
		'description' => ''
	],
];

foreach ($_providers as $properties) {
	$provider = $modx->runProcessor('workspace/providers/create', $properties);

	if ($provider->isError()) {
		$modx->log(1, 'Failed to create Provider. Message: '.$provider->getMessage());
	}
}

print "PROVIDERS: Done!\n";

// PACKAGES

$_packages = [
	1 => [
		'translit',
		'FormIt',
		'ClientConfig',
		'MIGX',
		'CKEditor',
		'filetranslit',
		'Console',
		'simpleUpdater',
	],
	2 => [
		'pdoTools',
		'Ace',
		'phpThumbOn',
		'AjaxForm',
	]
];

foreach ($_packages as $provider => $packages) {
	foreach ($packages as $package) {
		installPackage($package, $provider);
		print $package.": Done!\n";
	}
}

print "PACKAGES: Done!\n";

// RESOURCES

$_resources = [
	[
		'pagetitle' => '404',
		'alias' => '404',
		'hidemenu' => 1,
		'published' => 1,
		'content' => '<p>Такой страницы не существует.</p>'
	],
	[
		'pagetitle' => 'sitemap.xml',
		'alias' => 'sitemap',
		'content_type' => 2,
		'template' => 0,
		'hidemenu' => 1,
		'published' => 1,
		'richtext' => 0,
		'content' => '[[!pdoSitemap]]'
	],
	[
		'pagetitle' => 'robots.txt',
		'alias' => 'robots',
		'content_type' => 3,
		'template' => 0,
		'hidemenu' => 1,
		'published' => 1,
		'richtext' => 0,
		'content' => "User-agent: *\nDisallow: /"
	]
];

foreach ($_resources as $properties) {
	$resource = $modx->runProcessor('resource/create', $properties);

	if ($resource->isError()) {
		$modx->log(1, 'Failed to create Resource. Message: '.$resource->getMessage());
	}
}

print "RESOURCES: Done!\n";

// OPTIONS

// get media source id
$default_media_source = $modx->getObject('modMediaSource', [
	'name' => $_media_sources[0]['name']
]);

$default_media_source = $default_media_source->toArray()['id'];

// get error page id
$error_page = $modx->getObject('modResource', [
	'pagetitle' => $_resources[0]['pagetitle']
]);

$error_page = $error_page->toArray()['id'];

$_options = [
	'site_name' => 'SITE_NAME',
	'emailsender' => 'ваша_почта',

	'server_protocol' => 'http',
	'friendly_alias_realtime' => 1,
	'friendly_alias_restrict_chars' => 'alphanumeric',
	'friendly_alias_translit' => 'russian',
	'friendly_urls' => 1,
	'friendly_urls_strict' => 1,
	'use_alias_path' => 1,
	'use_frozen_parent_uris' => 1,
	'confirm_navigation' => 0,
	'welcome_screen' => 0,
	'default_template' => 1,
	'link_tag_scheme' => 'abs',
	'log_snippet_not_found' => 0,
	'log_deprecated' => 0,
	'publish_default' => 1,
	'feed_modx_news_enabled' => 0,
	'feed_modx_security_enabled' => 0,
	'send_poweredby_header' => 0,

	'ace.font_size' => '14px',
	'ace.theme' => 'tomorrow_night',
	'pdotools_fenom_options' => '{"strip":true}',
	'pdotools_fenom_parser' => 1,

	'default_media_source' => $default_media_source,
	'error_page' => $error_page
];

foreach ($_options as $key => $value) {
	if ($option = $modx->getObject('modSystemSetting', $key)) {
		$option->set('value', $value);
		$option->save();
	}
}

print "OPTIONS: Done!\n";

// CONTENT TYPE

$content_type = $modx->getObject('modContentType', [
	'name' => 'HTML'
]);

if ($content_type) {
	$content_type->set('file_extensions', '/');
	$content_type->save();
}

print "CONTENT TYPE: Done!\n";

// CLEAR CACHE

$cache->refresh();

print "ALL Done!\n";
    Илья Александрович
    22 мая 2019, 10:00
    0
    вот такая ошибка вылетает
    LOGIN: Done!                                                                                                                                                                                                                                    
    FOLDERS: Done!                                                                                                                                                                                                                                  
    RENAME: Done!                                                                                                                                                                                                                                   
    PHP Fatal error:  Uncaught Error: Call to a member function getProperties() on null in /home/c/***/public_html/auto_config_site_modx_revo.php:181                                                                                           
    Stack trace:                                                                                                                                                                                                                                 
    #0 {main}       
      thrown in /home/c/***/public_html/auto_config_site_modx_revo.php on line 181
    это вот эта строка $properties = $source->getProperties();
    Не подскажите в чём дело?
      Андрей
      22 мая 2019, 10:07
      0
      Видимо Источник файлов не создался по какой-то причине, попробуйте закомментировать этот шаг и эту строку в $_options

      'default_media_source' => $default_media_source,
        Илья Александрович
        22 мая 2019, 10:21
        0
        Спасибо за быстрый ответ)
        если закомментировать то идёт процесс дальше.
        далее на создании ресурсов ломается
        PACKAGES: Done!                                                                                                                                                                                                                                 
        PHP Fatal error:  Uncaught Error: Call to a member function get() on null in /home/c/***/public_html/core/model/modx/processors/resource/create.class.php:234                                                                               
        Stack trace:                                                                                                                                                                                                                                    
        #0 /home/c/***/public_html/core/model/modx/processors/resource/create.class.php(142): modResourceCreateProcessor->setFieldDefaults()                                                                                                        
        #1 /home/c/***/public_html/core/model/modx/modprocessor.class.php(641): modResourceCreateProcessor->beforeSet()                                                                                                                             
        #2 /home/c/***/public_html/core/model/modx/modprocessor.class.php(177): modObjectCreateProcessor->process()                                                                                                                                 
        #3 /home/c/***/public_html/core/model/modx/modx.class.php(1764): modProcessor->run()                                                                                                                                                        
        #4 /home/c/***/public_html/test1.php(259): modX->runProcessor('resource/create', Array)                                                                                                                                                     
        #5 {main}                                                                                                                                                                                                                                       
        thrown in /home/c/***/public_html/core/model/modx/processors/resource/create.class.php on line 234
          Андрей
          22 мая 2019, 10:28
          0
          Ресурсы стандартным процессором создаются, там нет ничего необычного. Версия модх какая? На 2.7 работает точно, на других не проверял.
            Илья Александрович
            22 мая 2019, 10:32
            0
            2.7.1
            только что поставил
            php 7.2
            Илья Александрович
            22 мая 2019, 10:35
            0
            Отличный скрипт в общем был бы, если бы отработал.
            не хватает ещё создание шаблонов.
              Андрей
              22 мая 2019, 10:44
              0
              Все работает, только что проверил на modhost

              Андрей
              22 мая 2019, 10:47
              0
              Возможно вы не указали реквизиты для админки тут

              $_user = [
              	'username' => 'ваш_логи',
              	'password' => 'ваш_пароль',
              	'rememberme' => true,
              	'login_context' => 'mgr'
              ];
                Илья Александрович
                22 мая 2019, 10:56
                0
                Указал. Я сам создал репозитарий и поставил модуль Console.
                Может из за этого глюки были.
                С нуля всё получилось. Спасибо Вам.
                А не подскажите как внедрить создание шаблонов?
                  Андрей
                  22 мая 2019, 11:05
                  0
                  Можно так, например, перед созданием ресурсов вставить.
                  // TEMPLATES
                  
                  $_templates = [
                  	[
                  		'templatename' => 'Название шаблона',
                  		'content' => '<h1>Привет!</h1>'
                  	],
                  	[
                  		'templatename' => 'Еще название шаблона',
                  		'content' => '<h1>Привет еще раз!</h1>'
                  	]
                  ];
                  
                  foreach ($_templates as $properties) {
                  	$template = $modx->runProcessor('element/template/create', $properties);
                  
                  	if ($template->isError()) {
                  		$modx->log(1, 'Failed to create Resource. Message: '.$template->getMessage());
                  	}
                  }
                  
                  print "TEMPLATES: Done!\n";

                  Все поля для шаблона можно посмотреть тут в поле fields
Misha Bulic
09 мая 2019, 11:21
0
Спасибо за сборку. Помогает с новыми сайтами. Есть несколько замечаний/предложений:
  • Раньше base.tpl подключалось через {include 'file:components/boilerplate/elements/templates/base.tpl'} Почему сейчас поменяли? Теперь при редактировании файла приходится в админку лезть и сбрасывать кеш.
  • В базовом шаблоне не хватает h1.
  • в шаблоне стоят {'logo' | config} и прочее а самих этих полей не нашел. Может сразу ClientConfig добавить?
  • В служебные можно ещё добавить политику конфиденциальности.
  • translit почему то не конвертирует alias при создании ресурса на русском.
    Aleksandr Huz
    09 мая 2019, 14:53
    0
    Спасибо за замечания!
    В предыдущем обновлении ошибся, поэтому системные настройки не устанавливались.
    ClientConfig добавил в сборку.

    В базовом шаблоне не хватает h1.
    Тут уже нужно вставлять самому в чанке или в самом шаблоне.

    В служебные можно ещё добавить политику конфиденциальности.
    Да, добавлю в след. обновлении.
Александр Мельник
17 мая 2019, 09:18
0
Спасибо. Удобно, работает.
Evgeny Tarasov
21 июня 2019, 11:08
+1
Мой дилетантский комментарий относительно работы компонента.
После обновления компонент вновь перезаписывает шаблон с индексом 1. На рабочем сайте это вообще бывает не удобно. Может лучше новый шаблон создавать?
    Aleksandr Huz
    22 июня 2019, 18:08
    0
    Отличное замечание. Исправлю
Александр Мельник
16 июля 2019, 10:14
0
Как думаете, в чем может быть причина того, что изображено на скрине?

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.