EVO 3.0 RC2 - первый подход

Так получилось, что я пропустил версию 2. Анонсы я, конечно, видел, и даже пытался смотреть видео — но как-то «не зашло» и не вдохновился.

Но процесс идет своим чередом и никто никого не ждет — уже на подходе версия 3 и нужно восполнять пробелы. Сподвигло и то, что появился и архив демо-сайта v.2 из видео уроков, все же лучше доходит, если если есть живой сайт и можно потыкать «клаву», чем просто смотреть мультики.

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

А коды — авторы обещают выпустить и новое видео, и текстуальные мануалы, да и сейчас уже кое-что есть.

1. Исходные данные данные.

1.1. Архив тестового сайта Dmi3yy evo-2.0, этот архив есть в телеграме на канале новостей EVO, можно скачать и развернуть у себя, a в интернете этот сайт здесь
lessons.evo.im/

1.2. Видео уроки
www.youtube.com/playlist?list=PLKTHZGrYLdtoMegu0vG1Isek4_HsZPtZf
и здесь
modx.im/blog/news/5832.html
github.com/evolution-cms/example-package

1.3. Установка будет версии 3.х, т.к. 3.0RC2 уже устарела. Это здесь
github.com/evolution-cms/evolution

1.4. Исходный архив v.2 — он с blang (мультиязычность), и я изначально решил ставить сайт без него, исходя из того, что большинство сайтов все же на одном языке, да и лучше придерживаться принципа от простого к сложному. Так же не буду ставить ClientSettings и templatesEdit 3 — они чисто для админки, их установка и настройка ничем не отличается от v. 1.4.x и по ним есть темы на этом сайте.

1.5. Ставить буду на локалку Open Server.

2. Системные требования.

— версия php не ниже 7.3 (т.к. интегрирован laravel v.8)
— MySQL не ниже 5.7, но станет и ниже (я для теста поставил на 5.6), но при установке выдаст предупреждение:

Проверка версии MySQL: Предупреждение!   Ваша версия MySQL: 5.6.43
Если вы используете версию MySQL ниже чем 5.7.6 то движок таблиц будет MyISAM, в новейших версиях движок будет InnoDB.
Рекомендуем обновить ваш MySQL

— сравнение utf8mb4_general_ci
— для установки пакета потребуется composer, об этом ниже.
— файл подключения базы данных теперь здесь core/config/database/connections/default.php

3. Установка
В своих видео Дмитрий рассказал о 3-х способах установки. Я ставил как обычно:
— скачал с github архив (ссылка выше)
— создал новую базу данных
— распаковал архив в созданную в OS папку evolution-3.ru (разумеется, у вас может быть другой домен)
— перезапустил сервер
— запустил инсталляцию evolution-3.ru/install
В общем, процесс установки — все как всегда.

А дальше отличия.
3.1. Если раньше после установкb нас перебрасывало на evolution-3.ru/manager и надо было авторизоваться, то сейчас мы авторизуемся автоматически и сразу попадаем в админку в раздел конфигурации для насnройки новой установки, что однозначно плюс. Конфигурация открывается без левой колонки с деревом ресурсов.

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

3.2. Появилась отдельная папка Почта и шаблоны, а в ней такая настройка как The envelope sender of the message



Что это и зачем — пока не знаю, может кто пояснит.

3.3. На вкладке Сайт — поля Controller Namespace и Git Hub путь



Об этом остановлюсь ниже.

3.4. На вкладке Интерфейс и представление можно обнаружить, что редактора TinyMCE теперь нет.

3.5. Вносим свои настройки, сохраняем и фигеем — после сохранения на странице девственно белый экран. Не знаю, почему так, но убираем в строке браузера все лишнее, что идет после evolution-3.ru/manager и нажимаем enter. Можно выдохнуть — админка появилась!

3.6. В админке тоже много отличий. Первое и наверное самое существенное — теперь нет ни менеджеров, ни веб пользователей. Есть только Пользователи и их роли. Все. Это революционные изменения, которые благоприятно скажутся на разработку личных кабинетов — их как таковых не будет, а для зарегистрированных пользователей можно будет использовать весь имеемый арсенал админки EVO (с учетом назначенных ролей), что существенно упростит разработку и увеличит функциональность этих самых «личных кабинетов». Пожалуй, это все что знаю, и раздел пока еще в разработке.

3.7. Еще одно отличие — аскетичность: из коробки только несколько плагинов, остальные разделы пустые, все надо ставить самостоятельно. Но Extras работает, проблем нет. А чего нет в Extras, то будет (как обещают разработчики), а пока можно взять и из 1.4.х.

Для работы я установил следующие компоненты, сделал нужные страницы, шаблоны к ним, и TV






Хотя и оно не все потребуется.

