Изменение стилей шаблона

1320

Как работать со стилями и скриптами?

Начиная с JohnCMS 9.0.0 в системе используются современные средства для сборки файлов стилей и скриптов.
Вы можете конечно не использовать эти средства, но они существенно облегчают разработку после того как вы разберетесь с ними.

Давайте разберемся как же нам теперь работать с нововведениями...
Для работы сборщика нам понадобится Node.js. Вы можете скачать его с официального сайта https://nodejs.org/ru/
Скачайте и установите Node.js на вашем компьютере. После установки перезагрузите компьютер.
Установите JohnCMS на своем компьютере если ещё не установили.

Давайте разберемся где у нас подключаются стили и js и начнем делать свою тему на основе этого.

Откроем файл 
themes/default/templates/system/layout/default.phtml
Как вы наверное догадались это основной шаблон нашего сайта.

Вверху найдем строчку:
<link rel="stylesheet" href="<?= $this->asset('css/app.css', true) ?>">
Эта строка у нас подключает css файл из папки themes/default/assets/css/app.css

Внизу строчку:
<script src="<?= $this->asset('js/app.js', true) ?>"></script>
Эта строчка подключает javascript из папки themes/default/assets/js/app.js

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

Давайте разберемся со сборщиком.
Настройка сборщика производится в файле /webpack.mix.js (в корне сайта).
Давайте откроем его и посмотрим что там есть.
Найдем там 2 строчки которые там нужны:
mix.js('themes/default/src/js/app.js', 'themes/default/assets/js')

    .sass('themes/default/src/scss/app.scss', 'themes/default/assets/css')
Что-то знакомое тут, не правда ли?
Давайте разберемся, что у нас тут для чего.
 
mix.js('themes/default/src/js/app.js', 'themes/default/assets/js')
Эта строчка говорит сборщику чтобы он взял файл по пути themes/default/src/js/app.js произвел все необходимые операции с ним и положил его в папку themes/default/assets/js. Т.к. во втором параметре мы явно не указали название файла, сборщик соберет файл и сохранит с таким же именем что и исходный файл т.е. app.js. В итоге получится так: themes/default/assets/js/app.js

Посмотрим на вторую строку
.sass('themes/default/src/scss/app.scss', 'themes/default/assets/css')
В этой строке мы говорим сборщику чтобы он взял файл themes/default/src/scss/app.scss, преобразовал его в пригодный для браузера вид, сжал и положил его в папку themes/default/assets/css. Т.к. название файла явно не указали, сборщик назовет файл так же как и исходный, но расширение укажет css. т.е. app.css. В итоге получится так: themes/default/assets/css/app.css

Теперь мы разобрались как у нас попадают файлы app.js и app.css в нужные папки.

Давайте теперь создадим свою тему и настроим сборщик так, чтобы он собирал ещё и стили и скрипты в нашей теме.
Создаем в папке themes подпапку с нашей темой my_theme
Из папки с темой default давайте скопируем 2 папки. src и assets
На этом наша тема готова к сборке.
Теперь давайте расскажем о ней сборщику и соберем наши стили и скрипты.

Открываем файл /webpack.mix.js 
Вставим после строки
mix.sourceMaps(true, 'source-map');
следующие 2 строки:
 
mix.js('themes/my_theme/src/js/app.js', 'themes/my_theme/assets/js')

    .sass('themes/my_theme/src/scss/app.scss', 'themes/my_theme/assets/css');

Мы видим тут те же самые пути, которые рассматривали выше, за исключением папки с темой. Это наша новая папка с темой, которую мы создали.

На этом сборщик настроен и уже будет работать.

Давайте откроем командную строку, перейдем в папку с установленным johncms для этого наберите cd и путь к папке в которой установлен johncms.
После этого давайте установим зависимости и запустим сборщик.
Выполните команду
npm install
Эта команда установит bootstrap и прочие библиотеки, необходимые для работы.

После этого выполните команду
npm run watch

Эта команда соберет app.js и app.css и будет следить за изменением исходных файлов и пересобирать app.js и app.css когда вы изменяете исходные файлы.
В результате её выполнения вы должны увидеть следующее:
        Asset                          Size                         Chunks                   Chunk Names
themes/default/assets/css/app.css      258 KiB  /themes/default/assets/js/app  [emitted]        /themes/default/assets/js/app
themes/default/assets/css/app.css.map  295 KiB  /themes/default/assets/js/app  [emitted] [dev]  /themes/default/assets/js/app
themes/my_theme/assets/css/app.css     258 KiB  /themes/default/assets/js/app  [emitted]        /themes/default/assets/js/app
themes/my_theme/assets/css/app.css.map 295 KiB  /themes/default/assets/js/app  [emitted] [dev]  /themes/default/assets/js/app
 + 4 hidden assets
Давайте теперь разбираться в структуре css и js.
Откроем файл: themes/my_theme/src/js/app.js
Этот файл является основным и в нем подключаются все дополнительные файлы. 
Все дополнительные файлы лежат в той же папке что и основной файл. Вы можете открывать их, редактировать или смотреть что в них находится.

Откроем файл: themes/my_theme/src/scss/app.scss
так же как и app.js этот файл является основным файлом в котором подключаются все дочерние.

Давайте посмотрим файл и найдем наш сайдбар чтобы поменять цвет.
Найдем строки
// Левое меню

@import "sidebar";
Эта строка подключает файл sidebar.scss из той же папки что и app.scss
Давайте откроем файл sidebar.scss
В этом файле мы видим практически привычный CSS код. Но он поддерживает вложенность селекторов и прочие возможности. Вы можете подробнее прочитать про SCSS (SASS) на просторах интернета или спросить у нас на форуме.

И так, давайте поменяем всё таки цвет нашего меню. Цвет меню задан прямо во второй строке:
background-color: #ffffff;
Меняем код цвета и сохраняем файл.
После сохранения, сборщик пересоберет app.css и вы увидите изменения на сайте.

Обратите внимание, что команда npm run watch выполняет сборку, но не выполняет сжатие CSS и JS файлов для ускорения работы.
Перед тем, как вы захотите выгрузить изменения на сайт, выполните команду npm run prod она соберет файлы и выполнить минификацию. После этого размер файлов будет меньше.

Примечание:
После создания темы, не забудьте зайти в настройки и выбрать новую тему :)