├── README.md ├── README_en.md ├── assets ├── chunks │ ├── .gitignore │ └── test.html ├── modules │ ├── .gitignore │ └── module │ │ └── module.php ├── plugins │ ├── .gitignore │ └── examplePlugin.php ├── snippets │ ├── .gitignore │ └── example.php └── tvs │ └── .gitignore ├── composer.json ├── lang └── en │ └── main.php ├── migrations └── example.php ├── public ├── css │ └── example.css └── js │ └── example.js ├── seeders └── ExampleSeeder.php ├── src ├── Console │ ├── .gitignore │ └── ExampleCommand.php ├── Controllers │ ├── .gitignore │ ├── BaseController.php │ ├── ExampleApiController.php │ ├── ExampleController.php │ └── HomeController.php ├── ExampleServiceProvider.php ├── Http │ └── routes.php └── config │ └── example.php └── views └── example.blade.php /README.md: -------------------------------------------------------------------------------- 1 | [English version](README_en.md) 2 | 3 | # Приклад пакету Evolution CMS 3.x 4 | Так як все більше компонентів Laravel в ядрі Evo, то всі основні речі для розробки своїх доповнень так само як у Laravel, тому рекомендую спочатку ознайомитися з: https://laravel.com/docs/11.x/packages 5 | Так само не дуже складно портувати доповнення для Laravel у Evolution CMS, майже завжди це суто косметичні правки та допилювання вже під свої потреби. 6 | 7 | 8 | ## Содержание: 9 | - [Install](#Install) 10 | - [Package structure](#package-structure) 11 | - [Assets](#assets) 12 | - [Chunks](#chunks) 13 | - [Modules](#modules) 14 | - [Plugins](#plugins) 15 | - [Snippets](#snippets) 16 | - [TVs](#tvss) 17 | - [Lang](#lang) 18 | - [Migrations](#migrations) 19 | - [Seeders](#seeders) 20 | - [Public](#public) 21 | - [Views](#views) 22 | - [src](#src) 23 | - [config](#config) 24 | - [Console](#console) 25 | - [Controllers](#controllers) 26 | - [Routes](#routes) 27 | - [Middleware](#middleware) 28 | - [Models](#models) 29 | - [Как опубликовать свой пакет?](#how-publish-own-package) 30 | - [Как мигрировать старые дополнения в EVO 3.0](#how-migrate-old-solution-for-evo-30) 31 | 32 | 33 | ## Install 34 | Виконати з папки **core**: 35 | 1. ```php artisan package:installrequire evolution-cms/example-package "*" ``` - необхідно, щоб пакет був зареєстрований на сайті packagist.org 36 | 37 | 2. ```php artisan vendor:publish --provider="EvolutionCMS\Example\ExampleServiceProvider"``` - якщо використовується копіювання файлів публічних та конфігів 38 | 39 | 3. ```php artisan migrate``` - якщо використовуються міграції 40 | 41 | 4. ```php artisan db:seed --class=ExampleSeeder``` - якщо використовуються сіди 42 | 43 | ## Package structure 44 | Рекомендована структура папок: 45 | 46 | - Assets: для звичної структури, в цілому нам потрібні тільки плагіни та модулі і можна винести в корінь, сніпети та чанки можуть знадобитися тільки для того, щоб мігрувати старі доповнення 47 | - Lang: для мультимовності 48 | - Migrations: для міграцій, загалом це до створення таблиць, але можна робити і інші дії, наприклад через міграції можна створювати шаблони, тв, документи 49 | - Seeders: для заповнення контентом, створення тв, шаблонів 50 | - Public: всі файли, які потрібні публічно, в основному js, css, картинки 51 | - Views: для шаблонів Blade 52 | - src: тут все, що потрапляє в автолоад composer-a 53 | - config: Файли, які містять налаштування 54 | - Console: для консольних команд, які можна запускати через artisan або через cron 55 | - Controllers: тут створюємо контролери 56 | - Http: тут фаїл із кастомним роутингом 57 | - Middleware: створюємо свої Middleware якщо потрібно 58 | - Models: для моделок якщо створюємо якісь таблиці або перевизначаємо роботу вже готових моделей 59 | 60 | Загалом структуру папок пакета можна міняти під себе, цей приклад носить рекомендований характер 61 | 62 | ## Assets 63 | Нижче опис як працювати з тим, що лежить в папці assets 64 | 65 | ### Chunks 66 | Є можливість створювати чанки у файлах, можна глянути тут: assets/chunks/ 67 | 68 | Для того, щоб чанки потрапили в систему потрібно додати до сервісу провайдера в register із завантаження: 69 | ``` 70 | $this->loadChunksFrom( 71 | dirname(__DIR__) . '/assets/chunks/', 72 | $this->namespace 73 | ); 74 | ``` 75 | 76 | Далі можемо використовувати де нам потрібно звертаючись до чанка на ім'я: namespace#chunkname: 77 | ``` 78 | $modx->getChunk('example#test'); 79 | ``` 80 | Також можна чанки складати по папках вкладені: 81 | ``` 82 | $modx->getChunk('example#subdir\test'); 83 | ``` 84 | 85 | Загалом у 3.х використання чанків не має сенсу, тому що це все логічніше і простіше робити через Blade 86 | 87 | 88 | ### Modules 89 | Для того щоб модуль з'явився в Адмінці його потрібно зареєструвати додавши в сервіс провайдері в спосіб register: 90 | ``` 91 | $this->app->registerModule('Module from file', dirname(__DIR__).'/assets/modules/module/module.php'); 92 | ``` 93 | ID модуля це **md5('Назва модуля')** - це дасть можливість зробити посилання на модуль, тому що модуль не створюється в базі і відповідно до цифрового id у нього немає. 94 | 95 | ### Plugins 96 | Плагіни також можна створювати у файлах і їх потрібно реєструвати в сервіс-провайдері: 97 | ``` 98 | //this code work for add plugins to Evo 99 | $this->loadPluginsFrom( 100 | dirname(__DIR__) . '/assets/plugins/' 101 | ); 102 | ``` 103 | Приклад можна глянути тут: assets/plugins/ 104 | 105 | ### Snippets 106 | Сніпети також можна створювати у файлах і їх потрібно реєструвати в сервіс-провайдері: 107 | ``` 108 | $this->loadSnippetsFrom( 109 | dirname(__DIR__). '/assets//snippets/', 110 | $this->namespace 111 | ); 112 | ``` 113 | Приклад можна глянути тут: example/snippets/ 114 | 115 | Якщо використовується namespace в пакеті, то назву сніпета необхідно писати так само з ним: namespace#snippetname: 116 | ``` 117 | evo()->runSnippet('example#test'); 118 | ``` 119 | Також можна використовувати вкладені сніпети: 120 | ``` 121 | evo()->runSnippet('example#subdir\test'); 122 | ``` 123 | Сніпети так само як і чанки не рекомендую для використання, тому що куди логічніше всю необхідну логіку вже писати в Контролерах 124 | 125 | ### TVs 126 | Як правильно створювати ТВ можна глянути у цьому простому прикладі: https://github.com/extras-evolution/choiceTV/ 127 | Назва tv має бути за шаблоном: 128 | ```tvs/TVName/TVName.customtv.php``` 129 | 130 | У рамках Evo 3.х та пакету вирішуємо питання просто переміщенням папки з кастомним ТВ у потрібну папку через додавання інструкції до сервіс-провайдера: 131 | ```html 132 | $this->publishes([__DIR__ . '/../assets/tvs/TVName' => public_path('assets/tvs/TVName')]); 133 | ``` 134 | Далі після запуску команди **artisan vendor:publish** та вибору вказаного пакету всі файли скопіюються та все буде працювати 135 | 136 | ## Lang 137 | Додаємо до сервіс провайдера boot() 138 | ```php 139 | $this->loadTranslationsFrom(__DIR__.'/../lang', 'Main'); 140 | ``` 141 | Посилання на те, звідки брати переклади і який у них namespace. 142 | Далі в папці створюємо папки з мовами (en, ru, ітд.) і в них уже файли з перекладами 143 | 144 | Після цього можемо використовувати в Blade: 145 | ```@lang('Main::main.welcome')``` 146 | 147 | 148 | ## Migrations 149 | посилання на ті, звідки брати переклади і який у них namespace. 150 | Далі в папці створюємо папки з мовами (en, ru, ітд.) і в них уже файли з перекладами 151 | 152 | Після цього можемо використовувати Blade: 153 | ```$this->loadMigrationsFrom(__DIR__ . '/../migrations');``` 154 | 155 | Після встановлення доповнення виконуємо команду ```php artisan migrate``` 156 | 157 | 158 | ## Seeders 159 | Створюємо сід у папці seeders, додаємо запис про перенесення до сервіс-провайдера: 160 | ```$this->publishes([__DIR__ . '/../seeders' => EVO_CORE_PATH . 'database/seeders']);``` 161 | 162 | Після встановлення доповнення виконуємо команду ```php artisan db:seed --class=ExampleSeeder``` 163 | 164 | 165 | ## Public 166 | Ця папка містить все, що потрібно для фронтової частини: css, js, images. 167 | 168 | Додаємо в сервіс-провайдері запис про те, що нам потрібно перенести: 169 | ```php 170 | $this->publishes([__DIR__ . '/../public' => public_path('assets/vendor/example')]); 171 | ``` 172 | А в BLade вже прописуємо шляхи згідно з тим, куди файли будуть переміщені, для їх переміщення використовується команда **artisan vendor:publish** 173 | 174 | Більше інформації можна знайти тут: https://laravel.com/docs/11.x/packages#public-assets 175 | 176 | ## Views 177 | Додаємо в сервіс провайдер boot: 178 | ```php 179 | $this->loadViewsFrom(__DIR__ . '/../views', 'Main'); 180 | ``` 181 | Після чого ми можемо використовувати шаблони Blade з урахуванням неймспейсів: 182 | ```php 183 | return \View::make('Main::example', ['data'=>'1']); 184 | ``` 185 | Якщо нам потрібно внести зміни в шаблон blade то створюємо фаїл в основному місці **views** створивши там папку **vendor** і в ній папку з назвою пакету: 186 | ```/views/vendor/example/example.blade.php``` 187 | 188 | Так само планується завжди зміни базових шаблонів з пакета, то можна відразу перенести їх у потрібне місце: 189 | ```php 190 | $this->publishes([__DIR__.'/../views' => public_path('views/vendor/example')]); 191 | ``` 192 | Детальніше читаємо в документації Laravel: https://laravel.com/docs/11.x/packages#views 193 | 194 | 195 | ## src 196 | У цій папці у нас лежить всі файли які потрапляють в автолоад composer-а, в цілому це так само можна змінити якщо потрібно у файлі composer.json 197 | 198 | ### config 199 | Робота з конфігами така ж як у Laravel: 200 | - https://laravel.com/docs/11.x/packages#configuration 201 | - https://laravel.com/docs/11.x/packages#default-package-configuration 202 | 203 | Ми можемо створити для пакета свої налаштування і після них додати в системні, щоб їх можна було змінювати. 204 | 205 | ### Console 206 | Artisan – це інтерфейс командного рядка, включений до Evolutions CMS. Він надає ряд корисних команд, які можуть допомогти вам при створенні програми. Детальнішу інформацію ви можете знайти тут: https://laravel.com/docs/11.x/artisan 207 | 208 | #### Как использовать Artisan: 209 | запустити **php artisan** із папки **core**: 210 | ```console 211 | php artisan 212 | ``` 213 | для того, щоб побачити всі команди 214 | 215 | #### Как создать свою консольную команду: 216 | Створюємо файл: **core/custom/packages/example/src/Console/ExampleCommand.php** 217 | ``` 218 | evo = EvolutionCMS(); 234 | } 235 | 236 | public function handle() 237 | { 238 | echo 'Hello Word'; 239 | } 240 | } 241 | ``` 242 | Додаємо до сервіс провайдера: **core/custom/packages/example/src/ExampleServiceProvider.php** 243 | ``` 244 | //добавить после строки: protected $namespace 245 | protected $commands = [ 246 | 'EvolutionCMS\Example\Console\ExampleCommand', 247 | ]; 248 | ``` 249 | 250 | Також у методі register нашого сервісу провайдера вказуємо: 251 | ```php 252 | //регистрация команд для artisan 253 | $this->commands($this->commands); 254 | ``` 255 | 256 | Тепер можна використати: 257 | ```php artisan example:examplecommand``` 258 | 259 | Даний функціонал зручний для завдань які необхідно виконувати по крону або довгі і простіше через консоль щоб не було лімітів на час виконання, які зазвичай є якщо виконуємо якісь роботи через браузер. 260 | 261 | ### Controllers 262 | Контролери створюємо у папці src/Controllers 263 | Можна переглянути приклади, які є в поточному пакеті. 264 | 265 | Контролери набагато зручніше у використанні ніж сніпети для основної роботи. Але думаю ті хто вже дійшов до OOP та MVC розуміють навіщо це треба якщо ні то гуглим OOP, MVC та вивчаємо 266 | 267 | ### Routes 268 | Для використання кастомних роутингів (наприклад ajax відповіді) додаємо в сервіс-провайдер boot(): 269 | ```php 270 | include(__DIR__.'/Http/routes.php'); 271 | ``` 272 | Як працювати з роутингом читаємо тут: https://laravel.com/docs/11.x/routing 273 | Також рекомендую ознайомитися з цим прикладом у якому створюємо форму і відправляємо її: https://gist.github.com/Dmi3yy/10e5a004bb77a72a4446ac1ad4c2d9ad 274 | 275 | ### Middleware 276 | Якщо ви розумієте, що таке Middleware то і знаєте як з ними працювати :) 277 | Детальніше читаємо тут: 278 | https://laravel.com/docs/11.x/middleware 279 | 280 | Із системних на даний момент є CheckAuthToken: https://github.com/evolution-cms/evolution/blob/3.x/core/src/Middleware/CheckAuthToken.php (удобно использовать если дружим EVO 3.0 c SPA) 281 | 282 | ```php 283 | Route::middleware(['EvolutionCMS\\Middleware\\CheckAuthToken'])->group(function () { 284 | Route::get('/secureuserinfo', [EvolutionCMS\Example\Controllers\ExampleApiController::class, '`getInfo`']); 285 | }); 286 | ``` 287 | 288 | ### Models 289 | Модельки складаємо до папки: ***src/Models*** 290 | Можна проглянути які вже є моделі в Evo за замовчуванням: https://github.com/evolution-cms/evolution/tree/3.x/core/src/Models 291 | all works same https://laravel.com/docs/11.x/eloquent 292 | 293 | 294 | ## How Publish own package 295 | Опублікувати для того щоб можна було знайти в консольному extras який з'явився в evo 3.0, зробили так що б можна було скриптами налаштовувати установку EVO c будь-яким набором доповнень без ручного додавання цих. 296 | 297 | 1. Створюємо пакет на Github (можна клонувати поточний), використовуємо префікс *evocms-* у назві пакета, або щонайменше пишемо **Evocms** у файлі composer.json у тегу description. Це допоможе знайти всі пакети, які доступні для встановлення через Composer і зроблені для Evolution CMS https://packagist.org/?query=evocms 298 | 2. Реєструємо на сайті https://packagist.org (загалом це працює для будь-якого php рішення) 299 | 3. Пишемо мені лист на пошту dmi3yy@evo.im якщо хочете, щоб доповнення було доступне **Evo artisan Extras**: 300 | я сколоную в один з репозиторіїв для того, щоб було зручніше стежити і доповнювати: 301 | - https://github.com/evolution-cms-extras - використовується для готових до використання компонентів 302 | - https://github.com/evolution-cms-packages - використовуються як заготовки для того, щоб далі на базі них створювати сайт 303 | 304 | Активних авторів запрошуватиму до команди evolution-cms-extras та evolution-cms-packages щоб самі могли доповнювати та розвивати доповнення. 305 | 306 | ## Як старі доповнення адаптувати під EVO 3.x 307 | Загалом вивчивши дані приклад, ви вже повинні розуміти як це зробити. 308 | 309 | Але якщо ви хочете зробити все швидко, але халтурно щоб доповнення з'явилося в [Evo artisan Extras](https://github.com/evolution-cms-extras) то найпростіше глянути як я мігрував DocLister: 310 | 311 | 1. Створив composer.json фаїл: https://github.com/evolution-cms-extras/DocLister/blob/master/composer.json 312 | 2. Створив сервіс провайдер: https://github.com/evolution-cms-extras/DocLister/blob/master/src/DocListerServiceProvider.php 313 | 3. Переніс з папки інстал сніпети в пакет так що б вони відразу працювали (тут важливо, щоб пакет був з порожнім namespace): https://github.com/evolution-cms-extras/DocLister/tree/master/snippets 314 | 4. Опублікував пакет як описано вище: [Publish package](#how-publish-own-package) 315 | 316 | Все тепер можна встановлювати пакет і використовувати його. -------------------------------------------------------------------------------- /README_en.md: -------------------------------------------------------------------------------- 1 | # Example package for Evolution CMS 3.x 2 | Since most Laravel components are already in the core of Evolution CMS, it is logical to write additions for Evolution CMS according to the rules of Laravel: https://laravel.com/docs/8.x/packages 3 | Most Laravel packages can be easy migrate to Evolution CMS. 4 | 5 | ## Contents: 6 | - [Install](#Install) 7 | - [Package structure](#package-structure) 8 | - [Assets](#assets) 9 | - [Chunks](#chunks) 10 | - [Modules](#modules) 11 | - [Plugins](#plugins) 12 | - [Snippets](#snippets) 13 | - [TVs](#tvss) 14 | - [Lang](#lang) 15 | - [Migrations](#migrations) 16 | - [Public](#public) 17 | - [Views](#views) 18 | - [src](#src) 19 | - [config](#config) 20 | - [Console](#console) 21 | - [Controllers](#controllers) 22 | - [Routes](#routes) 23 | - [Middleware](#middleware) 24 | - [Models](#models) 25 | - [How Publish own package?](#how-publish-own-package) 26 | - [How Migrate old solution for EVO 3.0](#how-migrate-old-solution-for-evo-30) 27 | 28 | 29 | ## Install 30 | Run in you **core** folder: 31 | 1. ```php artisan package:installrequire evolution-cms/example-package "*" ``` 32 | 33 | 2. ```php artisan vendor:publish --provider="EvolutionCMS\Example\ExampleServiceProvider"``` - если используется копирование файлов публичных и конфигов 34 | 35 | 3. ```php artisan migrate``` - если используются миграции 36 | 37 | ## Package structure 38 | This structure recommended for use, but you can use any what you want. 39 | 40 | - Assets: folder for files what connected 41 | 42 | 43 | 44 | ## Assets 45 | Used for convenience when migrating from older versions and for a more familiar naming and location of elements. 46 | 47 | ### Chunks 48 | You can create chunks from files: 49 | ``` 50 | $this->loadChunksFrom( 51 | dirname(__DIR__) . '/assets/chunks/', 52 | $this->namespace 53 | ); 54 | ``` 55 | in file core/custom/packages/example/ExampleServiceProvider.php you can see how this work 56 | 57 | See sample of chunks in folder: core/custom/packages/example/assets/chunks/ 58 | 59 | If you use package with namespace you need write snippet like: namespace#chunkname: 60 | ``` 61 | $modx->getChunk('example#test'); 62 | ``` 63 | You can use subdir, put chunk file in subdir after that call: 64 | ``` 65 | $modx->getChunk('example#subdir\test'); 66 | ``` 67 | 68 | ### Modules 69 | You can create module from files, without adding in manager panel: 70 | ``` 71 | $this->app->registerModule('Module from file', dirname(__DIR__).'/assets/modules/module/module.php'); 72 | ``` 73 | in file core/custom/packages/example/ExampleServiceProvider.php you can see how this work 74 | 75 | ### Plugins 76 | You can create plugins from files: 77 | ``` 78 | //this code work for add plugins to Evo 79 | $this->loadPluginsFrom( 80 | dirname(__DIR__) . '/assets/plugins/' 81 | ); 82 | ``` 83 | in file core/custom/packages/example/ExampleServiceProvider.php you can see how this work 84 | 85 | See sample of plugins in folder: core/custom/packages/example/assets/plugins/ 86 | 87 | ### Snippets 88 | You can create snippets from files: 89 | ``` 90 | $this->loadSnippetsFrom( 91 | dirname(__DIR__). '/assets//snippets/', 92 | $this->namespace 93 | ); 94 | ``` 95 | in file core/custom/packages/example/ExampleServiceProvider.php you can see how this work 96 | 97 | See sample of snippets in folder: core/custom/packages/example/snippets/ 98 | 99 | If you use package with namespace you need write snippet like: namespace#snippetname: 100 | ``` 101 | $modx->runSnippet('example#test'); 102 | ``` 103 | You can use subdir, put snippet file in subdir after that call: 104 | ``` 105 | $modx->runSnippet('example#subdir\test'); 106 | ``` 107 | 108 | ### TVs 109 | Create folder and files similar https://github.com/extras-evolution/choiceTV/: 110 | ```tvs/TVName/TVName.customtv.php``` 111 | with all logic what you need and add rules for publications: 112 | 113 | ```html 114 | $this->publishes([__DIR__ . '/../assets/tvs' => public_path('assets/tvs')]); 115 | ``` 116 | after public with artisan public:vendor all will work 117 | 118 | ## Lang 119 | Add in Service Provider in boot() 120 | ```php 121 | $this->loadTranslationsFrom(__DIR__.'/../lang', 'example'); 122 | ``` 123 | in Folder lang you need folders for langs like: en, ru, etc. and in folder php file with translations: 124 | 125 | After that you can use: 126 | ```@lang('example::main.welcome')``` 127 | 128 | 129 | ## Migrations 130 | All work like in Laravel https://laravel.com/docs/8.x/migrations 131 | Put file with migration for package in folder migrations and set in Service Provider: 132 | ```$this->loadMigrationsFrom(__DIR__ . '/../migrations');``` 133 | 134 | When you install package, need run from **core** folder ```php artisan migrate``` 135 | 136 | 137 | ## Public 138 | This folder contains all file what need use for frontend, like css, js, images. 139 | 140 | All file will move to assets folders when you run artisan publish:vendor command. 141 | For set what files you can move and where uses laravel functions in Service Provider: 142 | ```php 143 | $this->publishes([__DIR__ . '/../public' => public_path('assets/vendor/example')]); 144 | ``` 145 | More info you can find here: https://laravel.com/docs/8.x/packages#public-assets 146 | 147 | ## Views 148 | Add to Service Provider boot: 149 | ```php 150 | $this->loadViewsFrom(__DIR__ . '/../views', 'example'); 151 | ``` 152 | Now you can use views with namespace: 153 | ```php 154 | return \View::make('example::example', ['data'=>'1']); 155 | ``` 156 | If need overriding package views, you can put view file to path: 157 | ```/views/vendor/example/example.blade.php``` 158 | 159 | And if you publish views you can do that with this code in Service Provider boot: 160 | ```php 161 | $this->publishes([__DIR__.'/../views' => public_path('views/vendor/example')]); 162 | ``` 163 | Full information you can read here: https://laravel.com/docs/8.x/packages#views 164 | 165 | 166 | ## src 167 | In this place put all code what need be autoloaded with composer 168 | 169 | ### config 170 | Read Laravel docs: 171 | - https://laravel.com/docs/8.x/packages#configuration 172 | - https://laravel.com/docs/8.x/packages#default-package-configuration 173 | 174 | ### Console 175 | Artisan is the command-line interface included in Evolutions CMS. It provides a number of helpful commands that can assist you while you build your application. More info you can find here: https://laravel.com/docs/8.x/artisan 176 | 177 | #### How use artisan: 178 | run **artisan** from **core** folder: 179 | ```console 180 | php artisan 181 | ``` 182 | for see all Available commands 183 | 184 | #### How Create console command: 185 | Also you can add own artisan commands: 186 | create file: **core/custom/packages/example/src/Console/ExampleCommand.php** 187 | ``` 188 | evo = EvolutionCMS(); 204 | } 205 | 206 | public function handle() 207 | { 208 | echo 'Hello Word'; 209 | } 210 | } 211 | ``` 212 | add in file: **core/custom/packages/example/src/ExampleServiceProvider.php** 213 | ``` 214 | //add after line: protected $namespace 215 | protected $commands = [ 216 | 'EvolutionCMS\Example\Console\ExampleCommand', 217 | ]; 218 | ``` 219 | 220 | Also in the registration method of our notification provider service: 221 | ```php 222 | //registering commands for artisan 223 | $this->commands($this->commands); 224 | ``` 225 | 226 | Now you can use: 227 | ```php artisan example:examplecommand``` 228 | 229 | 230 | ### Controllers 231 | Put Controllers in src/Controllers 232 | for sample see in code. 233 | 234 | 235 | ### Routes 236 | If your package contains routes, you may load them using this code in ServiceProvider boot(): 237 | ```php 238 | include(__DIR__.'/Http/routes.php'); 239 | ``` 240 | How work with routes, you can read here: https://laravel.com/docs/8.x/routing 241 | 242 | ### Middleware 243 | You can put Middleware in folder src/Middleware and use that 244 | https://laravel.com/docs/8.x/middleware 245 | 246 | In Evolution CMS exist Middleware for check user auth token https://github.com/evolution-cms/evolution/blob/3.x/core/src/Middleware/CheckAuthToken.php: 247 | 248 | ```php 249 | Route::middleware(['EvolutionCMS\\Middleware\\CheckAuthToken'])->group(function () { 250 | Route::get('/secureuserinfo', [EvolutionCMS\Example\Controllers\ExampleApiController::class, '`getInfo`']); 251 | }); 252 | ``` 253 | 254 | 255 | ### Models 256 | place for Models in your package: ***src/Models*** 257 | All default tables already have Models you can see here: **/core/src/Models/** 258 | all works same https://laravel.com/docs/6.0/eloquent 259 | 260 | p.s. after add some new Models need run composer upd 261 | 262 | 263 | 264 | ## How Publish own package 265 | 1. Create own package on github (you can clone this for that), use prefix *evocms-* in package name, or write Evocms in file composer.json description tag. This help find all packages on https://packagist.org/?query=evocms 266 | 2. Register own package on https://packagist.org (need for use with composer) 267 | 3. Write me dmi3yy@evo.im if you want add your package to **Evo artisan Extras**: 268 | - https://github.com/evolution-cms-extras 269 | - https://github.com/evolution-cms-packages 270 | 271 | 272 | 273 | ## How Migrate old solution for EVO 3.0 274 | This sample package build for that, you can fully rewrite for new rules. 275 | 276 | ### But you can do fast migrate for use in [Evo artisan Extras](https://github.com/evolution-cms-extras) 277 | 278 | 279 | 1. Create composer.json file, sample: https://github.com/evolution-cms-extras/DocLister/blob/master/composer.json 280 | 2. Create and set Service provider, sample: https://github.com/evolution-cms-extras/DocLister/blob/master/src/DocListerServiceProvider.php 281 | 3. Move plugins,snippets,chunks from install to folder in package, sample: https://github.com/evolution-cms-extras/DocLister/tree/master/snippets 282 | 4. [Publish package](#how-publish-own-package) 283 | 284 | 285 | -------------------------------------------------------------------------------- /assets/chunks/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore -------------------------------------------------------------------------------- /assets/chunks/test.html: -------------------------------------------------------------------------------- 1 | Example chunk, no recommended for use in Evo 3.0. 2 | Better use Blade, but can be useful for quickly transferring old add-ons and when updating the site from old version 3 | -------------------------------------------------------------------------------- /assets/modules/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore -------------------------------------------------------------------------------- /assets/modules/module/module.php: -------------------------------------------------------------------------------- 1 | Hello Evo events.