3.7. Обратите внимание на шаблоны — теперь у них появилось поле Псевдоним, оно нужно для привязки шаблона EVO к шаблону blade от laravel.
И сами шаблоны, если писать сайт в laravel, пустые. Весь программинг пишется в файлах, о чем пойдет речь ниже. Этот псевдоним и есть тот волшебный мостик, с помощью которого шаблоны blade подключаются к ресурсам дерева Evo, благодаря чему Laravel обрел админку Evo, а Evo обрел Laravel.

Тому, кто будет делать сайт по-старинке инструментами EVO — дальше можно не читать, а делать сайт как и прежде, например, в 1.4.х.

Тому, кто будет делать сайт на Laravel, админку можно закрывать, она нам больше не потребуется, все остальное делается в файлах.

4. Шаблон html
Его теперь нужно загружать не в папку assets/templates, а в папку theme, которую нужно создать в корне сайта.



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

5. Blade
Это шаблонизатор, то что ранее было template. Файлы шаблона хранятся в папке views, которую надо так же создать в корне сайта. Выглядит так



5.1. Шаблоны
Название файла шаблона должен иметь вид, например, home.blade.php, где home — это название псевдонима шаблона evo в админке, а остальное — .blade.php — обязательная часть, всегда должна быть в названии шаблона blade.

Кроме шаблонов blade, которые подключены к шаблонам evo, удобно иметь и базовый шаблон с названием base.blade.php, который хранится в папке views/layouts.
Удобно тем, что в нем можно сразу прописать, например:
— общие (сквозные) блоки для всех шаблонов, например шапку, футер, меню, хлебные крошки, и т.п.
— секции, которые могут быть прописаны в других (тематических) шаблонах, в том числе по условию, или со значением по умолчанию
— то, что в нужных шаблонах можно добавить, например, скрипты для формы в шаблоне form.blade.php

Шаблон привязывается к базовому шаблону одной строчкой кода:
@extends('layouts.base')
Другими словами, к ресурсу уже будет подключена некая склейка из шаблона blade и базового шаблона blade.

5.2. Чанки
Поскольку теперь шаблоны хранятся в файлах, то логично, чтобы и чанки тоже хранились в файлах, а не тащить их из базы (админки), хотя и можно.
Чанки хранятся views/partials, при этом их можно для удобства группировать по своим категориям, например, в папке views/partials/form — чанки для FormLister'a

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

6. Composer
6.1. У Open Server есть собственная консоль, находится по адресу Дополнительно -> Консоль.
Если у вас Composer'a еще нет, надо его установить.

6.2. Установка
Переходим в нужную версию php 7.3, команда для перехода в нужную папку
cd modules/php/PHP_7.3/

После чего непосредственно установка, выполняем команду
php -r «readfile('https://getcomposer.org/installer');» | php
проверяем работоспособность, команда на проверку установленной версии
php composer.phar –V
У меня выдало результат
Composer version 2.0.8 2020-12-03 17:20:38

Для удобства (рекомендации из просторов), выполняем команду
echo @php "%~dp0composer.phar" %*>composer.bat
Она создаст .bat файл и в дальнейшем можно будет работать без указания php composer.phar, просто указывая composer Т.е. команда проверки версии (которая была выше) будет выглядеть так:
composer –V

Это все. Можно переходить к установке пакета.

7. Пакет Main
Пакеты служат для удобства аккумулирования в одном месте сниппетов, плагинов, модулей и чанков для конкретного проекта в одном месте.
Пакет Main — это основной пакет, его установка осуществляется в Composer'е.

7.1. Установка.
Открываем консоль Open Server (п.6).
Переходим в папку core сайта, для чего выполняем команду (указываете свой домен сайта)
cd domains/evolution-3.ru/core

После отработки (изменится адресная строка) устанавливаем пакет, для чего выполняем команду
php artisan package:create main
В консоле вы увидите процесс установки.
По окончании можно идти на сайт и смотреть, что и куда установилось.

7.2. Файлы пакета
Они загрузились по адресу core/custom/packages/main
Можно все открыть и посмотреть. Подробнее как это работает можно посмотреть в видео уроке.



Обращу внимание на файл MainServiceProvider.php — это своего рода «управляющий» файл и если будете откуда-то его копировать готовым, то надо проверять и при необходимости переименовывать namespace = mаin. И в функции register при установке по-умолчанию все закомментировано. На сайте у меня использовался только один плагин evoAjax.php, поэтому я раскомментировал в этой функции только плагины.

8. Контроллеры.
В версии 3.х дополнительный пакет с контроллерами устанавливать не надо — он уже вшит в ядро, его нужно только подключить.

8.1. Подключается он в админке сайта в конфигурации — вкладка Сайт поле Controller Namespace.
В это поле надо вписать EvolutionCMS\Main\Controllers\, как и написано ниже этого поля в примере.
Поле Git Hub путь оставляем пустым.



8.2. Размещаются контроллеры по адресу core/custom/packages/main/src/Controllers и так же как в шаблонах может быть базовый контроллер, и контроллеры для отдельных шаблонов.
Так же как и в пакетах, при копировании готовых решений надо обращать внимание и переименовывать в правильный namespace EvolutionCMS\Main\Controllers.
Еще раз обращаю внимание — устанавливать через Composer, как это было в версии 2.х, не надо!



Вот, собственно, и все для начала.
Ждем видео и мануала по версии 3.
Можно дописывать.
Можно поправлять и критиковать.
Можно спрашивать, сам могу и не ответить, но здесь есть более сведущие и опытные.

30 комментариев

avatar
Скачать архив demo-сайта v.3 можно здесь
wdfiles.ru/nL8I

Это практически то же, что и demo-сайт Дмитрия на v.2, но выпилил blang, почистил лишнее, что не имеет отношения к сайту, кое-что чуть-чуть изменил, в средний блок PageBuilder добавил авторесайз.

База данных db.sql в корне сайта
Доступы:
admin
123456

Грядет новый релиз и новые уроки от Dmi3yy , но для ознакомления можно пока и это посмотреть.
  • paic
  • +2
avatar
Качнул я этот сайт (он RC2), поставил на OpenServer — Ok.
Поставил из Экстрас скрип миграции пользователей+обновление, как советует Дима.
Исполнил файлик, который закачивает этот скрипт.
И — ошибка, и Composer update не помогает.

Fatal error: Uncaught Error: Class 'EvolutionCMS\Main\MainServiceProvider' not found in D:\WEB\OpenServer\domains\evo-3.ru\core\src\AbstractLaravel.php
Комментарий отредактирован 2021-01-30 09:16:43 пользователем Aharito
avatar
Качнул я этот сайт (он RC2), поставил на OpenServer — Ok.
Поставил из Экстрас скрип миграции пользователей+обновление, как советует Дима.
Так может надо было сначала 3.0 RC2 обновить до 3.0, а уже потом миграции?
По миграциям пользователей ничего не могу сказать, не тестил, а на тот момент когда в телеграм интересовался этим, сказали что есть, но еще будет правиться.
avatar
Дима говорил, что этот скрипт делает все — пользователей правит, и систему обновляет. То есть отдельно обновлять не надо вроде. Но раз ты не пробовал — ладно, спрошу в телеге.
Комментарий отредактирован 2021-01-30 11:30:29 пользователем Aharito
avatar
Сам разобрался, ошибка была вызвана недостатком опыта с композером, да и информации. Я запускал композер из корневой папки, а надо из core.

То есть, последовательность такая:

1. Развернули сайт, например на RC2
2. Из Экстрас запустили «Migrate 1.4.12 and 2.0.4 to 3.0»
3. Он просто скачивает файлик assets/update.php
4. Мы этот файлик запускаем
5. Он долго чего-то грузит, потом куча ошибок
6. Из консоли переходим в папку core домена
7. Выполняем composer update

И все норм. Пригодится при обновлении с 1.4.х
avatar
Не подскажите, как установить phpthumb?
Комментарий отредактирован 2020-12-18 16:16:40 пользователем nohc
  • nohc
  • 0
avatar
Вместо ManagerManager можно поставить templatesEdit 3
modx.im/blog/kraudfanding/5903.html
кстати, классная штука, вам понраится. По ссылке можно посмотреть видео. В нем же и виджет под ключевые слова.

phpthumb можно и не ставить — он уже вшит в ядро, используется так
<img src="{{ \Helper::phpThumb($image['image'], 'w=800,h=600,zc=1,bg=FFFFFF') }}" alt="">

Но если все же надо, то в Extras его пока нет (Дмитрий обещал, что будет), но можно взять от более ранних версий Evo.
avatar
Спасибо, то что нужно. С контроллерами работать просто удовольствие
avatar
5.1 Чуть подробнее по шаблонам Blade.
Ранее в шаблонах evo какие были инструменты для интеграции? Только чанки, и прописывались они в шаблоне так {{название_чанка}}.

В шаблонах Blade этот арсенал огромный, в том числе и чанки (дополнительные шаблоны), и много чего еще. Реализуется все это с помощью директив.
Рассмотрим некоторые из них на примере шаблонов из тестового сайта base.blade.php и дочернего home.blade.php

В дочернем шаблоне home.blade.php (как и в других) в первой строчке — и первая директива @extends
@extends('layouts.base')

Директива @extends указывает шаблон, откуда происходит унаследование (подключение дочернего шаблона к базовому шаблону).

Дальше идет секция, «обернутая» директивами @section и @endsection.
В секции выводятся знакомые нам longtitle и introtext — сразу и пример, как это делается.

Выводится эта секция в базовый шаблон с помощью директивы @yield в базовом шаблоне. Идентифицируется эта связка по названию, в данном случае hero. Другими словами секция @section('hero') выведется в том месте, где в базовом шаблоне прописан @yield('hero'). Где прописывается секция в дочернем шаблоне – значение не имеет.

В базовом шаблоне тоже могут использоваться директивы @section, но завершаться они должны директивой @show.