'; 5 | }); 6 | 7 | 8 | -------------------------------------------------------------------------------- /assets/snippets/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore -------------------------------------------------------------------------------- /assets/snippets/example.php: -------------------------------------------------------------------------------- 1 | getChunk('example#test'); -------------------------------------------------------------------------------- /assets/tvs/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "evolution-cms/example-package", 3 | "license": "GPL-2.0", 4 | "type": "EvolutionCMS-Package", 5 | "authors": [ 6 | { 7 | "name": "Lukianenko Dmytro", 8 | "email": "dmi3yy@gmail.com" 9 | }, 10 | { 11 | "name": "Serhii Korneliuk", 12 | "email": "info@seigerit.com" 13 | } 14 | ], 15 | "require": { 16 | }, 17 | "autoload": { 18 | "psr-4": { 19 | "EvolutionCMS\\Example\\": "src" 20 | } 21 | }, 22 | "extra": { 23 | "laravel": { 24 | "providers": [ 25 | "EvolutionCMS\\Example\\ExampleServiceProvider" 26 | ] 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lang/en/main.php: -------------------------------------------------------------------------------- 1 | 'Welcome!', 4 | ]; -------------------------------------------------------------------------------- /migrations/example.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('airline'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::drop('flights'); 32 | } 33 | } -------------------------------------------------------------------------------- /public/css/example.css: -------------------------------------------------------------------------------- 1 | body {margin: 50px} -------------------------------------------------------------------------------- /public/js/example.js: -------------------------------------------------------------------------------- 1 | console.log (1); -------------------------------------------------------------------------------- /seeders/ExampleSeeder.php: -------------------------------------------------------------------------------- 1 | getTemplateVars(); 13 | $templates = $this->getTemplates(); 14 | 15 | foreach ($templateVars as $name => $data) { 16 | // создаем (либо обновляем, если существует) тв-параметр 17 | $tv = SiteTmplvar::updateOrCreate(['name' => $name], $data); 18 | 19 | // привязываем к шаблонам 20 | foreach ($templates as $tplid) { 21 | SiteTmplvarTemplate::updateOrCreate([ 22 | 'tmplvarid' => $tv->id, 23 | 'templateid' => $tplid, 24 | ]); 25 | } 26 | } 27 | } 28 | 29 | protected function getTemplateVars() 30 | { 31 | return [ 32 | 'price' => [ 33 | 'type' => 'text', 34 | 'caption' => 'Цена', 35 | ], 36 | 'image' => [ 37 | 'type' => 'image', 38 | 'caption' => 'Изображение', 39 | ], 40 | ]; 41 | } 42 | 43 | protected function getTemplates() 44 | { 45 | return SiteTemplate::all() 46 | ->pluck('id', 'templatealias') 47 | ->toArray(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/Console/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore -------------------------------------------------------------------------------- /src/Console/ExampleCommand.php: -------------------------------------------------------------------------------- 1 | evo = EvolutionCMS(); 16 | } 17 | 18 | public function handle() 19 | { 20 | echo 'Hello Word'; 21 | } 22 | } -------------------------------------------------------------------------------- /src/Controllers/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore -------------------------------------------------------------------------------- /src/Controllers/BaseController.php: -------------------------------------------------------------------------------- 1 | evo = evo(); 13 | ksort($_GET); 14 | $cacheid = sha1(json_encode($_GET)); 15 | if ($this->evo->getConfig('enable_cache')) { 16 | $this->data = Cache::rememberForever($cacheid, function () { 17 | $this->globalElements(); 18 | $this->render(); 19 | return $this->data; 20 | }); 21 | } else { 22 | $this->globalElements(); 23 | $this->render(); 24 | } 25 | $this->noCacheRender(); 26 | $this->sendToView(); 27 | } 28 | 29 | public function render() 30 | { 31 | // Here Code to be cached 32 | } 33 | 34 | public function noCacheRender() 35 | { 36 | // Here Code that will not be cached 37 | } 38 | 39 | public function globalElements() 40 | { 41 | // Here Code that will be available globally to all child controllers 42 | } 43 | 44 | public function sendToView() 45 | { 46 | $this->evo->addDataToView($this->data); 47 | } 48 | } -------------------------------------------------------------------------------- /src/Controllers/ExampleApiController.php: -------------------------------------------------------------------------------- 1 | orderBy('pagetitle', 'asc') 15 | ->get(); 16 | return $docs; 17 | } 18 | 19 | public function getInfo() 20 | { 21 | return \Response::json($this->getDocuments()); 22 | } 23 | } -------------------------------------------------------------------------------- /src/Controllers/ExampleController.php: -------------------------------------------------------------------------------- 1 | data['test'] = 'test'; 11 | } 12 | } -------------------------------------------------------------------------------- /src/Controllers/HomeController.php: -------------------------------------------------------------------------------- 1 | loadMigrationsFrom(__DIR__ . '/../migrations'); 32 | 33 | // Custom Views 34 | $this->loadViewsFrom(__DIR__ . '/../views', 'example'); 35 | 36 | // Seeders 37 | $this->publishes([__DIR__ . '/../seeders' => EVO_CORE_PATH . 'database/seeders']); 38 | 39 | // For publish css,js,img files 40 | $this->publishes([__DIR__ . '/../public' => public_path('assets/vendor/example')]); 41 | 42 | // For use config 43 | $this->publishes([__DIR__ . '/config/example.php' => config_path('example.php', true)]); 44 | 45 | // MultiLang 46 | $this->loadTranslationsFrom(__DIR__.'/../lang', 'example'); 47 | //\Lang::addNamespace('example', __DIR__.'/../lang'); 48 | } 49 | 50 | /** 51 | * Register the service provider. 52 | * 53 | * @return void 54 | */ 55 | 56 | public function register() 57 | { 58 | // Registering commands for artisan 59 | $this->commands($this->commands); 60 | 61 | $this->loadSnippetsFrom( 62 | dirname(__DIR__). 'assets/snippets/', 63 | $this->namespace 64 | ); 65 | 66 | $this->loadChunksFrom( 67 | dirname(__DIR__) . 'assets/chunks/', 68 | $this->namespace 69 | ); 70 | 71 | $this->loadPluginsFrom( 72 | dirname(__DIR__) . 'assets/plugins/' 73 | ); 74 | 75 | //use this code for each module what you want add 76 | $this->app->registerModule( 77 | 'module from file', 78 | dirname(__DIR__).'assets/modules/module/module.php' 79 | ); 80 | } 81 | } -------------------------------------------------------------------------------- /src/Http/routes.php: -------------------------------------------------------------------------------- 1 | '1']); 11 | 12 | }); -------------------------------------------------------------------------------- /src/config/example.php: -------------------------------------------------------------------------------- 1 | 'value_1', 4 | 'exampl_param2' => 'value_2', 5 | ]; -------------------------------------------------------------------------------- /views/example.blade.php: -------------------------------------------------------------------------------- 1 |

Example

2 | {!! dump($data) !!} 3 | --------------------------------------------------------------------------------