В тестовом сайте боковой колонки нет, но можно потренироваться и дописать в базовом шаблоне такую секцию
@section('sidebar')
    <div>Здесь базовые блоки</div>
@show

Тогда в дочерних шаблонах секцию из базового шаблона можно:
1. Подменить, т.е. перезаписать ее содержимое, например, в шаблоне home прописать так
@section('sidebar')
    <div>Здесь блоки для главной</div>
@endsection

И тогда выведется именно это:
<div>Здесь блоки для главной</div>

2. Дополнить с помощью директивы @parent
@section('sidebar')
    @parent
        <div>Здесь блоки для главной</div>
@endsection

И тогда выведется и то, что в базовом шаблоне, и дополнительно то, что в шаблона home:
<div>Здесь базовые блоки</div>
<div>Здесь блоки для главной</div>

3. Проигнорировать, т.е. секцию в дочернем шаблоне не прописывать и она в этом шаблоне с базового шаблона выводиться не будет.

Директива @yield так же может иметь значение по умолчанию, например
@yield('content2', View::make('partials.form.ContactForm'))

В этом случае:
1. Если в дочернем шаблоне создать секцию
@section('content2')
    <section>Здесь содержание секции content2</section>
@endsection

То выведется именно она.

2. Если дочернем шаблоне такую секцию не создавать, то выведется содержимое чанка ContactForm.

Другими словами, в директиве @yield после запятой указывается то, что выводится по умолчанию (дефолтное содержание).

5.2. Чанки
Чанки вставляются в шаблон (как в бвзовый, так и в дочерний) с помощью директивы @include, например
@include('partials.form.ContactForm')

В результате ставится форма из чанка ContactForm.

В чанк также можно передать массив дополнительных данных, как в тестовом сайте в шаблоне home.blade.php вставлен чанк pbcontent для PageBuilder
@include('partials.pagebuilder.pbcontent', ['data'=>$pagebuilder])

5.3. Другие используемые в шаблонах директивы.
В базовом шаблоне прописана такая директива
@stack('scripts')

Это означает, что где-то в других шаблонах могут быть подключены дополнительные скрипты. И они действительно подключаются в шаблоне form.blade.php с помощью директив @push
@push('scripts')
    здесь подключаются дополнительные скрипты
@endpush

5.4. Blade предоставляет так же удобные сокращения для распространенных управляющих конструкций PHP, таких как условные операторы и циклы. Эти сокращения обеспечивают чистый и краткий способ работы с управляющими конструкциями PHP и при этом остаются очень похожими на свои PHP-прообразы.
Это такие как популярные if, switch, foreach и другие.

Примеры реализацию — верхнее меню и хлебные крошки в базовом шаблоне. При этом $topmenu и $crumbs задаются в контроллере, но стилизацию можно делать уже непосредственно в шаблоне blade без создания дополнительных чанков в вызовах сниппетов.
  • paic
  • 0
avatar
Никто не сталкивался, почему может быть не видно из браузера картинки из папок assets/.thumbs и assets/.sgThumbs (я так понял из всех папок, которые начинаются на точку)?
  • nohc
  • 0
avatar
В общем проблема на апаче с опенсервером. Он думает что это скрытая папка. Пришлось переименовать папки кеша, заменил точку на _
avatar
правильней будет сказать — проблема в настройке апача. Обычно встречал конфиг где запрещался доступ к файлам .ht*
<Files ".ht*">
    Require all denied
</Files>
avatar
Еще раз про встроенный авторесайз вида
<img src="{{ \Helper::phpThumb($image['image'], 'w=800,h=600,zc=1,bg=FFFFFF') }}" alt="">

Похоже, он очень прожорливый.
На главной странице — 5 картинок (те что в PageBuilder).

Без авторесайза


На 3 средние картинки (чанк slider.blade.php)подключил авторесайз и при первом открытии страницы после очистки кэш получил

Да оно и визуально видно, что тупит.

Последующие открытия, когда картинки уже из кэш


Вижу что в папке cache формируется 2 комплекта картинок — один в jpg, второй в webp. Под рукой нет ничего от apple, поэтому 2 вопроса:
1. Переключаются ли картинки на jpg, если сайт открыть в браузере, который не поддерживает webp?
2. Где и как можно отключить двойное преобразование, оставив только jpg (надеюсь, и время сократится).
  • paic
  • +1
avatar
Я, когда надо эмулировать какое-то устройство, которого у меня нет, пользуюсь сервисом от browserstack. Там, правда, в бесплатном функционале на каждое устройство всего по минуте дают, но если знаешь, что именно хочешь глянуть, то этого хватает. По опыту тест очень корректный, там такое чувство, что как будто действительно на реальном устройстве код выполняют.
avatar
Для сравнения, при использовании обычного сниппета phpthumb
<img class="is-rounded" src="{{ $modx->runSnippet('phpthumb',[
					'input' => $image['image'], 
					'options' => 'w=800,h=576,zc=1,bg=ffffff',
				])}}" alt="">

Первое открытие страницы


и из кэша
  • paic
  • 0
avatar
9. Обновление.
К концу недели планируется релиз 3.0 RC3. А недавно в ветку 3.х внесены исправления по корректному отображению и выбора типа документа (в адменке вкладка Настройка страницы).

Обновление версии 3 осуществляется через Composer в консоли. Для локалки (Open Server):

9.1. Переходим в папку core, команда
cd domains/evolution-3.ru/core

9.2. Команда на обновление
php artisan make:site update 3.x
и наблюдаем процесс, по времени происходит все очень быстро.
По консоли в Open Server и Composer подробнее выше, п.6.
  • paic
  • 0
avatar
У меня
php artisan make:site update 3.x

не работает, работает стандартная команда из хелпа Артизана
php artisan make:site

Где-то есть еще про формат этой команды специфически для Эво, чтобы указывать, на какую версию обновлять?

UPD: Нет, вру, по команде php artisan make:site обновление не сработало, а вот по команде php artisan make:site update 3.x со второй попытки сработало… магия.
Комментарий отредактирован 2021-01-28 23:18:23 пользователем Aharito
avatar
На 3.0 еще не обновлялся, до этого 2 раза обновлялся без проблем.
Эта команда есть здесь
modx.im/blog/news/6250.html
avatar
Ещё сюрприз: после обновления не могу зайти в админку, всплывает окошко «Вам необходимо подтвердить себя!»
avatar
10. Даты.
Ранее с датами в evo проблем не припомню, и особо ими не интересовался.
А как прикрутить даты, например, к новостям в 3.0?

10.1. Открываем файл базового контроллера и создаем такую функцию
public function globalElements()
    {
    $this->data['dmy'] = [
        'createdon' => $this->evo->parseDocumentSource($this->evo->documentObject['createdon']),
        'publishedon' => $this->evo->parseDocumentSource($this->evo->documentObject['publishedon']),
        'editedon' => $this->evo->parseDocumentSource($this->evo->documentObject['editedon']),
			
        ];
    }

Если пользуетесь тестовым демо-сайтом, там такая функция в файле BaseController.php уже есть, просто добавляем в нее содержимое.
Название переменной (в примере dmy) можете придумать любое, удобное для себя. Главное, чтобы оно не совпадало с зарезервированным.

10.2. Вывести дату можно так
{{ $dmy['createdon'] }}

Но поскольку даты в базе данных хранятся в Unix time, их нужно переформатировать в обычный привычный формат.
Можно это сделать с помощью strftime, например:
{{ strftime('%d %b %Y %H:%M:%S', $dmy['createdon']) }}

или встроенной в Laravel библиотеки Carbon, например:
{{ \Carbon\Carbon::parse($dmy['editedon'])->format('d M Y h:i:s') }}

Все отлично, но на английском языке.
Чтобы даты отображались на русском языке, нужна локализация.

10.3. Локализация.
Открываем файл MainServiceProvider.php и добавляем в class MainServiceProvider extends ServiceProvider функцию
public function boot()
    {
        //setlocale(LC_TIME, 'ru_RU.UTF-8');
		
	setlocale(LC_TIME, 'ru_RU.UTF-8', 'rus_RUS.UTF-8', 'Russian_Russia.UTF-8');
		
        \Carbon\Carbon::setLocale(config('app.locale'));
    }

Поясню, почему закомментировал первую строку, которую обычно всегда и везде рекомендуют. У меня на Open Server она не срабатывала. Но интернет помог, на одном из форумов нашел вариант «на все случаи жизни», включая Open Server на Windows, он и спас. Возможно, на хостинге будет достаточно и первого закомментированного варианта, пока на хостинге не тестил.

10.4. Работа Carbon с локалью.
Нужно заменить метод format на formatLocalized, а учитывая то, что метод formatLocalized использует функцию strftime(), то нужно поменять и параметры, например
{{ \Carbon\Carbon::parse($dmy['publishedon'])->formatLocalized('%d %B %Y %H:%M:%S') }}

Для варианта с strftime больше ничего не надо — после подключения локали будет выводиться на русском языке
{{ strftime('%d %b %Y %H:%M:%S', $dmy['createdon']) }}

10.5. Вывод в чанк для общей страницы новостей, примеры
Дата создания:
{{ strftime('%d %b %Y %H:%M:%S', $item['createdon']) }}
Дата публикации:
{{ strftime('%d %b %Y %H:%M:%S', $item['publishedon']) }}
Дата изменения:
{{ strftime('%d %b %Y %H:%M:%S', $item['editedon']) }}
  • paic
  • 0
avatar
Кстати, а не смотрели, что будет сделано с пользователями, если одинаковые логины/емейлы в версии 1.4.х заведены и для вебюзеров, и для админов? По идее, что-то должно сломаться при обновлении, или нет?
avatar
Это вопрос к разработчикам 3.0. Через месяц планируется официальный релиз и презентация версии, тогда и узнаем.
Насколько я знаю из сообщений в телеграм, на сегодня раздел пользователей еще в разработке. Ни по миграциям веб-пользователей в пользователи, ни по доработкам FormLister для их регистрации и т.п. у меня ясности тоже нет.
avatar
Понял, спасибо. Я просто вижу, что вы успели основательно поразбираться с новой версией, подумал, что вдруг и этот момент тоже прояснился.
avatar
11. SimpleGallery
Небольшой пример по установке фотогалереи.

11.1. Установка.
Устанавливается как обычно из Extras.
Но перед установкой надо внести небольшую правку в файл assets/lib/SimpleTab/plugin.class.php:
в строке 235 вместо
$table = $this->modx->db->config['table_prefix'] . $this->table;

прописать
$table = \EvolutionCMS()->getDatabase()->getConfig('prefix') . $this->table;

Иначе при установке таблица не создастся, а на вкладке с фотогалереей будет такая ошибка


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

11.2. Шаблон blade
В папке views создаем файл шаблона с названием gallery (название берется из псевдонима шаблона в админке), полное название файла должно быть gallery.blade.php.

В папке views/partials сразу же создаем и файл чанка, название можно произвольное, но желательно логичное, например galleryitem.blade.php.

По содержанию файлов — ниже.

11.3. Добавляем в базовый контроллер core/custom/packages/main/src/Controllers/BaseController.php функцию для sgLister функцию, подобную как и для DocLister, поскольку sgLister — это обертка DocLister
public function sgLister($data) {
        $data['saveDLObject'] = '_DL';
        $this->evo->runSnippet('sgLister', $data);
        $_DL = $this->evo->getPlaceholder('_DL');
        $docs = $_DL->docsCollection()->toArray();

        $pages = [];
        if (isset($data['paginate']) && $data['paginate'] != '') {
            $paginator = $_DL->getExtender('paginate');
            $pages = [
                'first' => 1,
                'last' => $paginator->totalPage(),
                'current' => $paginator->currentPage(),
                'total' => $paginator->totalDocs()
            ];
        }
        return [
            'docs'=>$docs,
            'pages' => $pages,
        ];
    }

11.4. Создаем в той же папке, где находится и базовый контроллер, контроллер с названием GalleryController.php — для шаблона gallery.blade.php. Содержимое файла контроллера:
<?php
namespace EvolutionCMS\Main\Controllers;

class GalleryController extends BaseController
{
    public function render()
    {
        $this->data['gallerys'] = $this->sgLister([
            'parents'=>7,
            'display'=>9,
            'paginate'=>'pages',
        ]);
    }
}

Параметры у каждого могут быть свои, а параметр parents — это пагинация.

11.5. Возвращаемся в шаблоны Вlade, папка views.
Пример чанка для демо-сайта:
<div class="column is-4 right-image aos-init" data-aos="fade-left">
    <div class="card-content">
        <div class="content article-body">
	    <img src="{{ $item['sg_image'] }}" alt="{{ $item['sg_title'] }}">
        </div>
    </div>
</div>

Обращаем внимание, как прописывается то, что ранее было плейсхолдерми.

Если нужен авторесайз, то картинка прописывается так
<img src="{{ \Helper::phpThumb($item['sg_image'], 'w=800,h=533,zc=1,bg=FFFFFF') }}" alt="{{ $item['sg_title'] }}">

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

Если нет, то лучше применять обычный сниппет phpthumb.

Пример шаблона для демо-сайта:
@extends('layouts.base')

@section('content')
    <section class="articles">
        <div class="columns">
            <div class="columns is-multiline content article-body">
                @foreach($gallerys['docs'] as $item)
                    @include('partials.galleryitem', ['item'=>$item])
                @endforeach
            </div>
        </div>
	<div class="column is-12">
	    @include('partials.paginate', ['paginate'=>$gallerys['pages']])
	</div>
    </section>
@endsection

Чанк с пагинацией используется уже существующий в демо-сайте (использовался в блоге (новости), новый создавать не надо.

Примечание.
Чанк galleryitem.blade.php можно и не создавать, а сделать все в одном шаблоне, тогда шаблон будет выглядеть так
@extends('layouts.base')

@section('content')
    <section class="articles">
        <div class="columns">
            <div class="columns is-multiline content article-body">
                @foreach($gallerys['docs'] as $item)
		    <div class="column is-4 right-image aos-init" data-aos="fade-left">
			<div class="card-content">
			    <div class="content article-body">
				<img src="{{ $item['sg_image'] }}" alt="{{ $item['sg_title'] }}">
			    </div>
			</div>
		    </div>
                @endforeach
            </div>
        </div>
	<div class="column is-12">
	    @include('partials.paginate', ['paginate'=>$gallerys['pages']])
	</div>
    </section>
@endsection

11.6. Базовый шаблон.
Это файл base.blade.php в папке layouts.
Он на демо-сайте уже есть, и директива @yield('content') для секции @section('content') уже тоже есть.
Поэтому можно переходить на сайт и радоваться фотогалерее.

11.7. Если нужна другая секция, отличная от content.
В этом случае пишем другое название секции, например @section('gallery'), а в базовом шаблоне в нужном месте прописываем директиву @yield('gallery')
  • paic
  • +1
avatar
12. multiTV
В демо-сайте есть пример установки PageBuilder. Очень хороший и функциональный компонент. Тем не менее и старый добрый multiTV не потерял своей актуальности и продолжает активно использоваться.
Дальше будет пример простого и популярного блока «Наши преимущества» на главную страницу.

12.1. Установка.
Устанавливается multiTV на сайт как обычно из Extras.

Дальше создаем TV параметр под названием advantages (название может быть любым) с типом ввода multitv и подключаем его к шаблону главной страницы.

Создаем как и прежде файл конфигурации с названием advantages.config.inc.php. У меня конфигурация такая
$settings['fields'] = array(
	'text' => array(
        'caption' => 'Текст',
        'type' => 'text'
    ),
	'icon' => array(
        'caption' => 'Иконка 40x40px',
        'type' => 'image'
    )
);

И в отличие от стандартного EVO больше ничего в этом файле не делам, на outerTpl и rowTpl не обращаем внимание, они при работе с Laravel не нужны.

12.2. Добавляем в контроллер для главной страницы core/custom/packages/main/src/Controllers/HomeController.php функцию
public function render()
{
    $this->data['multitv'] = json_decode($this->evo->runSnippet('multiTV', ['tvName' => 'advantages', 'toJson' => 1]), true);
}

Если у вас демо-сайт, то в нем такая функция уже есть для PageBuilder, просто дописываем в нее содержимое для multiTV.

12.3. Переходим в шаблон главной страницы home.blade.php и создаем секцию
@section('advantages')
	<div class="columns is-multiline">
        <h2>Преимущества</h2>
		
	@foreach($multitv as $item)
		<div class="column is-2">
			<img src="{{ $item['icon'] }}" alt="{!! $item['text'] !!}">
            <p>{!! $item['text'] !!}</p>
        </div>
	@endforeach
    </div>
@endsection

12.4. Переходим в базовый шаблон base.blade.php и в нужном месте прописываем вывод секции advantages с премуществами
@yield('advantages')
Готово.
  • paic
  • +1
avatar
Можно ещё конвертнуть прямо в шаблоне

@foreach( json_decode($modx->getConfig('client_social'),true) as $one_social )


Где client_social это поле ClientSettings
avatar
Спасибо, материалы у тебя объемные и полезные. Если я не ошибаюсь, ты делал подобный материал по Commerce. Я, как и ты, тоже так и не применял пока 3.х в реальных проектах, и одной из главных причин является несовместимость с Commerce и TemplateEdit3. Как сейчас по поводу работы Commerce нв 3.х? есть новости?
avatar
Делал и по Commerce, и по FormLister для личного кабинета.

По Commerce недавно в телеге Дмитрий сообщал, что его на 3.0 наконец-то подняли, но кроме скриншота ничего пока не было.

А TemplateEdit3 с 3.0 совместим — есть у Дмитрия в видео уроках по 2.0. Хотя я его на 3.0 пока не ставил.
avatar
13. SiteContent
Это здесь
gist.github.com/Dmi3yy/48b153d5ab60e2524e81170d38bf4bcd
Памятуя лозунг «Долой DocLister» выведем ленту новостей не с помощью DocLister, как сейчас сделано на демо-сайте, а посредством SiteContent.

13.1. Наиболее подходящим для этих целей будет этот пример:
Получение всех дочерних документов из документа с ID 2 c TV параметрами
$docs = SiteContent::descendantsOf(2)
            ->withTVs(['tv1','tv2'])
            ->get()
            ->toTree()
            ->toArray();

13.2. Редактируем под наш демо-сайт и размещаем в контроллере для блога
core/custom/packages/main/src/Controllers/BlogController.php
<?php
namespace EvolutionCMS\Main\Controllers;

use EvolutionCMS\Models\SiteContent;

class BlogController extends BaseController
{
    public function render()
    {			
	$this->data['news'] = SiteContent::descendantsOf(2)
				->withTVs(['image'])
				->orderByDate()
				->get()
				->toTree()
				->toArray();
    }
}

Обратите внимание, что надо подключить соответствующую модель.

13.3. Переходим в шаблон вывода новостей views/blog.blade.php и выводим наши новости, шаблон почти ничем не отличается от вывода с помощью DocLister
@extends('layouts.base')

@section('content')
    <section class="articles">
        <div class="columns">11
            <div class="column is-12">
                @foreach($news as $item)
		    @include('partials.newsitem', ['item'=>$item])
                @endforeach
            </div>
        </div>
    </section>
@endsection

Чанк newsitem остался прежним, такой же как был при DocLister, при этом если у вас в чанке есть TV — они должны быть без префиксов.

У меня в демо-сайте 3 новости, и они все успешно вывелись, пока без пагинации. Если пагинация не предусматривается, например, для вывода небольшого каталога услуг, то на этом можно и закончить.

13.4. Пагинация.
Здесь пришлось повозиться, пока не понял, что надо выкинуть «лишнее», иначе встроенный пагинатор Laravel не понимает, а я его научить не смог. После такого редактирования функция в контроллере BlogController стала выглядеть так
public function render()
    {			
	$this->data['news'] = SiteContent::descendantsOf(2)
				->withTVs(['image'])
				->orderByDate()
				->paginate(2);
    }

Где get() заменил на paginate(2) — так задается пагинация, 2 — это количество новостей на странице.
Что такое toTree() и toArray() пока не знаю, просто удалил, т.к. с ними пагинацию вывести не удалось. Надеюсь, кто-то объяснит. Возможно, дальше будут более подробные примеры от непосредственных разработчиков.

13.5. Чанк пагинации. Старый от DocLister уже не подойдет, создаем новый. Для примера я сделал такой несложный
@if ($paginator->lastPage() > 1)
<div class="box pagination-box">
    <nav class="pagination is-centered" role="navigation" aria-label="pagination">
        <a class="pagination-previous" href="{{ $paginator->url(1) }}">Назад</a>
        <a class="pagination-next" href="{{ $paginator->url($paginator->currentPage()+1) }}">Вперед</a>
		<ul class="pagination-list">
		@for ($i = 1; $i <= $paginator->lastPage(); $i++)
		    @if($paginator->currentPage() == $i)
                       <li><a class="pagination-link is-active">{{ $i }}</a></li>
                    @else
                       <li><a class="pagination-link" href="{{ $paginator->url($i) }}">{{ $i }}</a></li>
                    @endif
		@endfor
	</ul>
    </nav>
</div>
@endif

И разместил его в файле views/partials/default.blade.php.
Для реального сайта этот пример надо доработать, особенно в части скрыть дубль ?page=1, что в DocLister уже «из коробки».

Старый чанк pagenate сохранил, он у меня используется в SimpleGallery.

13.6. Вывод пагинации.
В Laravel стандартный вывод пагинации в шаблоне Blade
{{ $news->links() }}

его и добавляем в секцию п.3.3.
@section('content')
    <section class="articles">
        <div class="columns">11
            <div class="column is-12">
                @foreach($news as $item)
		    @include('partials.newsitem', ['item'=>$item])
                @endforeach
            </div>
        </div>
    </section>
	{{ $news->links('partials.default') }}
@endsection

13.7. Другие варианты.
Пагинацию так же можно выводить и так
@include('partials.default', ['paginator' => $news])

Поля в чанке можно выводить и так
{!! $item->introtext !!}

и так
{!! $item['introtext'] !!}

Сам чанк newsitem можно не использовать, а его содержимое перенести непосредственно в шаблон blog.
  • paic
  • 0
avatar
14. Работа с таблицами
Если SiteContent не достаточно, то имеется широкий и удобный инструментарий для работы и с другими таблицами базы данных.

Для примера сделаем вывод фотогалереи без использования сниппета sgLister (установка фотогалереи SimpleGallery для демо-сайта ранее рассмотрена в п.11).

14.1. Создаем (редактируем) контроллер для фотогалереи GalleryController.php
<?php
namespace EvolutionCMS\Main\Controllers;

use Illuminate\Support\Facades\DB;

class GalleryController extends BaseController
{
    public function render()
    {
		$this->data['gallerys'] = DB::table('sg_images')
			->where('sg_rid', 7)
			->orderBy('sg_index','desc')
			->paginate(9);
    }
}

Обращаем внимание на подключение фасада.

В базовом контроллере BaseController.php функцию public function sgLister тоже можно удалить (если была ранее по примеру в п.11).

14.2. Создаем (редактируем) шаблон для фотогалереи gallery.blade.php
@extends('layouts.base')

@section('content')
    <section class="articles">
        <div class="columns">
            <div class="columns is-multiline content article-body">
                @foreach($gallerys as $item)
		<div class="column is-4 right-image aos-init" data-aos="fade-left">
		    <div class="card-content">
			<div class="content article-body">
			    <img src="{{ \Helper::phpThumb($item->sg_image, 'w=800,h=600,zc=1,bg=FFFFFF') }}" alt="{{ $item->sg_title }}">
			</div>
		    </div>
		</div>
                @endforeach
            </div>
        </div>
	<div class="column is-12">
	    {{ $gallerys->links('partials.default') }}
	</div>
    </section>
@endsection

Как видим, пагинация используется та же, что и в предыдущем примере для новостей п.14.
Поля таблицы указываются только в формате {{ $item->sg_title }}.

14.3. Если пагинация не нужна, то в контроллере GalleryController paginate(9) меняем на get(), а в шаблоне удаляем вызов пагинации (иначе будет выдавать ошибку).
Вот, собственно, и все.
  • paic
  • +1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.