├── .gitignore
├── .idea
└── .gitignore
├── LICENSE
├── README.md
├── _convert
├── README.md
├── config.php
├── lng
│ ├── en
│ │ ├── _sidebar.json
│ │ ├── configuration.json
│ │ └── installation.json
│ └── ru
│ │ ├── _sidebar.json
│ │ ├── configuration.json
│ │ └── installation.json
├── parse.php
├── preg_matcher.php
└── template
│ ├── _sidebar.md
│ ├── configuration.md
│ └── installation.md
└── docs
├── _config.yml
├── _sidebar.md
├── en
├── README.md
├── _navbar.md
├── _sidebar.md
├── authentication.md
├── configuration.md
├── form-element.md
├── global.md
├── installation.md
├── releases.md
└── update.md
├── index.html
├── index.md
└── ru
├── README.md
├── _navbar.md
├── _sidebar.md
├── alerts.md
├── assets.md
├── authentication.md
├── changelog.md
├── columnfilters.md
├── columns.md
├── columns_editable.md
├── configuration.md
├── displays.md
├── extend.md
├── fast_start.md
├── filters.md
├── form-element.md
├── form.md
├── global.md
├── html_attributes.md
├── image_upload.md
├── installation.md
├── javascript.md
├── localization.md
├── menu_configuration.md
├── model_configuration.md
├── model_configuration_section.md
├── releases.md
├── routes_configuration.md
├── update.md
└── widgets.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### JetBrains template
3 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
4 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
5 |
6 | # User-specific stuff
7 | .idea/**/workspace.xml
8 | .idea/**/tasks.xml
9 | .idea/**/usage.statistics.xml
10 | .idea/**/dictionaries
11 | .idea/**/shelf
12 |
13 | # Sensitive or high-churn files
14 | .idea/**/dataSources/
15 | .idea/**/dataSources.ids
16 | .idea/**/dataSources.local.xml
17 | .idea/**/sqlDataSources.xml
18 | .idea/**/dynamic.xml
19 | .idea/**/uiDesigner.xml
20 | .idea/**/dbnavigator.xml
21 |
22 | # Gradle
23 | .idea/**/gradle.xml
24 | .idea/**/libraries
25 |
26 | # Gradle and Maven with auto-import
27 | # When using Gradle or Maven with auto-import, you should exclude module files,
28 | # since they will be recreated, and may cause churn. Uncomment if using
29 | # auto-import.
30 | # .idea/modules.xml
31 | # .idea/*.iml
32 | # .idea/modules
33 |
34 | # CMake
35 | cmake-build-*/
36 |
37 | # Mongo Explorer plugin
38 | .idea/**/mongoSettings.xml
39 |
40 | # File-based project format
41 | *.iws
42 |
43 | # IntelliJ
44 | out/
45 |
46 | # mpeltonen/sbt-idea plugin
47 | .idea_modules/
48 |
49 | # JIRA plugin
50 | atlassian-ide-plugin.xml
51 |
52 | # Cursive Clojure plugin
53 | .idea/replstate.xml
54 |
55 | # Crashlytics plugin (for Android Studio and IntelliJ)
56 | com_crashlytics_export_strings.xml
57 | crashlytics.properties
58 | crashlytics-build.properties
59 | fabric.properties
60 |
61 | # Editor-based Rest Client
62 | .idea/httpRequests
63 | /.idea/php.xml
64 | /.idea/docs.iml
65 | /.idea/encodings.xml
66 | /.idea/misc.xml
67 | /.idea/modules.xml
68 | /.idea/inspectionProfiles/Project_Default.xml
69 | /.idea/vcs.xml
70 |
71 | #_convert
72 | /_convert/output
73 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2018 Laravel Framework Russian Community
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SleepingOwl Admin Documentation
2 |
3 | * [Русска версия](https://sleepingowladmin.ru/#/ru/)
4 | * [English version](https://sleepingowladmin.ru/#/en/)
5 |
6 | * [Русска версия NEW](/docs/ru/#/)
7 | * [Русска версия NEW](/docs/en/#/)
8 |
9 |
10 | ## Package translate status
11 | [Transifex](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/main/)
12 | - en - 100%
13 | - ru - 100% (General)
14 | - fr - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#fr/main)
15 | - de - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#de/main)
16 | - hi - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#hi/main)
17 | - it - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#it/main)
18 | - ja - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#ja/main)
19 | - ko - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#ko/main)
20 | - pt_BR - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#pt_BR/main)
21 | - sk - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#sk/main)
22 | - es - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#es/main)
23 | - tr - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#tr/main)
24 | - uk - 0% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#uk/main)
25 | - zh_CN - 100% [Help/edit translate](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/translate/#zh_CN/main)
26 |
27 | If you want to add a language pack for the administrative panel or for documentation, write in the [Support Team](https://t.me/sleeping_owl) or [Daan](https://t.me/neodaan)
28 |
29 |
30 | ## Documentation status
31 | * [x] - installation (Install)
32 | * [ ] - fast_start (Fast start)
33 | * [x] - configuration (Configuration)
34 | * [x] - global (System Description)
35 | * [ ] - update (Update guide)
36 | * [ ] - authentication (Authentication)
37 | * [ ] - routes_configuration (Routes Configuration)
38 | * [ ] - menu_configuration (Menu Configuration)
39 | * [ ] - model_configuration (Model Configuration)
40 | * [ ] - model_configuration_section (Configuration of Service Provider)
41 | * [ ] - localization (Localization)
42 | * [ ] - displays (Data Display Types)
43 | * [ ] - filters (Filters)
44 | * [ ] - columns (Columns)
45 | * [ ] - columns_editable (Columns Editable)
46 | * [ ] - columnfilters (Columns filter)
47 | * [ ] - form (Forms)
48 | * [ ] - form-element (Forms Element)
49 | * [ ] - javascript (Javascript API)
50 | * [ ] - assets (Resource management (Assets))
51 | * [ ] - image_upload (Image Upload)
52 | * [ ] - html_attributes (HTML Attributes)
53 | * [ ] - widgets (Widgets)
54 | * [ ] - extend (Create new elements)
55 |
56 |
57 | ## Not documented yet
58 | - releases
59 | - alerts
60 | - policy
61 |
62 |
63 | ## Documentation translate [status](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/)
64 | - en - 100%
65 | - ru - 100% (General)
66 |
67 |
68 | ## Need ADD
69 |
70 | - textaddon
71 | ```php
72 | AdminFormElement::textaddon('price', 'Price')
73 | ->setPlacement('after') //before
74 | ->setAddon(''),
75 | ```
76 |
--------------------------------------------------------------------------------
/_convert/README.md:
--------------------------------------------------------------------------------
1 | # Майнтентерам и составителям доки
2 | - Сразу извиняюсь за неудобство)
3 | - При составлении документации попросите доступ к [переводам](https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/)
4 | - Кратко описывайте новое значение, стараясь уменьшить кол-во слов и строк для перевода
5 | - Все файлы `*.md` из корня генерятся, править их нет смысла
6 |
7 |
8 | ## Инструкция по обновлению доки
9 | - Правим шаблон нужного файла документации в папке `_convert\template`
10 | - Все переменны к конкретному файлу доки ДОБАВЛЯЕМ (!) в английскую версию локализации (папка `_convert\lng\en`)
11 | - В шаблоне все переменные должны быть {{UPPERCASE}} без пробелов и без пробелов к фигурным скобкам
12 | - В JSON файле ключи без CamelCase
13 | - Не повторяем имена ключей из файла `_convert\lng\en\_sidebar.json` - он подключается ко всем остальным файлам, пользуемся этими ключами для навигаци в подвале
14 | - На сайте переводов нужно обновить ваш измененный `*.json`, для добавления новых строк перевода
15 | - При изменении ключа все существующие переводы удаляются
16 | - При изменении значения ключа все переводы сбрасываются и требуют переутверждения
17 | - Переводим на русский сами и обновляем его из сайта переводов в репу
18 | - Выполняем файл `_convert\parse.php` в браузере (пока еще новые файлы генерятся в папку `_convert\output`, переносим новые сгенерированные файлы)
19 | - Для перегенерации прибиваем локально папку `_convert\output`
20 | - пушим (на оф. сайте переводы подтягиваются прямо из гита)
21 |
--------------------------------------------------------------------------------
/_convert/config.php:
--------------------------------------------------------------------------------
1 | _sidebar)
17 | $filenames = [
18 | '_sidebar',
19 | 'installation',
20 | 'configuration',
21 | ]
22 |
23 |
24 | ?>
25 |
--------------------------------------------------------------------------------
/_convert/lng/en/_sidebar.json:
--------------------------------------------------------------------------------
1 | {
2 | "title1": "Information",
3 | "title2": "Where to start",
4 | "title3": "Main elements",
5 | "title4": "Other",
6 |
7 | "installation": "Install",
8 | "fast_start": "Fast start",
9 | "configuration": "Configuration",
10 | "global": "System Description",
11 | "update": "Update guide",
12 |
13 | "authentication": "Authentication",
14 | "routes_configuration": "Routes Configuration",
15 | "menu_configuration": "Menu Configuration",
16 | "model_configuration": "Model Configuration",
17 | "model_configuration_section": "Configuration via Service Provider",
18 | "localization": "Localization",
19 |
20 | "displays": "Data Display Types",
21 | "filters": "Filters",
22 | "columns": "Columns",
23 | "columns_editable": "Columns Editable",
24 | "columnfilters": "Columns filter",
25 | "form": "Forms",
26 | "form-element": "Forms Element",
27 |
28 | "javascript": "Javascript API",
29 | "assets": "Resource management (Assets)",
30 | "image_upload": "Image Upload",
31 | "html_attributes": "HTML Attributes",
32 | "widgets": "Widgets",
33 | "extend": "Create new elements",
34 |
35 | "next": "Next step"
36 | }
37 |
--------------------------------------------------------------------------------
/_convert/lng/en/configuration.json:
--------------------------------------------------------------------------------
1 | {
2 | "conf01": "during installation automatically publishes a config",
3 | "conf02": "If you want to update config file, then just run artisan command",
4 | "conf03": "Config file parapmeters",
5 |
6 | "conf_title": "String to display in page title",
7 | "conf_logo": "Logo displayed in the upper panel",
8 | "conf_logo_mini": "Admin mini logo for small display or minimized sidebar",
9 | "conf_url_prefix": "Admin url preffix",
10 | "conf_domain": "Enable/disable admin on subdomain",
11 | "conf_middleware": "Middleware that restrict the administrative module from unauthorized users",
12 | "conf_enable_editor": "Enabling and adding editing ENV settings",
13 | "conf_env_editor_url": "Slug for editing env settings file",
14 | "conf_env_editor_policy": "Adding a Policy",
15 | "conf_env_editor_excluded_keys": "An array of keys or key masks to hide in the settings ENV-editor",
16 | "conf_env_editor_middlewares": "Adding an middleware for editing settings",
17 | "conf_auth_provider": "Auth Provider",
18 | "conf_bootstrapdirectory": "The path to the autoload",
19 | "conf_imagesuploaddirectory": "Image upload directory. Relative path from `public` directory",
20 | "conf_filesuploaddirectory": "File upload directory. Relative path from `public` directory",
21 | "conf_template": "Template class. Must implement interface",
22 | "conf_datetimeformat": "Date and time formats for form and display elements",
23 | "conf_wysiwyg": "Default settings for Wysiwyg editors",
24 | "conf_datatables": "Default datatables settings",
25 | "conf_dt_autoupdate": "Enable/disable auto-update datatables",
26 | "conf_dt_autoupdate_interval": "Datatables auto-update time in minutes",
27 | "conf_dt_autoupdate_class": "Auto-update class. If not specified, all datatables will be auto-updated",
28 | "conf_dt_autoupdate_color": "Datatables auto-update progress bar color",
29 | "conf_breadcrumbs": "Enable/disable breadcrumbs",
30 | "conf_aliases": "Package aliases"
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/_convert/lng/en/installation.json:
--------------------------------------------------------------------------------
1 | {
2 | "service-provider": "Adding a Service Provider",
3 |
4 | "composer1": "You can install the package using the command line",
5 | "composer2": "or manually adding a package to",
6 | "composer3": "and execute the command",
7 |
8 | "service-provider1": "In Laravel 5.5+ the package will register automatically or you can specify it manually:",
9 |
10 | "artisan1": "Run artisan command to install SleepingOwl Admin",
11 | "artisan2": "What does this command",
12 | "artisan3": "Publishes SleepingOwl Admin configuration",
13 | "artisan4": "Publish SleepingOwl Admin Assets in",
14 | "artisan5": "Creates Autorun directory",
15 | "artisan6": "Creates a default menu configuration file",
16 | "artisan7": "Creates a default startup file",
17 | "artisan8": "Creates a default route file",
18 | "artisan9": "Creates a directory structure in 'public'",
19 | "artisan10": "Make [Service Provider]"
20 | }
21 |
--------------------------------------------------------------------------------
/_convert/lng/ru/_sidebar.json:
--------------------------------------------------------------------------------
1 | {
2 | "title1": "Введение",
3 | "title2": "C чего начать",
4 | "title3": "Основные элементы",
5 | "title4": "Прочее",
6 |
7 | "installation": "Установка",
8 | "fast_start": "Быстрый старт",
9 | "configuration": "Конфигурация",
10 | "global": "Описание работы системы",
11 | "update": "Руководство по обновлению",
12 |
13 | "authentication": "Авторизация",
14 | "routes_configuration": "Конфигурация роутов",
15 | "menu_configuration": "Конфигурация меню",
16 | "model_configuration": "Конфигурация модели",
17 | "model_configuration_section": "Конфигурация моделей через сервис провайдер",
18 | "localization": "Локализация",
19 |
20 | "displays": "Типы отображения данных",
21 | "filters": "Фильтры данных",
22 | "columns": "Столбцы",
23 | "columns_editable": "Столбцы Editable",
24 | "columnfilters": "Фильтры столбцов",
25 | "form": "Формы",
26 | "form-element": "Элементы формы",
27 |
28 | "javascript": "Javascript API",
29 | "assets": "Управление ресурсами (Assets)",
30 | "image_upload": "Загрузка изображений",
31 | "html_attributes": "HTML атрибуты",
32 | "widgets": "Виджеты",
33 | "extend": "Создание элементов",
34 |
35 | "next": "Следующий шаг"
36 | }
37 |
--------------------------------------------------------------------------------
/_convert/lng/ru/configuration.json:
--------------------------------------------------------------------------------
1 | {
2 | "conf01": "во время установки автоматически публикует конфиг",
3 | "conf02": "Если вы хотите опубликовать конфиг вручную выполните эту команду",
4 | "conf03": "Параметры конфигурации",
5 |
6 | "conf_title": "Строка для отображения в заголовке страницы",
7 | "conf_logo": "Логотип отображаемый в верхней панеле",
8 | "conf_logo_mini": "Логотип отображаемый в верхней панели при минимизированной боковой панели",
9 | "conf_url_prefix": "Префикс адреса для административного модуля",
10 | "conf_domain": "Включение/отключение поддержки субдомена для админки",
11 | "conf_middleware": "Посредник, который ограничивают административный модуль от доступа неавторизованных пользователей",
12 | "conf_enable_editor": "Включение и добавление редактирования настроек",
13 | "conf_env_editor_url": "URL, для редактирования env файла настроек",
14 | "conf_env_editor_policy": "Добавление политики",
15 | "conf_env_editor_excluded_keys": "Массив ключей или масок ключей для скрытия в редакторе файла настроек",
16 | "conf_env_editor_middlewares": "Добавление посредника для редактирование настроек",
17 | "conf_auth_provider": "Провайдер авторизации пользователей",
18 | "conf_bootstrapdirectory": "Путь к директории автозапуска",
19 | "conf_imagesuploaddirectory": "Путь к директории изображений относительно `public`",
20 | "conf_filesuploaddirectory": "Путь к директории файлов относительно `public`",
21 | "conf_template": "Класс используемого шаблона, должен быть унаследован от",
22 | "conf_datetimeformat": "Формат даты и времени для использования в столбцах и элементах формы по умолчанию",
23 | "conf_wysiwyg": "Настройки для Wysiwyg редакторов текста по умолчанию",
24 | "conf_datatables": "Настройки datatables по умолчанию",
25 | "conf_dt_autoupdate": "Включение/отключение автообновления datatables",
26 | "conf_dt_autoupdate_interval": "Время обновления datatables в минутах",
27 | "conf_dt_autoupdate_class": "Класс автообновления. Если не задано все datatables будут с автообновлением",
28 | "conf_dt_autoupdate_color": "Цвет прогрессбара автообновления таблиц",
29 | "conf_breadcrumbs": "Включение/отключение хлебных крошек",
30 | "conf_aliases": "Алиасы, которые инициализируются пакетом"
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/_convert/lng/ru/installation.json:
--------------------------------------------------------------------------------
1 | {
2 | "service-provider": "Добавление сервис провайдера",
3 |
4 | "composer1": "Установить пакет можно помощью командной строки",
5 | "composer2": "или вручную добавив пакет в",
6 | "composer3": "и выполнить команду",
7 |
8 | "service-provider1": "Для Laravel 5.5+ пакет подключится автоматически либо можно указать вручную:",
9 |
10 | "artisan1": "Запустите artisan команду для установки SleepingOwl Admin",
11 | "artisan2": "Что делает эта команда",
12 | "artisan3": "Публикует конфигурацию SleepingOwl Admin",
13 | "artisan4": "Публикует ресурсы из SleepingOwl Admin в",
14 | "artisan5": "Создает директорию автозапуска",
15 | "artisan6": "Создает файл конфигурации меню по умолчанию",
16 | "artisan7": "Создает файл автозапуска по умолчанию",
17 | "artisan8": "Создает файл роутов по умолчанию",
18 | "artisan9": "Создает структуру директории 'public'",
19 | "artisan10": "Создает [Service Provider]"
20 | }
21 |
--------------------------------------------------------------------------------
/_convert/parse.php:
--------------------------------------------------------------------------------
1 | $filename) {
37 | $f = $template_path . '/' . $filename . '.md';
38 | echo('
Generate: ' . $filename . '
');
39 |
40 | foreach ($langs as $key => $lang) {
41 | $l = $lng_path . '/' . $lang . '/' . $filename . '.json';
42 | echo('
Lang: ' . $lang . '
');
43 | //Check for missing files
44 | if(!file_exists($f)){echo('ERROR! File ' . $f . ' not found!'); return false;}
45 | if(!file_exists($l)){echo('ERROR! File ' . $l . ' not found!'); return false;}
46 |
47 | //lang folder
48 | if(!is_dir($output . '/' . $lang)) {
49 | mkdir($output . '/' . $lang);
50 | }
51 |
52 | //new file name
53 | $new_file_name = $output . '/' . $lang . '/' . $filename . '.md';
54 | if(file_exists($new_file_name)) {
55 | echo('File ' . $new_file_name . ' is NOT updated!!! (For updated need deleted this file)');
56 | } else {
57 | //variable replace
58 | //add main variable (_sidebar)
59 | $variables = json_decode(file_get_contents($l), true);
60 | if ($lang !== '_sidebar') {
61 | $add_v = $lng_path . '/' . $lang . '/_sidebar.json';
62 | $addition_variable = json_decode(file_get_contents($add_v), true);
63 | $variables = array_merge($variables, $addition_variable);
64 | }
65 |
66 | $text = file_get_contents($f);
67 | $new_text = replaceStr($text, $variables);
68 |
69 | //save file
70 | file_put_contents($new_file_name, $new_text);
71 | echo('File ' . $new_file_name . ' is GENERED!');
72 | }
73 | echo('
');
74 | }
75 |
76 | }
77 |
78 | echo '
All works complite
';
79 |
80 | ?>
81 |
--------------------------------------------------------------------------------
/_convert/preg_matcher.php:
--------------------------------------------------------------------------------
1 |
30 |
--------------------------------------------------------------------------------
/_convert/template/_sidebar.md:
--------------------------------------------------------------------------------
1 | - [CHANGELOG](changelog.md)
2 |
3 | - {{TITLE1}}
4 | - [{{INSTALLATION}}](installation)
5 | - [{{FAST_START}}](fast_start)
6 | - [{{CONFIGURATION}}](configuration)
7 | - [{{GLOBAL}}](global)
8 | - [{{UPDATE}}](update)
9 |
10 | - {{TITLE2}}
11 | - [{{AUTHENTICATION}}](authentication)
12 | - [{{ROUTES_CONFIGURATION}}](routes_configuration)
13 | - [{{MENU_CONFIGURATION}}](menu_configuration)
14 | - [{{MODEL_CONFIGURATION}}](model_configuration)
15 | - [{{MODEL_CONFIGURATION_SECTION}}](model_configuration_section)
16 | - [{{LOCALIZATION}}](localization)
17 | - {{TITLE3}}
18 | - [{{DISPLAYS}}](displays)
19 | - [{{FILTERS}}](filters)
20 | - [{{COLUMNS}}](columns)
21 | - [{{COLUMNS_EDITABLE}}](columns_editable)
22 | - [{{COLUMNFILTERS}}](columnfilters)
23 | - [{{FORM}}](form)
24 | - [{{FORM-ELEMENT}}](form-element)
25 | - {{TITLE4}}
26 | - [{{JAVASCRIPT}}](javascript)
27 | - [{{ASSETS}}](assets)
28 | - [{{IMAGE_UPLOAD}}](image_upload)
29 | - [{{HTML_ATTRIBUTES}}](html_attributes)
30 | - [{{WIDGETS}}](widgets)
31 | - [{{EXTEND}}](extend)
32 |
--------------------------------------------------------------------------------
/_convert/template/configuration.md:
--------------------------------------------------------------------------------
1 | # {{CONFIGURATION}}
2 |
3 | [php artisan sleepingowl:install](installation#artisan) {{CONF01}} `sleeping_owl.php`.
4 |
5 | {{CONF02}}:
6 | ```bash
7 | $ php artisan vendor:publish --provider="SleepingOwl\Admin\Providers\SleepingOwlServiceProvider" --tag="config"
8 | ```
9 |
10 | ## {{CONF03}}
11 |
12 | #### `title`
13 | {{CONF_TITLE}}
14 |
15 | #### `logo`
16 | {{CONF_LOGO}}
17 |
18 | #### `logo_mini` (@deprecated in ver. 6+)
19 | {{CONF_LOGO_MINI}}
20 |
21 | #### `url_prefix` (default: `'admin'`)
22 | {{CONF_URL_PREFIX}}
23 |
24 | #### `domain` (default: `false`)
25 | {{CONF_DOMAIN}}
26 |
27 | #### `middleware` (default: `['web', 'auth']`)
28 | {{CONF_MIDDLEWARE}}
29 |
30 | #### `enable_editor` (default: `false`)
31 | {{CONF_ENABLE_EDITOR}}
32 |
33 | #### `env_editor_url` (default: `'env/editor'`)
34 | {{CONF_ENV_EDITOR_URL}}
35 |
36 | #### `env_editor_policy` (default: `null`)
37 | {{CONF_ENV_EDITOR_POLICY}}
38 |
39 | #### `env_editor_excluded_keys`
40 | {{CONF_ENV_EDITOR_EXCLUDED_KEYS}}
41 | ```php
42 | 'env_editor_excluded_keys' => [
43 | 'APP_KEY', 'DB_*',
44 | ],
45 | ```
46 |
47 | #### `env_editor_middlewares` (default: `[]`)
48 | {{CONF_ENV_EDITOR_MIDDLEWARES}}
49 |
50 | #### `auth_provider` (default: `'users'`)
51 | {{CONF_AUTH_PROVIDER}}. [Custom User Providers](https://laravel.com/docs/authentication#adding-custom-user-providers)
52 |
53 | #### `bootstrapDirectory` (default: `app_path('Admin')`)
54 | {{CONF_BOOTSTRAPDIRECTORY}} SleepingOwl Admin
55 |
56 | #### `imagesUploadDirectory` (default: `'images/uploads'`)
57 | {{CONF_IMAGESUPLOADDIRECTORY}}
58 |
59 | #### `filesUploadDirectory` (default: `'files/uploads'`)
60 | {{CONF_FILESUPLOADDIRECTORY}}
61 |
62 | #### `template` (default: `SleepingOwl\Admin\Templates\TemplateDefault::class`)
63 | {{CONF_TEMPLATE}} `SleepingOwl\Admin\Contracts\TemplateInterface`
64 |
65 | #### `datetimeFormat` (default: `'d.m.Y H:i'`)
66 | #### `dateFormat` (default: `'d.m.Y'`)
67 | #### `timeFormat` (default: `'H:i'`)
68 | {{CONF_DATETIMEFORMAT}}
69 |
70 | #### `wysiwyg`
71 | {{CONF_WYSIWYG}}
72 |
73 | #### `datatables` (default: `[]`)
74 | {{CONF_DATATABLES}}
75 |
76 | #### `dt_autoupdate` (default: `false`)
77 | {{CONF_DT_AUTOUPDATE}}
78 |
79 | #### `dt_autoupdate_interval` (default: `5`)
80 | {{CONF_DT_AUTOUPDATE_INTERVAL}}
81 |
82 | #### `dt_autoupdate_class` (default: `''`)
83 | {{CONF_DT_AUTOUPDATE_CLASS}}
84 |
85 | #### `dt_autoupdate_color` (default: `'#dc3545'`)
86 | {{CONF_DT_AUTOUPDATE_COLOR}}
87 |
88 | #### `breadcrumbs` (default: `true`)
89 | {{CONF_BREADCRUMBS}}
90 |
91 | #### `aliases`
92 | {{CONF_ALIASES}}
93 |
94 |
95 | ## {{NEXT}}
96 | - [{{GLOBAL}}](global)
97 | - [{{AUTHENTICATION}}](authentication)
98 |
--------------------------------------------------------------------------------
/_convert/template/installation.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | - [Support](#support)
4 | - [Composer](#composer)
5 | - [{{SERVICE-PROVIDER}}](#service-provider)
6 | - [Artisan](#artisan)
7 |
8 |
9 |
10 | ## Support
11 | - Laravel ~5.5 || ~6.*
12 | - PHP 7.1.3+
13 |
14 |
15 |
16 | ## Composer
17 | {{COMPOSER1}}
18 |
19 | ```bash
20 | $ composer require laravelrus/sleepingowl
21 |
22 | //or branch
23 | $ composer require laravelrus/sleepingowl:dev-development
24 | ```
25 |
26 |
27 | {{COMPOSER2}} `composer.json`
28 |
29 | ```json
30 | {
31 | ...
32 | "require": {
33 | ...
34 | "laravelrus/sleepingowl": "dev-development",
35 | }
36 | }
37 | ```
38 | {{COMPOSER3}}
39 |
40 | ```bash
41 | $ composer update
42 | ```
43 |
44 |
45 | ## Service Provider
46 | !> {{SERVICE-PROVIDER1}}
47 |
48 | **config/app.php**
49 | ```php
50 | 'providers' => [
51 | ...
52 | /**
53 | * SleepingOwl Service Provider
54 | */
55 | SleepingOwl\Admin\Providers\SleepingOwlServiceProvider::class,
56 |
57 | /**
58 | * Application Service Providers...
59 | */
60 | App\Providers\AppServiceProvider::class,
61 | ...
62 | ]
63 | ```
64 |
65 |
66 | ## Artisan
67 |
68 | {{ARTISAN1}}
69 |
70 | ```bash
71 | $ php artisan sleepingowl:install
72 | ```
73 |
74 | #### {{ARTISAN2}}
75 | - {{ARTISAN3}} `config/sleepign_owl.php`
76 | - {{ARTISAN4}} `public/packages/sleepingowl/default`.
77 | ```bash
78 | $ php artisan vendor:publish --tag=assets --force
79 | ```
80 | - {{ARTISAN5}} (`app/Admin`)
81 | - {{ARTISAN6}} (`app/Admin/navigation.php`)
82 | - {{ARTISAN7}} (`app/Admin/bootstrap.php`)
83 | - {{ARTISAN8}} (`app/Admin/routes.php`)
84 | - {{ARTISAN9}} (`images/uploads`)
85 | - {{ARTISAN10}}(model_configuration_section) `app\Providers\AdminSectionsServiceProvider`
86 |
87 |
88 | ## {{NEXT}}
89 | - [{{CONFIGURATION}}](configuration)
90 | - [{{UPDATE}}](update)
91 |
--------------------------------------------------------------------------------
/docs/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/docs/_sidebar.md:
--------------------------------------------------------------------------------
1 | - [CHANGELOG](ru/changelog.md)
2 |
3 | - Введение
4 | - [Установка](ru/installation.md)
5 | - [Быстрый старт](ru/fast_start.md)
6 | - [Конфигурация](ru/configuration)
7 | - [Описание работы системы](ru/global)
8 | - [Руководство по обновлению](ru/update)
9 |
10 | - C чего начать
11 | - [Авторизация](ru/authentication)
12 | - [Конфигурация роутов](ru/routes_configuration)
13 | - [Конфигурация меню](ru/menu_configuration)
14 | - [Конфигурация модели](ru/model_configuration)
15 | - [Конфигурация моделей через сервис провайдер](ru/model_configuration_section)
16 | - [Локализация](ru/localization)
17 | - Основные элементы
18 | - [Типы отображения данных](ru/displays)
19 | - [Фильтры данных](ru/filters)
20 | - [Столбцы](ru/columns)
21 | - [Столбцы Editable](ru/columns_editable)
22 | - [Фильтры столбцов](ru/columnfilters)
23 | - [Формы](ru/form)
24 | - [Элементы формы](ru/form-element)
25 | - Прочее
26 | - [Javascript API](ru/javascript)
27 | - [Управление ресурсами (Assets)](ru/assets)
28 | - [Загрузка изображений](ru/image_upload)
29 | - [HTML атрибуты](ru/html_attributes)
30 | - [Виджеты](ru/widgets)
31 | - [Создание элементов](ru/extend)
32 |
--------------------------------------------------------------------------------
/docs/en/README.md:
--------------------------------------------------------------------------------
1 | # SleepingOwl Admin Documentation
--------------------------------------------------------------------------------
/docs/en/_navbar.md:
--------------------------------------------------------------------------------
1 | - Demo
2 | - [v5.6.12](https://demo.sleepingowladmin.ru)
3 | - [bs4](http://bs4.sleepingowladmin.ru)
4 | - GitHub
5 | - [Admin](https://github.com/laravelrus/sleepingowladmin/)
6 | - [Demo](https://github.com/SleepingOwlAdmin/demo)
7 | - [Demo bs4](https://github.com/SleepingOwlAdmin/demo/tree/bs4)
8 | - [Docs](https://github.com/SleepingOwlAdmin/docs/tree/new)
9 | - Translations
10 | - [:ru: Русский](/docs/ru/)
11 | - [:uk: English](/docs/en/)
12 |
--------------------------------------------------------------------------------
/docs/en/_sidebar.md:
--------------------------------------------------------------------------------
1 | - [CHANGELOG](changelog.md)
2 |
3 | - Information
4 | - [Install](installation)
5 | - [Fast start](fast_start)
6 | - [Configuration](configuration)
7 | - [System Description](global)
8 | - [Update guide](update)
9 |
10 | - Where to start
11 | - [Authentication](authentication)
12 | - [Routes Configuration](routes_configuration)
13 | - [Menu Configuration](menu_configuration)
14 | - [Model Configuration](model_configuration)
15 | - [Configuration via Service Provider](model_configuration_section)
16 | - [Localization](localization)
17 | - Main elements
18 | - [Data Display Types](displays)
19 | - [Filters](filters)
20 | - [Columns](columns)
21 | - [Columns Editable](columns_editable)
22 | - [Columns filter](columnfilters)
23 | - [Forms](form)
24 | - [Forms Element](form-element)
25 | - Other
26 | - [Javascript API](javascript)
27 | - [Resource management (Assets)](assets)
28 | - [Image Upload](image_upload)
29 | - [HTML Attributes](html_attributes)
30 | - [Widgets](widgets)
31 | - [Create new elements](extend)
32 |
--------------------------------------------------------------------------------
/docs/en/authentication.md:
--------------------------------------------------------------------------------
1 | # Authentication
2 |
3 | - [Custom Middleware](#middleware)
4 |
5 | SleepingOwl Admin uses Laravel authentication by `middleware`.
6 |
7 | In your app you should run artisan command: (See https://laravel.com/docs/5.2/authentication#authentication-quickstart)
8 | ```bash
9 | $ php artisan make:auth
10 | ```
11 |
12 | And after add middleware `auth` to `config/sleeping_owl.php`
13 |
14 | **Example**
15 | ```php
16 | /*
17 | | ...
18 | | see https://laravel.com/docs/5.2/authentication#authentication-quickstart
19 | |
20 | */
21 | 'middleware' => ['web', 'auth'],
22 | ...
23 | ```
24 |
25 | ---
26 |
27 |
28 | ## Custom Middleware
29 |
30 | You cat create custom middleware class< for example `App\Http\Middleware\AdminAuthenticate`
31 |
32 | ```php
33 | guest()) {
56 | if ($request->ajax() || $request->wantsJson()) {
57 | return response('Unauthorized.', 401);
58 | } else {
59 | return redirect()->guest('login');
60 | }
61 | }
62 |
63 | if (! $auth->user()->isAdmin()) {
64 | return response('Access denied.', 401);
65 | }
66 |
67 | return $next($request);
68 | }
69 | }
70 | ```
71 |
72 | And register this middleware in `App\Http\Kernel`
73 |
74 | ```php
75 | ...
76 | protected $routeMiddleware = [
77 | ...
78 | 'admin' => \App\Http\Middleware\AdminAuthenticate::class,
79 | ...
80 | ];
81 | ...
82 | ```
83 |
84 | And add this middleware `admin` to `config\sleeoping_owl.php`
85 |
86 | ```php
87 | ...
88 | 'middleware' => ['web', 'admin'],
89 | ...
90 | ```
--------------------------------------------------------------------------------
/docs/en/configuration.md:
--------------------------------------------------------------------------------
1 | # Configuration
2 |
3 | [php artisan sleepingowl:install](installation#artisan) during installation automatically publishes a config `sleeping_owl.php`.
4 |
5 | If you want to update config file, then just run artisan command:
6 | ```bash
7 | $ php artisan vendor:publish --provider="SleepingOwl\Admin\Providers\SleepingOwlServiceProvider" --tag="config"
8 | ```
9 |
10 | ## Config file parapmeters
11 | - [Main](#main)
12 | - [Datatables](#datatables)
13 | - [Other](#other)
14 | - [ENV-settings](#env-settings)
15 | - [Autoupdate Datatables](#autoupdate)
16 |
17 |
18 |
19 | #### `title`
20 | String to display in page title
21 |
22 | #### `logo`
23 | Logo displayed in the upper panel
24 |
25 | #### `logo_mini`
26 | Admin mini logo for small display or minimized sidebar
27 |
28 | #### `menu_top` (only in @dev-development branch)
29 | Text displayed above the menu
30 |
31 |
32 | #### `state_datatables` (only in @dev-development ветке) (default: `true`)
33 | DataTables state saving in localStorage
34 |
35 | #### `state_tabs` (only in @dev-development ветке) (default: `false`)
36 | Keep tabs active
37 |
38 | #### `state_filters` (only in @dev-development ветке) (default: `false`)
39 | Saving datatables filter values
40 |
41 |
42 | #### `url_prefix` (default: `'admin'`)
43 | Admin url preffix
44 |
45 | #### `domain` (default: `false`)
46 | Enable/disable admin on subdomain
47 |
48 | #### `middleware` (default: `['web', 'auth']`)
49 | Middleware that restrict the administrative module from unauthorized users
50 |
51 |
52 | #### `enable_editor` (default: `false`)
53 | Enabling and adding editing ENV settings
54 |
55 | #### `env_keys_readonly` (default: `false`)
56 | Makes the view-only key field
57 |
58 | #### `env_can_delete` (default: `true`)
59 | Allows/denies key/value deletion
60 |
61 | #### `env_can_add` (default: `true`)
62 | Allows/denies adding a key/value (if `env_keys_readonly == false`)
63 |
64 | #### `env_editor_url` (default: `'env/editor'`)
65 | Slug for editing env settings file
66 |
67 | #### `env_editor_policy` (default: `null`)
68 | Adding a Policy
69 |
70 | #### `env_editor_excluded_keys`
71 | An array of keys or key masks to hide in the settings ENV-editor
72 | ```php
73 | 'env_editor_excluded_keys' => [
74 | 'APP_KEY', 'DB_*',
75 | ],
76 | ```
77 |
78 | #### `env_editor_middlewares` (default: `[]`)
79 | Adding an middleware for editing settings
80 |
81 | #### `auth_provider` (default: `'users'`)
82 | Auth Provider. [Custom User Providers](https://laravel.com/docs/authentication#adding-custom-user-providers)
83 |
84 | #### `bootstrapDirectory` (default: `app_path('Admin')`)
85 | The path to the autoload SleepingOwl Admin
86 |
87 | #### `imagesUploadDirectory` (default: `'images/uploads'`)
88 | Image upload directory. Relative path from `public` directory
89 |
90 | #### `filesUploadDirectory` (default: `'files/uploads'`)
91 | File upload directory. Relative path from `public` directory
92 |
93 | #### `template` (default: `SleepingOwl\Admin\Templates\TemplateDefault::class`)
94 | Template class. Must implement interface `SleepingOwl\Admin\Contracts\TemplateInterface`
95 |
96 | #### `datetimeFormat` (default: `'d.m.Y H:i'`)
97 | #### `dateFormat` (default: `'d.m.Y'`)
98 | #### `timeFormat` (default: `'H:i'`)
99 | Date and time formats for form and display elements
100 |
101 | #### `wysiwyg`
102 | Default settings for Wysiwyg editors
103 |
104 | #### `datatables` (default: `[]`)
105 | Default datatables settings
106 |
107 | #### `datatables_highlight` (default: `false`)
108 | Highlight DataTables column on mouseover (global on / off)
109 | To include on a specific datatable need add a class `.lightcolumn`
110 |
111 | ```php
112 | //config
113 | 'datatables_highlight' => true,
114 |
115 | //Section
116 | //.table-primary, .table-secondary, .table-info, .table-success, .table-warning, .table-danger
117 | //.table-light, .table-gray, .table-white, .table-black, .table-red, .table-dark
118 | $display = AdminDisplay::datatablesAsync()
119 | ->setHtmlAttribute('class', 'table-primary table-striped table-hover lightcolumn');
120 | ```
121 |
122 |
123 | #### `dt_autoupdate` (default: `false`)
124 | Enable/disable auto-update datatables
125 |
126 | #### `dt_autoupdate_interval` (default: `5`)
127 | Datatables auto-update time in minutes
128 |
129 | #### `dt_autoupdate_class` (default: `''`)
130 | Auto-update class. If not specified, all datatables will be auto-updated
131 |
132 | #### `dt_autoupdate_color` (default: `'#dc3545'`)
133 | Datatables auto-update progress bar color
134 |
135 | #### `breadcrumbs` (default: `true`)
136 | Enable/disable breadcrumbs
137 |
138 | #### `scroll_to_top` (default: `true`)
139 | Enable/disable scroll to top page button
140 |
141 | #### `scroll_to_bottom` (default: `true`)
142 | Enable/disable scroll to bottom page button
143 |
144 | #### `imageLazyLoad`
145 | Enable/disable lazy loading images in tables and datatables
146 |
147 | #### `imageLazyLoadFile`
148 | The default image to display unloaded pages. You can specify an empty image through `data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==` or use path relative to the public folder
149 |
150 |
151 | #### `aliases`
152 | Package aliases
153 |
154 |
155 | ## Next step
156 | - [System Description](global)
157 | - [Authentication](authentication)
158 |
--------------------------------------------------------------------------------
/docs/en/form-element.md:
--------------------------------------------------------------------------------
1 | # Form elements (Fields)
2 |
3 | - [Text](#text)
4 | - [Number](#number)
5 | - [Password](#password)
6 | - [Hidden](#hidden)
7 | - [Date](#date)
8 | - [Datetime](#datetime)
9 | - [Timestamp](#timestamp)
10 | - [Time](#time)
11 | - [File](#file)
12 | - [Image](#image)
13 | - [Images](#images)
14 | - [Textarea](#textarea)
15 | - [Select](#select)
16 | - [Multi Select](#multiselect)
17 | - [Wysiwyg](#wysiwyg)
18 | - [Ckeditor](#ckeditor)
19 | - [Checkbox](#checkbox)
20 | - [Radio](#radio)
21 | - [Html](#html)
22 | - [Custom](#custom)
23 | - [View](#view)
24 | - [Upload](#upload)
25 | - [API](#api)
26 |
27 | As form element can be some class with interface `Illuminate\Contracts\Support\Renderable`.
28 | All form element should implement interface `SleepingOwl\Admin\Contracts\FormElementInterface`
29 |
30 |
31 |
32 | ## Text
33 |
34 | ```php
35 | AdminFormElement::text(string $key, string $label = null)
36 | // $key - Model key
37 | // $label - Title
38 | ```
39 |
40 |
41 | ## Number
42 |
43 | ```php
44 | AdminFormElement::number(string $key, string $label = null)
45 | // $key - Model key
46 | // $label - Title
47 | ```
48 |
49 |
50 | ## Password
51 |
52 | ```php
53 | AdminFormElement::password(string $key, string $label = null)
54 | // $key - Model key
55 | // $label - Title
56 | ```
57 | #### Methods
58 | ```php
59 | $field->allowEmptyValue(); // If password set, skip "`"required" validation rule
60 |
61 | $field->hashWithBcrypt(); // Before saving hash password with bcrypt
62 | $field->hashWithMD5(); // Before saving hash password with md5
63 | $field->hashWithSHA1(); // Before saving hash password with sha1
64 | ```
65 |
66 |
67 | ## Hidden
68 | ```php
69 | AdminFormElement::hidden(string $key)
70 | // $key - Model key
71 | ```
72 |
73 |
74 | ## Date
75 | ```php
76 | AdminFormElement::date(string $key, string $label = null)
77 | // $key - Model key
78 | // $label - Title
79 | ```
80 |
81 | #### Methods
82 | ```php
83 | $field->setFormat(string $fieldat); // Database date format
84 | $field->setPickerFormat(string $fieldat); // Picker date format (Default: `sleeping_owl.dateFormat`)
85 | $field->setCurrentDate(); // Set current date by default
86 | ```
87 |
88 |
89 | ## Datetime
90 | ```php
91 | AdminFormElement::datetime(string $key, string $label = null)
92 | // $key - Model key
93 | // $label - Title
94 | ```
95 |
96 | #### Methods
97 | ```php
98 | $field->setFormat(string $fieldat); // Database date format
99 | $field->setPickerFormat(string $fieldat); // Picker date format (Default: `sleeping_owl.datetimeFormat`)
100 | $field->setCurrentDate(); // Set current date by default
101 | $field->setSeconds(bool); // Show seconds
102 | ```
103 |
104 |
105 | ## Timestamp
106 | ```php
107 | AdminFormElement::timestamp(string $key, string $label = null)
108 | // $key - Model key
109 | // $label - Title
110 | ```
111 |
112 |
113 | ## Time
114 | ```php
115 | AdminFormElement::time(string $key, string $label = null)
116 | // $key - Model key
117 | // $label - Title
118 | ```
119 |
120 | #### Methods
121 | ```php
122 | $field->setFormat(string $fieldat); // Database date format
123 | $field->setPickerFormat(string $fieldat); // Picker date format (Default: `sleeping_owl.timeFormat`)
124 | $field->setCurrentDate(); // Set current date by default
125 | ```
126 |
127 |
128 | ## File
129 | File uploading via ajax and return relative file path
130 |
131 | ```php
132 | AdminFormElement::file(string $key, string $label = null)
133 | // $key - Model key
134 | // $label - Title
135 | ```
136 |
137 | #### Methods
138 |
139 | ```php
140 | $field->setUploadPath(Closure $uploadPath); // Setting file upload path
141 | // Example
142 | $field->setUploadPath(function(\Illuminate\Http\UploadedFile $file) {
143 | // $file - file object
144 | return public_path('files');
145 | });
146 |
147 | $field->setUploadFileName(Closure $uploadPath); // Setting file name
148 | // Example
149 | $field->setUploadFileName(function(\Illuminate\Http\UploadedFile $file) {
150 | // $file - file object
151 | return $file->getClientOriginalName().'doctrine-meta'.$file->getClientOriginalExtension();
152 | });
153 |
154 | $field->maxSize(int $size); // Setting max file size
155 | $field->minSize(int $size); // Setting min file size
156 | ```
157 |
158 |
159 |
160 | ## Image
161 | File uploading via ajax and return relative file path
162 | Use validation rule `image`
163 |
164 | ```php
165 | AdminFormElement::image(string $key, string $label = null)
166 | // $key - Model key
167 | // $label - Title
168 | ```
169 |
170 | #### Methods
171 | ```php
172 | $field->setUploadPath(Closure $uploadPath); // Setting file upload path
173 | // Example
174 | $field->setUploadPath(function(\Illuminate\Http\UploadedFile $file) {
175 | // $file - file object
176 | return public_path('files');
177 | });
178 |
179 | $field->setUploadFileName(Closure $uploadPath); // Setting file name
180 | // Example
181 | $field->setUploadFileName(function(\Illuminate\Http\UploadedFile $file) {
182 | // $file - file object
183 | return $file->getClientOriginalName().'.'.$file->getClientOriginalExtension();
184 | });
185 |
186 | $field->setUploadSettings(array settings); // Image resize settings
187 | // See http://image.intervention.io/
188 | // Example
189 | $field->setUploadSettings([
190 | 'orientate' => [],
191 | 'resize' => [1280, null, function ($constraint) {
192 | $constraint->upsize();
193 | $constraint->aspectRatio();
194 | }],
195 | 'fit' => [200, 300, function ($constraint) {
196 | $constraint->upsize();
197 | $constraint->aspectRatio();
198 | }]
199 | ]);
200 |
201 | $field->maxSize(int $size); // Setting max file size
202 | $field->minSize(int $size); // Setting min file size
203 | ```
204 |
205 |
206 | ## Images
207 | File uploading via ajax and return relative file path
208 | Use validation rule `image`
209 |
210 | This field by default set to model array of images
211 |
212 | ```php
213 | AdminFormElement::images(string $key, string $label = null)
214 | // $key - Model key
215 | // $label - Title
216 | ```
217 |
218 | #### Methods
219 | All method of [image](#image)
220 |
221 | ```php
222 | $field->storeAsJson(); // Encode data to json
223 | $field->storeAsComaSeparatedValue(); // Encode data to string with "," separator
224 | ```
225 |
226 |
227 |
228 | ## Textarea
229 |
230 | ```php
231 | AdminFormElement::textarea(string $key, string $label = null)
232 | // $key - Model key
233 | // $label - Title
234 | ```
235 |
236 | #### Methods
237 | ```php
238 | $field->setRows(int $rows); // Setting row numbers
239 | ```
240 |
241 |
242 | ## Select
243 | ```php
244 | AdminFormElement::select(string $key, string $label = null)
245 | // $key - Model key
246 | // $label - Title
247 | ```
248 |
249 | #### Methods
250 | ```php
251 | $field->setModelForOptions(string|\Illuminate\Database\Eloquent\Model $model, string $titleKey = null) // Setting model for options
252 | $field->setDisplay(string $titleKey) // Setting model options title
253 | $field->setFetchColumns(...$columns) // Setting model query select fields
254 | $field->setLoadOptionsQueryPreparer(Closure $callback) // Modify query
255 | // Example
256 | $field->setLoadOptionsQueryPreparer(function($item, $query) {
257 | return $query->where('column', 'value')->were('owner_id', Auth::user()->id)
258 | })
259 |
260 | $field->setOptions(array $options) // Settings array of options
261 |
262 | $field->setEnum(array $options) // Settings options enums
263 |
264 | $field->nullable() // Allow blank
265 | $field->exclude(array $keys) // Exclude options by key
266 | ```
267 |
268 |
269 | ## MultiSelect
270 | ```php
271 | AdminFormElement::multiSelect(string $key, string $label = null)
272 | // $key - Model key
273 | // $label - Title
274 | ```
275 |
276 | #### Methods
277 | All method from [Select](#select)
278 |
279 | ```php
280 | $field->taggable() // Allow select tags
281 | ```
282 |
283 |
284 | ## Wysiwyg
285 | ```php
286 | AdminFormElement::wysiwyg(string $key, string $label = null, string $editor = null)
287 | // $key - Model key
288 | // $label - Title
289 | // $editor - Editor key
290 | ```
291 |
292 | #### Methods
293 |
294 | ```php
295 | $field->setFilteredValueToField(string $field) // Setting field key for compiled HTML value (For example if used markdown)
296 | $field->disableFilter() // Disable compiling data to HTML (For example if used markdown)
297 |
298 | $field->setEditor(string $editor) // Setting editor name (ckeditor, tinymce, simplemde, ...)
299 | $field->setHeight(int $height) // Setting editor height
300 | $field->setParameters(array $parameters) // Additionals params (Will be json encoded)
301 | ```
302 |
303 |
304 | ## Ckeditor
305 | Alias for `wysiwyg`
306 |
307 | ```php
308 | AdminFormElement::ckeditor(string $key, string $label = null)
309 | // $key - Model key
310 | // $label - Title
311 | ```
312 |
313 |
314 | ## Checkbox
315 | ```php
316 | AdminFormElement::checkbox(string $key, string $label = null)
317 | // $key - Model key
318 | // $label - Title
319 | ```
320 |
321 |
322 | ## Radio
323 | All method from [Select](#select)
324 | ```php
325 | AdminFormElement::radio(string $key, string $label = null)
326 | // $key - Model key
327 | // $label - Title
328 | ```
329 |
330 |
331 | ## Html
332 |
333 | ```php
334 | AdminFormElement::html(string $html)
335 | ```
336 |
337 |
338 | ## Custom
339 |
340 | ```php
341 | AdminFormElement::custom(Closure $callback = null)
342 | // $callback - callback before saving
343 | ```
344 |
345 | #### Methods
346 |
347 | ```php
348 | $field->setCallback(Closure $callback) // callback before saving
349 | $field->setDisplay(Closure|string $display) // HTML for displaing
350 |
351 | // Example
352 | $field->setDisplay(function(Model $model) {
353 | return (string);
354 | })
355 | ```
356 |
357 |
358 | ## View
359 | Extends [Custom](#custom)
360 |
361 | ```php
362 | AdminFormElement::view(string $view, array $data = [], Closure $callback = null)
363 | // $view - view path
364 | // $data - array of data for view (will be add Form model)
365 | // $callback - callback before saving
366 | ```
367 |
368 | #### Methods
369 |
370 | ```php
371 | $field->setCallback(Closure $callback) // callback before saving
372 | $field->setView(string $path) // view path
373 | $field->setData(array $data) // array of data for view (will be add Form model)
374 | ```
375 |
376 |
377 | ## Upload
378 | Field `upload` uses ``.
379 |
380 | By add this field to form will be add html attribute `enctype="multipart/form-data"`. You can add this attribute manually
381 |
382 | ```php
383 | return AdminForm::panel()
384 | ....
385 | ->setHtmlAttribute('enctype', 'multipart/form-data');
386 | ```
387 |
388 | Use this trait `KodiComponents\Support\Upload` to work with this field,
389 |
390 | **Example**
391 |
392 | ```php
393 | class User extends Model
394 | {
395 | use \KodiComponents\Support\Upload;
396 |
397 | /**
398 | * The attributes that should be cast to native types.
399 | *
400 | * @var array
401 | */
402 | protected $casts = [
403 | 'image' => 'image', // or file | upload
404 | ];
405 | }
406 | ```
407 |
408 | Use cast `file` or `upload` for files, and `image` for images.
409 |
410 | If cast is `image`, you can use http://image.intervention.io/ for resize.
411 |
412 | ```php
413 | /**
414 | * @return array
415 | */
416 | public function getUploadSettings()
417 | {
418 | return [
419 | 'image' => [ // Model key
420 | // see http://image.intervention.io/api/fit
421 | 'fit' => [300, 300, function ($constraint) {
422 | $constraint->upsize();
423 | $constraint->aspectRatio();
424 | }],
425 | // see http://image.intervention.io/api/crop
426 | 'crop' => [300, 300],
427 | ...
428 | ],
429 | 'image_small' => [
430 | ...
431 | ]
432 | ];
433 | }
434 | ```
435 |
436 | By default upload path is: `public\storage\{table_name}\{field_name}\{file_name_hash:2chars}\{uniqid}.{ext}`.
437 |
438 | You can change default filename:
439 |
440 | ```php
441 | /**
442 | * @param UploadedFile $file
443 | *
444 | * @return string
445 | */
446 | protected function getUploadFilename(\Illuminate\Http\UploadedFile $file)
447 | {
448 | return md5($this->id).'.'.$file->getClientOriginalExtension();
449 | }
450 | ```
451 |
452 |
453 | ```php
454 | /**
455 | * The attributes that should be cast to native types.
456 | *
457 | * @var array
458 | */
459 | protected $casts = [
460 | 'image' => 'image',
461 | 'thumb' => 'image',
462 | ];
463 |
464 | /**
465 | * @return array
466 | */
467 | public function getUploadSettings()
468 | {
469 | return [
470 | 'image' => [
471 | 'orientate' => [],
472 | 'resize' => [1280, null, function ($constraint) {
473 | $constraint->upsize();
474 | $constraint->aspectRatio();
475 | }]
476 | ],
477 | 'thumb' => [
478 | 'orientate' => [],
479 | 'fit' => [200, 300, function ($constraint) {
480 | $constraint->upsize();
481 | $constraint->aspectRatio();
482 | }]
483 | ]
484 | ];
485 | }
486 |
487 | /**
488 | * @param \Illuminate\Http\UploadedFile $file
489 | */
490 | public function setUploadImageAttribute(\Illuminate\Http\UploadedFile $file = null)
491 | {
492 | if (is_null($file)) {
493 | return;
494 | }
495 |
496 | foreach ($this->getUploadFields() as $field) {
497 | $this->{$field.'_file'} = $file;
498 | }
499 | }
500 | ```
501 |
502 | #### Model file fields
503 |
504 | - `$user->image` `public\storage\users\image\23n4b23hj4b.jpg`
505 | - `$user->image_path` `\var\www\site.com\public\storage\users\image\23n4b23hj4b.jpg`
506 | - `$user->image_url` `http:\\site.com\storage\users\image\23n4b23hj4b.jpg`
507 | -
508 |
509 | #### Validation
510 | This field supports
511 | - https://laravel.com/docs/5.2/validation#rule-image
512 | - https://laravel.com/docs/5.2/validation#rule-mimetypes
513 | - https://laravel.com/docs/5.2/validation#rule-mimes
514 |
515 | ```php
516 | AdminFormElement::upload('image', 'Image')->addValidationRule('image')
517 |
518 | // or for file
519 |
520 | AdminFormElement::upload('pdf', 'PDF')->addValidationRule('mime:pdf'),
521 | ```
522 |
523 | **!!!This trait uses `getAttribute`, `mutateAttribute`, `setAttribute` method!!!**
524 |
525 | ---
526 |
527 |
528 |
529 | ## API
530 |
531 | ### addValidationRule
532 | Adding validation [rule](https://laravel.com/docs/5.3/validation#available-validation-rules)
533 |
534 | ```php
535 | $field->addValidationRule(string $rule, string $message = null)
536 | ```
537 |
538 | ### setValidationRules
539 | Adding [rules](https://laravel.com/docs/5.3/validation#available-validation-rules) as array
540 |
541 | ### required
542 | Filed must be required
543 |
544 | ```php
545 | $field->required(string $message = null)
546 | ```
547 |
548 | ### unique
549 | Filed must be unique
550 |
551 | ```php
552 | $field->unique(string $message = null)
553 | ```
554 |
555 | ### addValidationMessage
556 | Change validation message for rule
557 |
558 | ```php
559 | $field->addValidationMessage(string $rule, string $message)
560 | ```
561 |
562 | ### setView
563 | Setting view template.
564 |
565 | ```php
566 | $field->setView(\Illuminate\View\View|string $view)
567 | ```
568 |
569 | ### setPath
570 | Setting model field key
571 |
572 | ```php
573 | $field->setPath(string $path)
574 | ```
575 |
576 | ### setLabel
577 | Setting title
578 |
579 | ```php
580 | $field->setName(string $label)
581 | ```
582 |
583 | ### setDefaultValue
584 | Setting default value
585 |
586 | ```php
587 | $field->setDefaultValue(mixed $defaultValue)
588 | ```
589 |
590 | ### setHelpText
591 | Setting help text
592 |
593 | ```php
594 | $field->setHelpText(string|\Illuminate\Contracts\Support\Htmlable $helpText)
595 | ```
596 |
597 | ### setReadonly
598 | Setting read only field
599 |
600 | ```php
601 | $field->setReadonly(bool $status)
602 | ```
603 |
604 |
605 | ### `setValueSkipped(bool|Closure $valueSkipped)`
606 | Sets flag to skip saving attribute value to model. By default `false`.
607 |
608 | **If setting value must be skipped validation rules will be applied but there will be no value in model.**
609 |
610 | For instance, when creating users you want to check if `password` and `password_confirmation` fields match,
611 | but you don't need `password_confirmation` to be saved in model's attributes:
612 |
613 | ```php
614 | AdminFormElement::text('password', 'Password')->required();
615 | AdminFormElement::text('password_confirmation', 'Password confirmation')
616 | ->setValueSkipped(true)
617 | ->required()
618 | ->addValidationRule('same:password', 'Passwords must match!');
619 | ```
620 |
621 | ### mutateValue
622 | Mutate field value before form saving
623 |
624 | ```php
625 | $field->mutateValue(Closure $mutator)
626 | ```
627 |
628 | **Example**
629 | ```php
630 | $field->mutateValue(function($value) {
631 | return bcrypt($value);
632 | })
633 | ```
634 |
--------------------------------------------------------------------------------
/docs/en/global.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SleepingOwlAdmin/docs/1566273fe1a107259fc74b03bf4efded6012abbe/docs/en/global.md
--------------------------------------------------------------------------------
/docs/en/installation.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | - [Support](#support)
4 | - [Composer](#composer)
5 | - [Adding a Service Provider](#service-provider)
6 | - [Artisan](#artisan)
7 |
8 |
9 |
10 | ## Support
11 | - Laravel ~5.5 || ~6.*
12 | - PHP 7.1.3+
13 |
14 |
15 |
16 | ## Composer
17 | You can install the package using the command line
18 |
19 | ```bash
20 | $ composer require laravelrus/sleepingowl
21 |
22 | //or branch
23 | $ composer require laravelrus/sleepingowl:dev-development
24 | ```
25 |
26 |
27 | or manually adding a package to `composer.json`
28 |
29 | ```json
30 | {
31 | ...
32 | "require": {
33 | ...
34 | "laravelrus/sleepingowl": "dev-development",
35 | }
36 | }
37 | ```
38 | and execute the command
39 |
40 | ```bash
41 | $ composer update
42 | ```
43 |
44 |
45 | ## Service Provider
46 | !> In Laravel 5.5+ the package will register automatically or you can specify it manually:
47 |
48 | **config/app.php**
49 | ```php
50 | 'providers' => [
51 | ...
52 | /**
53 | * SleepingOwl Service Provider
54 | */
55 | SleepingOwl\Admin\Providers\SleepingOwlServiceProvider::class,
56 |
57 | /**
58 | * Application Service Providers...
59 | */
60 | App\Providers\AppServiceProvider::class,
61 | ...
62 | ]
63 | ```
64 |
65 |
66 | ## Artisan
67 |
68 | Run artisan command to install SleepingOwl Admin
69 |
70 | ```bash
71 | $ php artisan sleepingowl:install
72 | ```
73 |
74 | #### What does this command
75 | - Publishes SleepingOwl Admin configuration `config/sleepign_owl.php`
76 | - Publish SleepingOwl Admin Assets in `public/packages/sleepingowl/default`.
77 | ```bash
78 | $ php artisan vendor:publish --tag=assets --force
79 | ```
80 | - Creates Autorun directory (`app/Admin`)
81 | - Creates a default menu configuration file (`app/Admin/navigation.php`)
82 | - Creates a default startup file (`app/Admin/bootstrap.php`)
83 | - Creates a default route file (`app/Admin/routes.php`)
84 | - Creates a directory structure in 'public' (`images/uploads`)
85 | - Make [Service Provider](model_configuration_section) `app\Providers\AdminSectionsServiceProvider`
86 |
87 |
88 | ## Next step
89 | - [Configuration](configuration)
90 | - [Update guide](update)
91 |
--------------------------------------------------------------------------------
/docs/en/releases.md:
--------------------------------------------------------------------------------
1 | # Versions description
2 |
3 | ## SleepingOwl Admin 4
4 |
5 | From 4th version development of this project makes by community [LaravelRUS](https://github.com/LaravelRUS).
6 |
7 | Official documentation Sleeping Owl V4 (Russian): https://github.com/LaravelRUS/SleepingOwlAdmin-docs
8 |
9 | Official documentation Sleeping Owl V4 (English): https://github.com/LaravelRUS/SleepingOwlAdmin-docs/eng
10 |
11 | Docs in website: http://sleepingowl.laravel.su/ (with additional useful links)
12 |
13 | Group in VK: https://vk.com/sleepingowladm
14 |
15 | Community website: laravel.su
16 |
17 | ---
18 |
19 | ## SleepingOwl Admin 3 (beta)
20 |
21 | AHTUNG: this version not supported!
22 |
23 | ### Links
24 |
25 | GitHub: https://github.com/sleeping-owl/admin/tree/development
26 |
27 | Demo V3: http://sleepingowladmindemo2.cloudcontrolled.com/
28 |
29 | Docs in Russian: http://sleeping-owl.github.io/v3/ru/Introduction.html
30 |
31 | Docs in English V3
32 | http://sleeping-owl.github.io/v3/en/Introduction.html
33 |
34 | ---
35 |
36 | ## SleepingOwl Admin 2
37 |
38 | AHTUNG: this version not supported!
39 |
40 | ### Links
41 |
42 | GitHub: https://github.com/sleeping-owl/admin
43 |
44 | Demo: http://sleepingowladmindemo.cloudcontrolled.com/admin/login
45 |
46 | Docs in Russian V2: http://sleeping-owl.github.io/ru/Introduction.html
47 |
48 | Docs in English V2: http://sleeping-owl.github.io/en/Introduction.html
49 |
50 |
51 | ----------------------------------------------------
52 | actualy 14.11.2016
53 |
--------------------------------------------------------------------------------
/docs/en/update.md:
--------------------------------------------------------------------------------
1 | # Updating
2 |
3 | You should update package via `composer`
4 |
5 | ```bash
6 | $ composer update
7 | ```
8 |
9 | After update you should run artisan command for update assets:
10 |
11 | ```bash
12 | $ php artisan sleepingowl:update
13 | ```
14 | or
15 |
16 | ```bash
17 | $ php artisan vendor:publish --tag=assets --force
18 | ```
19 |
20 | And clear view-cache
21 |
22 | ```bash
23 | $ php artisan view:clear
24 | ```
25 |
26 | You can add this command to `composer.json` for auto updating assets
27 |
28 | ```json
29 | {
30 | "scripts": {
31 | "post-update-cmd": [
32 | ...
33 | "php artisan vendor:publish --tag=assets --force"
34 | ]
35 | },
36 | }
37 | ```
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Документация SleepingOwl Admin для Laravel 5.5 - 8.4
7 |
8 |
9 |
10 | Загрузка...
11 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 | ## SleepingOwl Admin
2 |
3 | [RU](ru/installation.md)
4 | [EN](en/installation.md)
5 |
6 |
--------------------------------------------------------------------------------
/docs/ru/README.md:
--------------------------------------------------------------------------------
1 | # SleepingOwl Admin Documentation
2 |
3 | * [Site](https://sleepingowladmin.ru/)
4 | * [Demo bs4](http://bs4.sleepingowladmin.ru)
5 |
6 | * [Русска версия NEW](ru/)
7 | * [English NEW](en/)
8 |
--------------------------------------------------------------------------------
/docs/ru/_navbar.md:
--------------------------------------------------------------------------------
1 | - Демо
2 | - [Demo](https://demo.sleepingowladmin.ru)
3 | - [Demo bs4](http://bs4.sleepingowladmin.ru)
4 | - GitHub
5 | - [Админка](https://github.com/laravelrus/sleepingowladmin/)
6 | - [Demo GitHub](https://github.com/SleepingOwlAdmin/demo)
7 | - [Demo bs4](https://github.com/SleepingOwlAdmin/demo/tree/bs4)
8 | - [Docs](https://sleepingowladmin.github.io/docs)
9 | - Translations
10 | - [:ru: Русский](https://sleepingowladmin.github.io/docs/ru)
11 | - [:uk: English](https://sleepingowladmin.github.io/docs/en)
12 |
--------------------------------------------------------------------------------
/docs/ru/_sidebar.md:
--------------------------------------------------------------------------------
1 | - [CHANGELOG](changelog.md)
2 |
3 | - Введение
4 | - [Установка](installation.md)
5 | - [Быстрый старт](fast_start.md)
6 | - [Конфигурация](configuration)
7 | - [Описание работы системы](global)
8 | - [Руководство по обновлению](update)
9 |
10 | - C чего начать
11 | - [Авторизация](authentication)
12 | - [Конфигурация роутов](routes_configuration)
13 | - [Конфигурация меню](menu_configuration)
14 | - [Конфигурация модели](model_configuration)
15 | - [Конфигурация моделей через сервис провайдер](model_configuration_section)
16 | - [Локализация](localization)
17 | - Основные элементы
18 | - [Типы отображения данных](displays)
19 | - [Фильтры данных](filters)
20 | - [Столбцы](columns)
21 | - [Столбцы Editable](columns_editable)
22 | - [Фильтры столбцов](columnfilters)
23 | - [Формы](form)
24 | - [Элементы формы](form-element)
25 | - Прочее
26 | - [Javascript API](javascript)
27 | - [Управление ресурсами (Assets)](assets)
28 | - [Загрузка изображений](image_upload)
29 | - [HTML атрибуты](html_attributes)
30 | - [Виджеты](widgets)
31 | - [Создание элементов](extend)
32 |
--------------------------------------------------------------------------------
/docs/ru/alerts.md:
--------------------------------------------------------------------------------
1 | # Alert Messages
2 |
3 | ```php
4 | \MessagesStack::addInfo('This is info');
5 | \MessagesStack::addError('This is error');
6 | \MessagesStack::addSuccess('This is success');
7 | ```
8 |
--------------------------------------------------------------------------------
/docs/ru/assets.md:
--------------------------------------------------------------------------------
1 | # Управление ресурсами (Assets Management)
2 |
3 | - [Meta](#meta)
4 | - [API](#api)
5 | - [Assets](#assets)
6 | - [API](#api-1)
7 | - [PackageManager](#package-manager)
8 | - [API](#api-2)
9 | - [Package](#package)
10 | - [API](#api-3)
11 | - [Assets trait](#assets-trait)
12 | - [В каких элементах используется](#В-каких-элементах-используется)
13 | - [API](#api-4)
14 |
15 | В SleepingOwlAdmin реализован достаточно гибкий механизм подключения
16 | ассетов с помощью пакета [kodicms/laravel-assets](https://github.com/KodiCMS/laravel-assets) - позволяющий
17 | разработчику управлять статичными ресурсами в веб-приложении, такими
18 | как каскадные таблицы стилей или javascript’ы (Данный пакет можно
19 | использовать независимо от админки)
20 |
21 | Для работы с ассетами через элементы форм, отображения и т.д.
22 | используется trait [assets](#assets-trait), который работает через
23 | класс `Meta`.
24 |
25 |
26 | ## Meta
27 | `KodiCMS\Assets\Meta`
28 |
29 | Класс мета используется для генерации блока meta информации в шаблоне.
30 | Класс представляет собой сервис контейнер, который инициализируется вместе с
31 | инициализацией всех компонентов системы и является `singleton` и позволяет
32 | добавлять стили и скрипты в шаблон в любой момент, до вывода шаблона.
33 |
34 | **Пример использования**
35 | ```php
36 | Meta::setTitle('Test title')
37 | ->setMetaDescription(...)
38 | ->addJs('admin-default', asset('js/app.js'), ['admin-scripts'])
39 | ->addJs('admin-scripts', route('admin.scripts'))
40 | ->addCss('admin-default', asset('css/app.css'))
41 | ->setFavicon(asset('favicon.ico'));
42 | ```
43 |
44 | ```html
45 |
46 |
47 |
48 | {!!
49 | Meta::addMeta(['charset' => 'utf-8'], 'meta::charset')
50 | ->addMeta(['content' => csrf_token(), 'name' => 'csrf-token'])
51 | ->addMeta(['content' => 'width=device-width, initial-scale=1', 'name' => 'viewport'])
52 | ->addMeta(['content' => 'IE=edge', 'http-equiv' => 'X-UA-Compatible'])
53 | ->render()
54 | !!}
55 |
56 |
57 | ...
58 |
59 | {!! Meta::renderScripts(true) !!}
60 |
61 |
62 | ```
63 |
64 |
65 | ### API
66 |
67 | #### `loadPackage`
68 |
69 | Подключение пакетов.
70 |
71 | ```php
72 | static::loadPackage(string|array $packages): static
73 | ```
74 |
75 | ```php
76 | // app\Providers\AppServiceProvider
77 |
78 | PackageManager::add('jquery')
79 | ->js('jquery.js', 'https://code.jquery.com/jquery-3.1.0.min.js');
80 |
81 | PackageManager::add('ckeditor')
82 | ->css('ckeditor.css', asset('css/ckeditor.css'))
83 | ->js('ckeditor.js', asset('js/ckeditor.js'));
84 |
85 | // Template
86 | Meta::loadPackage(['jquery', 'ckeditor'])
87 | ```
88 |
89 | #### `addJs`
90 |
91 | Добавление javascript файла.
92 |
93 | ```php
94 | static::addJs(string $handle, string $src, array|string $dependency = null, bool $footer = false): static
95 | ```
96 |
97 | ##### Аргументы
98 | * `$handle` **string** - Ключ ассета (При указании существующего ключа, будет заменен существующий ассет)
99 | * `$src` **string** - Путь до фала (URL)
100 | * `$dependency` **array|string** - Зависимости (Зависимости определяются по ключу в `$handle`. Т.е. если у вас подключен `jquery` и
101 | вам необходимо подключить свой скрипт только после него, то вы указываете его в качестве зависимости, это же правило распространяется
102 | на пакеты)
103 | * `$footer` **bool** - будет помечен для вывода в футере
104 |
105 | #### `addJsElixir`
106 |
107 | Добавление javascript файла c версионностью
108 |
109 | ```php
110 | static::addJsElixir(string $filename = 'js/app.js', string|array $dependency = null, bool $footer = false): static
111 | ```
112 |
113 | #### `removeJs`
114 |
115 | Удаление javascript файла. *Если параметр `$handle` не передан, будут удалены все javascript*
116 |
117 | ```php
118 | static::removeJs(string $handle = null): static
119 | ```
120 |
121 | #### `addCss`
122 | Добавление css файла.
123 |
124 | ```php
125 | static::addCss(string $handle, string $src, array|string $dependency = null, array $attributes = []): static
126 | ```
127 |
128 | ##### Аргументы
129 | * `$handle` **string** - Ключ ассета (При указании существующего ключа, будет заменен существующий ассет)
130 | * `$src` **string** - Путь до фала (URL)
131 | * `$dependency` **array|string** - Зависимости (Зависимости определяются по ключу в `$handle`. Т.е. если у вас подключен `jquery` и
132 | вам необходимо подключить свой скрипт только после него, то вы указываете его в качестве зависимости, это же правило распространяется
133 | на пакеты)
134 | * `$attributes` **array** - Дополнительные атрибуты (`['rel' => 'stylesheet', 'media' => 'all']`)
135 |
136 | #### `addCssElixir`
137 |
138 | Добавление css файла c версионностью
139 |
140 | ```php
141 | static::addCssElixir(string $filename = 'css/all.css', string|array $dependency = null, array $attributes = []): static
142 | ```
143 |
144 | #### `removeCss`
145 |
146 | Удаление css файла. *Если параметр `$handle` не передан, будут удалены все javascript*
147 |
148 | ```php
149 | static::removeCss(string $handle = null): static
150 | ```
151 |
152 | #### `putVars`
153 | Вывод в шаблон javascript переменной.
154 |
155 | ```php
156 | static::putVars(string|array $key, mixed $value = null): static
157 | ```
158 |
159 | ```php
160 | Meta::putVars(['key' => 'value', 'key1' => ['data]])
161 | // or
162 |
163 | Meta::putVars('key', ['data'])
164 | ```
165 |
166 | ```html
167 |
170 | ```
171 |
172 | #### `removeVars`
173 |
174 | Удаление всех добавленных в стек данных
175 |
176 | ```php
177 | static::removeVars(): static
178 | ```
179 |
180 |
181 | #### `setTitle`
182 | Указание заголовка `...`
183 |
184 | ```php
185 | static::setTitle(string $title): static
186 | ```
187 |
188 | ```php
189 | Meta::setTitle('SleepingOwl Admin')
190 | ```
191 |
192 | #### `setMetaDescription`
193 |
194 | Указание описание ``
195 |
196 | ```php
197 | static::setMetaDescription(string $description): static
198 | ```
199 |
200 | #### `setMetaKeywords`
201 |
202 | Указание ключевых слов ``
203 |
204 | ```php
205 | static::setMetaKeywords(array|string $keywords): static
206 | ```
207 |
208 | #### `setMetaRobots`
209 |
210 | ``
211 |
212 | ```php
213 | static::setMetaRobots(string $robots): static
214 | ```
215 |
216 | #### `setMetaData`
217 |
218 | Указание метаданных через класс реализующий интерфейс `KodiCMS\Assets\Contracts\MetaDataInterface`
219 | - title
220 | - description
221 | - keywords
222 | - robots
223 |
224 | ```php
225 | static::setMetaData(\KodiCMS\Assets\Contracts\MetaDataInterface $data): static
226 | ```
227 |
228 | #### `addSocialTags`
229 |
230 | Добавление тегов для соц. сетей через класс, реализующий интерфейс `KodiCMS\Assets\Contracts\SocialMediaTagsInterface`
231 |
232 | ```php
233 | static::addSocialTags(\KodiCMS\Assets\Contracts\SocialMediaTagsInterface $socialTags): static
234 | ```
235 |
236 | #### `setFavicon`
237 |
238 | Указание favicon для страницы ``
239 |
240 | ```php
241 | static::setFavicon(string $url, string $rel = 'shortcut icon'): static
242 | ```
243 |
244 | #### `addMeta`
245 |
246 | Добавление `meta` тега
247 |
248 | ```php
249 | static::addMeta(array $attributes, string $group = null): static
250 | ```
251 | ##### Аргументы
252 | * `$group` **string** - Ключ элемента в группе
253 |
254 |
255 | ```php
256 | Meta::addMeta(['name' => 'description', 'content' => 'hello world']) //
257 | ```
258 |
259 | #### `addTagToGroup`
260 |
261 | Добавление HTML тега в группу. *По умолчанию все meta теги (`favicon`, `description`, `keywords`) создаваемые через класс `Meta` после генерации в html добавляются в группу с ключом `meta`*
262 |
263 | ```php
264 | static::addTagToGroup(string $handle, string $content, array $params = [], string|array $dependency = null): static
265 | ```
266 |
267 | ##### Аргументы
268 | * `$handle` **string** - Ключ элемента в группе
269 | * `$content` **string** - HTML код ``
270 | * `$params` **array** - Параметры для замены. (`[':name' => $name, ':description' => 'My super description']`)
271 | * `$dependency` **array|string** - Зависимости (Зависимости определяются по ключу в `$handle`. Т.е. если у вас подключен `jquery` и
272 | вам необходимо подключить свой скрипт только после него, то вы указываете его в качестве зависимости, это же правило распространяется
273 | на пакеты)
274 |
275 | ```php
276 | Meta::addTagToGroup('favicon', '', [
277 | ':url' => $url,
278 | ':rel' => $rel,
279 | ':type' => $type
280 | ])
281 | ```
282 |
283 | #### `removeFromGroup`
284 |
285 | Удаление HTML тега из группы.
286 |
287 | ```php
288 | static::removeFromGroup(string $handle): static
289 | ```
290 |
291 | #### `assets`
292 |
293 | Получение объекта `KodiCMS\Assets\Assets`
294 |
295 | ```php
296 | static::removeFromGroup(string $handle): static
297 | ```
298 |
299 |
300 | ## Assets
301 | `KodiCMS\Assets\Assets`
302 |
303 | Класс Assets является хранилищем списка `css`, `javascript`, `vars` и `groups`.
304 |
305 | **Класс Meta при добавлении ассетов использует данный класс в качестве хранилища.**
306 |
307 |
308 | ### API
309 |
310 | #### `packageManager`
311 |
312 | Получение объекта `KodiCMS\Assets\PackageManager`
313 |
314 | ```php
315 | static::removeFromGroup(string $handle): static
316 | ```
317 |
318 |
319 | ## PackageManager
320 | `KodiCMS\Assets\PackageManager extends Collection`
321 |
322 | Менеджер пакетов. Пакет представляет из себя набор ассетов (javascript и css), которые объединены в одну группу, доступную по имени.
323 |
324 | **Пример инициализации**
325 | ```php
326 | // app\Providers\AppServiceProvider.php
327 |
328 | ...
329 | public function boot()
330 | {
331 | PackageManager::add('custom')
332 | ->css('extend', asset('css/custom.css'))
333 | ->js('extend', asset('js/custom.js'));
334 | }
335 | ```
336 |
337 | Получить список доступных пакетов можно через консольную команду
338 |
339 | ```bash
340 | $ php artisan assets:packages
341 | ```
342 |
343 |
344 | ### API
345 |
346 | #### `add`
347 |
348 | Добавление нового пакета
349 |
350 | ```php
351 | static::add(KodiCMS\Assets\Contracts\PackageInterface|string $package): return KodiCMS\Assets\Contracts\PackageInterface
352 | ```
353 |
354 | #### `load`
355 |
356 | Загрузка объекта пакета
357 |
358 | ```php
359 | static::load(string $name): return KodiCMS\Assets\Contracts\PackageInterface|null
360 | ```
361 |
362 | <
363 | ## Package
364 | `KodiCMS\Assets\Package extends Collection`
365 |
366 | Пакет (контейнер) для хранения ассетов
367 |
368 | ### API
369 |
370 | #### `with`
371 |
372 | Добавить зависимость от других пакетов (Будут загружены автоматически при подключении пакета в шаблон)
373 |
374 | ```php
375 | static::with(array|...$packages): static
376 | ```
377 |
378 | #### `js`
379 |
380 | Добавление javascript файла.
381 |
382 | ```php
383 | static::js(string $handle, string $src, array|string $dependency = null, bool $footer = false): static
384 | ```
385 |
386 | ##### Аргументы
387 | * `$handle` **string** - Ключ ассета (При указании существующего ключа, будет заменен существующий ассет)
388 | * `$src` **string** - Путь до фала (URL)
389 | * `$dependency` **array|string** - Зависимости (Зависимости определяются по ключу в `$handle`. Т.е. если у вас подключен `jquery` и
390 | вам необходимо подключить свой скрипт только после него, то вы указываете его в качестве зависимости, это же правило распространяется
391 | на пакеты)
392 | * `$footer` **bool** - будет помечен для вывода в футере
393 |
394 | #### `css`
395 | Добавление css файла.
396 |
397 | ```php
398 | static::css(string $handle, string $src, array|string $dependency = null, array $attributes = []): static
399 | ```
400 |
401 | ##### Аргументы
402 | * `$handle` **string** - Ключ ассета (При указании существующего ключа, будет заменен существующий ассет)
403 | * `$src` **string** - Путь до фала (URL)
404 | * `$dependency` **array|string** - Зависимости (Зависимости определяются по ключу в `$handle`. Т.е. если у вас подключен `jquery` и
405 | вам необходимо подключить свой скрипт только после него, то вы указываете его в качестве зависимости, это же правило распространяется
406 | на пакеты)
407 | * `$attributes` **array** - Дополнительные атрибуты (`['rel' => 'stylesheet', 'media' => 'all']`)
408 |
409 |
410 | ## Assets trait
411 |
412 | Вспомогательный trait используется для организации работы с подключением ассетов для элементов админки.
413 |
414 | Допустим у нас есть класс `Form\Element\Select`
415 |
416 | ```php
417 | class Select extends ... implements \SleepingOwl\Admin\Contracts\Initializable
418 | {
419 | use \SleepingOwl\Admin\Traits\Assets;
420 |
421 | public function __construct()
422 | {
423 | // Инициализация пакета для хранения ассетов
424 | $this->initializePackage();
425 |
426 | ...
427 | }
428 |
429 | public function initialize()
430 | {
431 | // подключение ассетов в шаблон
432 | $this->includePackage();
433 |
434 | ...
435 | }
436 |
437 | ...
438 | }
439 | ```
440 |
441 | При подключении трейта класс инициализирует новый пакет через `PackageManager` с названием текущего класса, т.е. для класса
442 | выше это будет `PackageManager::add('Form\Element\Select')` и при вызове методов трейта `withPackage`, `addScript` и `addStyle` мы добавляем новые
443 | ассеты в данный пакет.
444 |
445 | Как мы знаем метод `initialize` в классе `Form\Element\Select` будет вызван только в момент подключение элемента в форму, а
446 | вместе с ним и ассеты.
447 |
448 |
449 | ### В каких элементах используется
450 | - [Display](ru/displays)
451 | - [DisplayColumn](ru/columns)
452 | - [ColumnFilter](ru/columnfilters)
453 | - [Form](ru/form)
454 | - [FormElement](ru/form-element)
455 |
456 |
457 | ### API
458 |
459 | #### addStyle
460 | Добавление css файла в пакет
461 |
462 | ```php
463 | $element->addStyle(string $handle, string $style, array $attributes): static
464 |
465 | // Пример
466 | $element->addStyle('cystom-style', asset('css/style.css'));
467 | ```
468 |
469 | ##### Аргументы
470 | * `$handle` **string** - Ключ ассета (При указании существующего ключа, будет заменен существующий ассет)
471 | * `$style` **string** - Путь до фала (URL)
472 | * `$attributes` **array** - Дополнительные атрибуты (`['rel' => 'stylesheet', 'media' => 'all']`)
473 |
474 | #### addScript
475 | Добавление js файла в пакет
476 |
477 | ```php
478 | $element->addScript(string $handle, string $script, array $dependency): static
479 |
480 | // Пример
481 | $element->addScript('custom-script', asset('js/app.js'), ['jquery-2.0']);
482 | $element->addScript('jquery-2.0', 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js');
483 | ```
484 |
485 | ##### Аргументы
486 | * `$handle` **string** - Ключ ассета (При указании существующего ключа, будет заменен существующий ассет)
487 | * `$script` **string** - Путь до фала (URL)
488 | * `$dependency` **array|string** - Зависимости (Зависимости определяются по ключу в `$handle`. Т.е. если у вас подключен `jquery` и
489 | вам необходимо подключить свой скрипт только после него, то вы указываете его в качестве зависимости)
490 |
491 | #### withPackage
492 | Подключение пакета [Package](#package-manager)
493 |
494 | ```php
495 | $element->withPackage(string|array $packages): static
496 |
497 | // Пример
498 | $element->withPackage(['custom', 'ckeditor']);
499 | ```
500 |
--------------------------------------------------------------------------------
/docs/ru/authentication.md:
--------------------------------------------------------------------------------
1 | # Авторизация
2 |
3 |
4 | SleepingOwl Admin по умолчанию не использует авторизацию, т.е. доступ в админ панель никак не защищен. Настроить доступ можно используя `middleware`.
5 |
6 | Самый простой вариант - использовать стандартный механизм, который предоставляет сам Laravel.
7 |
8 | Для этого необходимо выполнить консольную команду (Подробнее https://laravel.com/docs/authentication#authentication-quickstart)
9 | ```bash
10 | $ php artisan make:auth
11 | ```
12 | После выполнения команды необходимо в настройках `middleware` конфига `sleeping_owl.php` добавить `auth`
13 |
14 | **Пример**
15 | ```php
16 | /*
17 | | ...
18 | | see https://laravel.com/docs/authentication#authentication-quickstart
19 | |
20 | */
21 | 'middleware' => ['web', 'auth'], // Порядок следования важен
22 | ...
23 | ```
24 |
25 | Таким образом у вас есть возможность гибко настраивать правила для доступа
26 | в админ панель путем создания собственных `middleware`.
27 |
28 | ---
29 |
30 |
31 | ## Custom Middleware
32 |
33 | Глобально ограничить доступ к админ панели можно с помощью `middleware`.
34 |
35 | Допустим у вас есть пользователи и роли и вы хотите ограничить доступ к
36 | панели только администраторам.
37 | Для этого необходимо создать новый класс, например `App\Http\Middleware\AdminAuthenticate`
38 |
39 | ```php
40 | guest()) {
63 | if ($request->ajax() || $request->wantsJson()) {
64 | return response('Unauthorized.', 401);
65 | } else {
66 | return redirect()->guest(route('login'));
67 | }
68 | }
69 |
70 | if (! $auth->user()->isAdmin()) {
71 | return response('Access denied.', 401);
72 | }
73 |
74 | return $next($request);
75 | }
76 | }
77 | ```
78 |
79 | Зарегистрировать данный класс в `App\Http\Kernel`
80 |
81 | ```php
82 | ...
83 | protected $routeMiddleware = [
84 | ...
85 | 'admin' => \App\Http\Middleware\AdminAuthenticate::class,
86 | ...
87 | ];
88 | ...
89 | ```
90 |
91 | И теперь можно использовать данный `middleware`, добавив его в конфиг `config\sleeoping_owl.php`
92 |
93 | ```php
94 | ...
95 | 'middleware' => ['web', 'admin'],
96 | ...
97 | ```
98 |
99 | Подробнее о работе авторизации можно почитать в официальной [документации](https://laravel.com/docs/authentication).
100 |
--------------------------------------------------------------------------------
/docs/ru/columnfilters.md:
--------------------------------------------------------------------------------
1 | # Фильтры столбцов
2 |
3 | - [API](#api)
4 | - [Text](#text)
5 | - [Date](#date)
6 | - [Select](#select)
7 | - [Range](#range)
8 |
9 | Фильтры столбцов используются для фильтрации списка.
10 |
11 | В случае с `AdminDisplay::datatables()` поиск производится через API библиотеки `datatables`.
12 |
13 | **Пример использования:**
14 |
15 | ```php
16 | $display = AdminDisplay::datatables();
17 |
18 | $display->setColumnFilters([
19 | null, // Не ищем по первому столбцу
20 |
21 | // Поиск текста
22 | AdminColumnFilter::text()
23 | ->setPlaceholder('Full Name'),
24 |
25 | // Поиск по диапазону
26 | AdminColumnFilter::range()->setFrom(
27 | AdminColumnFilter::text()
28 | ->setPlaceholder('From')
29 | )->setTo(
30 | AdminColumnFilter::text()
31 | ->setPlaceholder('To')
32 | ),
33 |
34 | // Поиск по диапазону дат
35 | AdminColumnFilter::range()->setFrom(
36 | AdminColumnFilter::date()
37 | ->setPlaceholder('From Date')
38 | ->setFormat('d.m.Y')
39 | )->setTo(
40 | AdminColumnFilter::date()
41 | ->setPlaceholder('To Date')
42 | ->setFormat('d.m.Y')
43 | ),
44 |
45 | // Поиск по выпадающему списку значений
46 | AdminColumnFilter::select(new Country, 'Title')
47 | ->setDisplay('title')
48 | ->setPlaceholder('Select Country')
49 | ->setColumnName('country_id')
50 | ]);
51 | ```
52 |
53 | **При указании столбцов необходимо, чтобы кол-во столбцов поиска соответствовало кол-ву столбцов в таблице (если поиск по определенному столбцу не нужен, то необходимо передать `null`) и была соблюдена последовательность**
54 |
55 |
56 | Так же фильтры можно вынести из таблицы:
57 |
58 | ```php
59 | $display = AdminDisplay::datatables();
60 |
61 | $filters = [
62 | //нужные фильтры
63 | ];
64 |
65 | $display->setColumnFilters($filters);
66 | //любая доступная позиция
67 | $display->getColumnFilters()->setPlacement('card.heading');
68 | ```
69 |
70 |
71 | ## API
72 |
73 | В классах фильтров столбцов используется трейт:
74 | - [HtmlAttributes](html_attributes), с помощью которого для них можно настраивать HTML атрибуты.
75 | - [Assets](assets#assets-trait), с помощью которого для них можно подключать ассеты.
76 |
77 | ## Методы доступные во всех фильтрах
78 |
79 |
80 | ### setOperator
81 | Указание оператора, который будет использован при фильтрации. По умолчанию `equal`
82 |
83 | ```php
84 | static::setOperator(string $operator): return self
85 | ```
86 |
87 | #### Список доступных операторов сравнения:
88 |
89 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::EQUAL = equal` - равно
90 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::NOT_EQUAL = not_equal` - не равно
91 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::LESS = less` - меньше
92 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::LESS_OR_EQUAL = less_or_equal` - меньше или равно
93 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::GREATER = greater` - больше
94 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::GREATER_OR_EQUAL = greater_or_equal` - больше или равно
95 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::BEGINS_WITH = begins_with` - начинается с
96 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::NOT_BEGINS_WITH = not_begins_with`- не начинается с
97 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::CONTAINS = contains` - содержит
98 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::NOT_CONTAINS = not_contains` - не содержит
99 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::ENDS_WITH = ends_with` - заканчивается на
100 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::NOT_ENDS_WITH = not_ends_with` - не заканчивается на
101 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::BETWEEN = between` - между (значения указываются через `,`)
102 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::NOT_BETWEEN = not_between` - не между (значения указываются через `,`)
103 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::IN = in` - одно из (значения указываются через `,`)
104 | - `SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::NOT_IN = not_in` - не одно из (значения указываются через `,`)
105 |
106 |
107 | ## Text
108 | Фильтрация данных по строке
109 |
110 | ```php
111 | AdminColumnFilter::text()
112 | ->setPlaceholder('Full Name')
113 | ->setOperator(\SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::CONTAINS)
114 | ```
115 |
116 | ### setPlaceholder
117 | Указание плейсхолдера для поля.
118 |
119 | ```php
120 | static::setPlaceholder(string $placeholder): return self
121 | ```
122 |
123 |
124 | ## Date
125 | Фильтрация данных по дате
126 |
127 | ```php
128 | AdminColumnFilter::date()->setPlaceholder('Date')->setFormat('d.m.Y')
129 | ```
130 |
131 | ### setFormat
132 | Указание формата даты в которой приходит дата из инпута
133 |
134 | ```php
135 | static::setFormat(string $format): return self
136 | ```
137 |
138 | ### setPickerFormat
139 | Указание формата даты отображаемой в инпуте и понятной для Javascript
140 |
141 | ```php
142 | static::setPickerFormat(string $pickerFormat): return self
143 | ```
144 |
145 | ### setSearchFormat
146 | Указание формата даты в котором данные хранятся в БД
147 |
148 | ```php
149 | static::setSearchFormat(string $searchFormat): return self
150 | ```
151 |
152 | ### setWidth (доступно в v6+, вернулось в v7.20+)
153 | __Минимальная__ ширина блока
154 | Доступно во всех фильтрах, в рейдж блоке и во внутренних частях рейндж блока
155 |
156 | ```php
157 | static::setWidth(string $width): return self
158 |
159 | AdminColumnFilter::text()
160 | ->setPlaceholder('Full Name')
161 | ->setColumnName('title')
162 | ->setWidth('20rem') //min-width: 20rem / em / px / %
163 | ->setOperator('contains'),
164 | ```
165 |
166 |
167 | ## Select
168 | Фильтрация данных по данным из выпадающего списка.
169 | В опции можно указать массив или передать модель:
170 |
171 | ```php
172 | //массивом
173 | AdminColumnFilter::select()
174 | ->setOptions([
175 | 'sender' => 'Отправитель',
176 | 'recipient' => 'Получатель',
177 | ])
178 | ->setWidth('15rem')
179 | ->setColumnName('payer_type')
180 | ->setPlaceholder('Все'),
181 |
182 | //моделью
183 | AdminColumnFilter::select()
184 | ->setModelForOptions(Sender::class)
185 | ->setDisplay(function($filter){
186 | return $filter->id . ' - ' . $filter->description;
187 | })
188 | ->setWidth('15rem')
189 | ->setFetchColumns('description') //id и так выбирается
190 | ->setColumnName('sender_id')
191 | ->setLoadOptionsQueryPreparer(function($element, $query) {
192 | //любая своя логика либо скоуп
193 | return $query->active();
194 | })
195 | ->setPlaceholder('Все отправители'),
196 |
197 | //другое
198 | AdminColumnFilter::select()
199 | ->setOptions([
200 | 'http://' => 'Внешние изображения',
201 | 'https://' => 'Внешние изображения 2',
202 | 'http' => 'Внешние все',
203 | ])
204 | ->setWidth('20rem')
205 | ->setOperator(\SleepingOwl\Admin\Contracts\Display\Extension\FilterInterface::BEGINS_WITH)
206 | ->setColumnName('image')
207 | ->setPlaceholder('Все'),
208 | ```
209 |
210 |
211 | ## Range
212 | Фильтрация данных по диазону.
213 |
214 |
215 | ### setInline(true) (dev или v7.20 +)
216 | Выравнивание инпутов Range в одну строку
217 |
218 |
219 | ### setFrom
220 | Указание поля начала диапазона
221 |
222 | ```php
223 | static::setFrom(ColumnFilterInterface $from): return self
224 | ```
225 |
226 | ### setTo
227 | Указание поля конца диапазона
228 |
229 | ```php
230 | static::setTo(ColumnFilterInterface $from): return self
231 | ```
232 |
--------------------------------------------------------------------------------
/docs/ru/columns.md:
--------------------------------------------------------------------------------
1 | # Столбцы
2 |
3 | - [Введение](#Введение)
4 | - [Поддерживаемые типы](#Поддерживаемые-типы-types)
5 | - [Заголовок столбца](#Заголовок-столбца)
6 | - [API](#api)
7 | - [Типы](#Типы)
8 | - [Action](#action)
9 | - [Checkbox](#checkbox)
10 | - [Checkbox Inline Editable](#checkbox-editable)
11 | - [Count](#count)
12 | - [Custom](#custom)
13 | - [DateTime](#datetime)
14 | - [Link](#link)
15 | - [RelatedLink](#related-link)
16 | - [Url](#url)
17 | - [Text](#text)
18 | - [Count](#count)
19 | - [Email](#email)
20 | - [Image](#image)
21 | - [Lists](#lists)
22 | - [Order](#order)
23 | - [Control](#control)
24 | - [Работа с Relation данными](#Работа-с-relation-данными)
25 |
26 |
27 | *Расширение для класса [отображения данных](displays)*
28 |
29 |
30 |
31 | ## Введение
32 |
33 | Данные классы предназначены для добавления колонок в таблицу, а также вывода информации из модели в форме редактирования.
34 |
35 | **Пример использования**
36 |
37 | ```php
38 | AdminDisplay::table()
39 | ->setColumns([
40 | AdminColumn::link('title')->setLabel('Title'),
41 | AdminColumn::datetime('date')->setLabel('Date')->setFormat('d.m.Y')->setWidth('150px')
42 | ])
43 | ```
44 |
45 | ```php
46 | AdminForm::panel()
47 | ->addBody([
48 | AdminColumn::datetime('date')->setLabel('Date')->setFormat('d.m.Y')
49 | ])
50 | ```
51 |
52 | Класс `SleepingOwl\Admin\Display\TableColumn`, от которого наследуются
53 | все столбцы, реализует интерфейсы `Illuminate\Contracts\Support\Arrayable`,
54 | `Illuminate\Contracts\Support\Renderable` и `SleepingOwl\Admin\Contracts\Initializable`.
55 |
56 |
57 | ## Поддерживаемые типы
58 |
59 | - `AdminColumn::text($name, $label = null)`
60 | - `AdminColumn::datetime($name, $label = null)`
61 | - `AdminColumn::link($name, $label = null)`
62 | - `AdminColumn::relatedLink($name, $label = null)`
63 | - `AdminColumn::count($name, $label = null)`
64 | - `AdminColumn::custom($label = null, \Closure $callback = null)`
65 | - `AdminColumn::image($name, $label = null)`
66 | - `AdminColumn::email($name, $label = null)`
67 | - `AdminColumn::lists($name, $label = null)`
68 | - `AdminColumn::url($name, $label = null)`
69 | - `AdminColumn::action($name)`
70 | - `AdminColumn::checkbox($label = null)`
71 | - `AdminColumn::control($label = null)`
72 | - `AdminColumn::filter($name, $label = null)`
73 | - `AdminColumn::order()`
74 | - `AdminColumn::treeControl()`
75 | - `AdminColumnEditable::checkbox($name, $checkedLabel = null, $uncheckedLabel = null)`
76 |
77 |
78 | ## Заголовок столбца
79 |
80 | Каждый столбец таблицы имеет заголовок и хранится в виде отдельного класса
81 | `SleepingOwl\Admin\Contracts\Display\TableHeaderColumnInterface`.
82 |
83 | **Пример работы с заголовком**
84 |
85 | ```php
86 | ...
87 | ->setColumns([
88 | ...
89 | AdminColumn::link('title')->setLabel('Title')->setOrderable(false),
90 | ...
91 | ]);
92 | ```
93 |
94 | **Или работая напрямую с классом заголовка**
95 | ```php
96 | ...
97 | ->setColumns([
98 | ...
99 | $link = AdminColumn::link('title')
100 | ...
101 | ]);
102 |
103 | $link->getHeader()
104 | ->setTitle('Title')
105 | ->setOrderable(false)
106 | ->setHtmlAttribute('class', 'bg-success text-center')
107 | ->setHtmlAttribute('data-tooltip', 'Test tooltip');
108 | ```
109 |
110 |
111 |
112 | ## API
113 |
114 |
115 | ## Методы доступные во всех элементах
116 | В классах колонок используется трейт
117 | - [HtmlAttributes](html_attributes), с помощью которого для них можно настраивать HTML атрибуты.
118 | - [Assets](assets#assets-trait), с помощью которого для них можно подключать ассеты.
119 |
120 |
121 | #### setLabel
122 | Установка заголовка колонки
123 |
124 | SleepingOwl\Admin\Display\TableColumn::setLabel(string $title): return self
125 |
126 | #### setName
127 | Установка ключа элемента
128 |
129 | SleepingOwl\Admin\Contracts\NamedColumnInterface::setName(string $name): return self
130 |
131 | #### setWidth
132 | Установка ширины колонки
133 |
134 | SleepingOwl\Admin\Display\TableColumn::setWidth(string $width): return self
135 |
136 | #### setView
137 | Установки view
138 |
139 | SleepingOwl\Admin\Display\TableColumn::setView(string|\Illuminate\View\View $view): return self
140 |
141 | #### append
142 |
143 | SleepingOwl\Admin\Display\TableColumn::append(\SleepingOwl\Admin\Contracts\ColumnInterface $append): return self
144 |
145 | #### setOrderable
146 | Указание правила сортировки колонки таблицы. По умолчанию все колонки сортируются `->orderBy(column, direction)`
147 |
148 | SleepingOwl\Admin\Display\TableColumn::setOrderable(false|SleepingOwl\Admin\Contracts\Display\OrderByClauseInterface|Closure|string $orderable): return self
149 |
150 | В случае необходимости вы можете изменить правила сортировки столбца (Например для столбца с типом `custom`)
151 |
152 | ```php
153 | $display->setColumns([
154 | AdminColumn::custom(function($model)
155 | return $model->first_name.' '.$model->last_name;
156 | })->setOrderable(function($query, $direction) {
157 | $query->orderBy('last_name', $direction);
158 | })
159 |
160 | // Или просто передать ключ поля
161 | ->setOrderable('last_name')
162 |
163 | // Или с помощью класса реализующего интерфейс SleepingOwl\Admin\Contracts\Display\OrderByClauseInterface
164 | ->setOrderable(new CustomOrderByClause())
165 | ]);
166 | ```
167 |
168 | ## Типы
169 |
170 | ### Action
171 | `SleepingOwl\Admin\Display\Column\Action`
172 |
173 | Данный элемент используется для добавления Кнопки совершения какого либо действия с данными таблицы.
174 |
175 | !> Для работы элемента необходимо наличие поля `checkbox` в таблице**
176 |
177 | ```php
178 | $table = AdminDisplay::table()
179 | ->setActions([
180 | AdminColumn::action('export', 'Export')->setIcon('fa fa-share')->setAction(route('news.export')),
181 | ])
182 | ->setColumns([
183 | AdminColumn::checkbox(),
184 | ...
185 | ]);
186 |
187 | // Изменить расположение кнопок на странице
188 | $table->getActions()
189 | ->setPlacement('panel.buttons')
190 | ->setHtmlAttribute('class', 'pull-right');
191 | ```
192 |
193 | #### setTitle
194 | Установка названия кнопки
195 |
196 | SleepingOwl\Admin\Display\Column\Action::setTitle(string $title): return self
197 |
198 | #### setAction
199 | Установка ссылки, на которую будет отправлен запрос с выбранными элементами
200 |
201 | SleepingOwl\Admin\Display\Column\Action::setAction(string $action): return self
202 |
203 | #### setMethod
204 | Установка типа отправляемого запроса [POST, GET, ...]
205 |
206 | SleepingOwl\Admin\Display\Column\Action::setMethod(string $method): return self
207 |
208 | #### useGet
209 | Использовать GET запрос
210 |
211 | SleepingOwl\Admin\Display\Column\Action::useGet(): return self
212 |
213 | #### usePost
214 | Использовать POST запрос
215 |
216 | SleepingOwl\Admin\Display\Column\Action::usePost(): return self
217 |
218 |
219 | #### usePut
220 | Использовать PUT запрос
221 |
222 | SleepingOwl\Admin\Display\Column\Action::usePut(): return self
223 |
224 | #### useDelete
225 | Использовать DELETE запрос
226 |
227 | SleepingOwl\Admin\Display\Column\Action::useDelete(): return self
228 |
229 | #### setIcon
230 | Установка иконки для кнопки
231 |
232 | SleepingOwl\Admin\Display\Column\Action::setIcon(string $icon): return self
233 |
234 |
235 | ### Checkbox
236 | `SleepingOwl\Admin\Display\Column\Checkbox`
237 |
238 | Данный элемент предназначен для вывода чекбокса в таблице для выбора значений. Подробнее [Action](#action)
239 |
240 | ```php
241 | AdminColumn::checkbox(),
242 | ```
243 |
244 |
245 | ### CheckBox Editable
246 | `SleepingOwl\Admin\Display\Column\Editable\Checkbox`
247 | Данный элемент позволяет менять значение столбцов типа boolean прямо в таблице.
248 |
249 | ```php
250 | AdminColumnEditable::checkbox('visible')->setLabel('Отображение'),
251 | //or
252 | AdminColumnEditable::checkbox('visible','Видно', 'Не видно')->setLabel('Отображение'),
253 | ```
254 |
255 | #### setUrl
256 | Вы можете установить свой url для отправки данных и принятия их в Кастом контроллере
257 |
258 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setUrl(string $url): return self
259 |
260 | #### setCheckedLabel
261 | Отображаемый текст в таблице при значении True
262 |
263 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setCheckedLabel(string $label): return self
264 |
265 | #### setUncheckedLabel
266 | Отображаемый текст в таблице при значении False
267 |
268 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setUncheckedLabel(string $label): return self
269 |
270 |
271 | ### Custom
272 | `SleepingOwl\Admin\Display\Column\Custom`
273 |
274 | Данный элемент используется для добавления кастомного кода в качестве колонки таблицы
275 |
276 | ```php
277 | AdminColumn::custom($title, function(\Illuminate\Database\Eloquent\Model $model) {
278 | return $model->id;
279 | })->setWidth('150px'),
280 | ```
281 |
282 | #### setCallback
283 | Установка анонимной функции, которая будет вызвана для каждого элемента таблицы, с передачей в качестве аргумента объекта `Illuminate\Database\Eloquent\Model`
284 |
285 | SleepingOwl\Admin\Display\Column\Custom::setCallback(\Closure $callback): return self
286 |
287 |
288 | ### DateTime
289 | `SleepingOwl\Admin\Display\Column\DateTime`
290 |
291 | Данный элемент предназначен для вывода даты с указанием формата
292 |
293 | ```php
294 | AdminColumn::datetime('date', 'Date')->setFormat('d.m.Y')->setWidth('150px'),
295 | ```
296 |
297 | #### setFormat
298 | Указание формата даты
299 |
300 | SleepingOwl\Admin\Display\Column\DateTime::setFormat(string $format): return self
301 |
302 |
303 | ### Link
304 | `SleepingOwl\Admin\Display\Column\Link`
305 |
306 | Данный элемент предназначен для вывода данных модели в виде ссылки на текущий документ. Может содержать третий параметр (сноска будет не ссылкой).
307 |
308 | ```php
309 | AdminColumn::link('title', 'Title')->setLinkAttributes(['target' => '_blank']),
310 | ```
311 |
312 | со сноской (название рубрики, алиаса, даты создания и прочее)
313 |
314 | ```php
315 | AdminColumn::url('title', 'Title', 'news.category'),
316 | ```
317 |
318 | #### setLinkAttributes
319 | Установка атрибутов для ссылки
320 |
321 | SleepingOwl\Admin\Display\Column\Link::setLinkAttributes(array $linkAttributes): return self
322 |
323 |
324 | ### RelatedLink
325 | `SleepingOwl\Admin\Display\Column\RelatedLink`
326 |
327 | Данный элемент предназначен для вывода данных модели в виде ссылки на документ связанного раздела. Может содержать сноску третим параметром (сноска не будет ссылкой).
328 |
329 | ```php
330 | AdminColumn::relatedLink('author.name', 'Author')
331 | ```
332 |
333 | со сноской (название рубрики, алиаса, даты создания и прочее)
334 |
335 | ```php
336 | AdminColumn::relatedLink('title', 'Title', 'news.category'),
337 | ```
338 |
339 | #### setLinkAttributes
340 | Установка атрибутов для ссылки
341 |
342 | SleepingOwl\Admin\Display\Column\Link::setLinkAttributes(array $linkAttributes): return self
343 |
344 |
345 |
346 | ### URL
347 | `SleepingOwl\Admin\Display\Column\Url`
348 |
349 | Данный элемент предназначен для вывода значения поля в виде ссылки.
350 |
351 | ```php
352 | AdminColumn::url('title', 'Title'),
353 | ```
354 |
355 | #### setLinkAttributes
356 | Установка атрибутов для ссылки
357 |
358 | SleepingOwl\Admin\Display\Column\Url::setLinkAttributes(array $linkAttributes): return self
359 |
360 |
361 | ### Text
362 | `SleepingOwl\Admin\Display\Column\Text`
363 |
364 | Данный элемент предназначен для вывода значения поля в виде обычного текста. Может содержать сноску (не обязательно) третьим параметром.
365 |
366 | ```php
367 | AdminColumn::text('title', 'Title'),
368 | ```
369 |
370 | со сноской с любыми связаными полями из БД
371 |
372 | ```php
373 | AdminColumn::text('title', 'Title', 'created_at'),
374 | ```
375 |
376 |
377 | ### Count
378 | `SleepingOwl\Admin\Display\Column\Count`
379 |
380 | Данный элемент предназначен для подсчета и вывода кол-ва элементов. Подсчет значений производится функцией `count`, т.е. передаваемое поле должно содержать массив элементов либо элемент с отношением `*Many`
381 |
382 | ```php
383 | AdminColumn::count('list', 'Total'),
384 | ```
385 |
386 |
387 | ### Email
388 | `SleepingOwl\Admin\Display\Column\Email`
389 |
390 | Данный элемент предназначен для вывода полей содержащих email адрес в виде ссылки ``
391 |
392 | ```php
393 | AdminColumn::email('email', 'Email'),
394 | ```
395 |
396 |
397 | ### Image
398 | `SleepingOwl\Admin\Display\Column\Image`
399 |
400 | Данный элемент предназначен для вывода изображений
401 |
402 | ```php
403 | AdminColumn::image('avatar', 'Avatar'),
404 | ```
405 |
406 | #### setLazyLoad
407 | Принудительное указание использования ленивой загрузки изображения в таблицах
408 |
409 | Если не указано - берется значение из конфига
410 |
411 |
412 | #### setAssetPrefix
413 | Указание префикса для отображения изображения из стороннего ресурса
414 |
415 | ```php
416 | // $avatar = '/img/avatar.jpg';
417 | AdminColumn::image('avatar', 'Avatar')
418 | ->setAssetPrefix('https://foo.bar/assets'),
419 |
420 | //выдаст изображение https://foo.bar/assets/img/avatar.jpg
421 | //без setAssetPrefix будет asset('/img/avatar.jpg')
422 | ```
423 |
424 |
425 | #### setImageWidth
426 | Указание ширины изображения
427 |
428 | SleepingOwl\Admin\Display\Image::setImageWidth(string $width): return self
429 |
430 |
431 |
432 |
433 | ### Lists
434 | `SleepingOwl\Admin\Display\Column\Lists`
435 |
436 | Данный элемент предназначен для вывода списка значений поля содержащего массив элементов, либо связь с отношением `*Many`
437 |
438 | ```php
439 | AdminColumn::lists('roles.title', 'Roles') // Вывод списка ролей из связанной таблицы
440 |
441 | // or
442 |
443 | AdminColumn::lists('tags', 'Tags') // Вывод списка тегов из поля содержащего массив тегов
444 | ```
445 |
446 | #### setSortable (true)
447 | Принудительная сортировка списка по значению
448 |
449 | #### Цвета бейджей
450 | Специально для изменения цвета бейджей списка предусмотрены классы. Цвета соответствуют основным цветам bootstrap. Пример: `->setHtmlAttribute('class', 'badge-list-secondary')`
451 |
452 |
453 | ### Order
454 | `SleepingOwl\Admin\Display\Column\Order`
455 |
456 | Данный элемент предназначен для сортировки элементов таблицы. **Модель к которой применяется это поле должна содержать трейт `SleepingOwl\Admin\Traits\OrderableModel`**. По умолчанию, поле по которому производится сортировка - `order`. Для указания альтернативного ключа необходимо в модели добавить метод:
457 |
458 | ```php
459 | class Users extend Model {
460 | use \SleepingOwl\Admin\Traits\OrderableModel;
461 |
462 | ...
463 |
464 | /**
465 | * Get order field name.
466 | * @return string
467 | */
468 | public function getOrderField()
469 | {
470 | return 'custom_order_field_name';
471 | }
472 | }
473 | ```
474 |
475 | Также для корректности отображения записей в таблице не забывайте при выводе сортировать записи по этому полю `->orderBy('order', 'asc')`
476 |
477 |
478 |
479 |
480 | ### Control
481 | `SleepingOwl\Admin\Display\Column\Control`
482 |
483 | Данный элемент используется в табличном выводе для отображения кнопок действий связанных с элементом таблицы. Данный элемент добавляется автоматически ко всем элементам таблицы и предоставляет следующие действия
484 | - Редактирование элемента
485 | - Удаление
486 | - Восстановление
487 |
488 | **Получение доступа к данному элементу**
489 | ```php
490 | $display = AdminDisplay::table()->...;
491 |
492 | $display->getColumns()->getControlColumn(); // return SleepingOwl\Admin\Display\Column\Control
493 | ```
494 |
495 | При необходимости вы можете добавлять в таблицу дополнительные действия над элементом:
496 |
497 | ```php
498 | $control = $display->getColumns()->getControlColumn();
499 |
500 | $link = new \SleepingOwl\Admin\Display\ControlLink(function (\Illuminate\Database\Eloquent\Model $model) {
501 | return 'http://localhost/'.$model->getKey(); // Генерация ссылки
502 | }, 'Button text', 50);
503 |
504 | $control->addButton($link);
505 |
506 | $button = new \SleepingOwl\Admin\Display\ControlButton(function (\Illuminate\Database\Eloquent\Model $model) {
507 | return 'http://localhost/delete/'.$model->getKey(); // Генерация ссылки
508 | }, 'Button text', 50);
509 |
510 | // Изменение метода сабмита формы кнопки
511 | $button->setMethod('delete');
512 |
513 | // Скрытие текста из кнопки
514 | $button->hideText();
515 |
516 | // Добавление иконки
517 | $button->setIcon('fa fa-trash');
518 |
519 | // Добавление изображения
520 | $button->setImage('/images/foo.png');
521 |
522 | // Дополнительные HTML атрибуты для кнопки
523 | $button->setHtmlAttribute('class', 'btn-danger btn-delete');
524 |
525 | //Добавление атрибутов по условию
526 | //Атрибуты установленные в этом методе перекрывают атрибуты
527 | //установленные методами setHtmlAttribute/setHtmlAttributes
528 | $link->setAttributeCondition(function(Model $model) {
529 | if (isset($model->id)) {
530 | return ['class' => "btn-id-{$model->id}"];
531 | }
532 |
533 | return ['class' => 'btn-danger'];
534 | });
535 |
536 | // Условие видимости кнопки (не обязательно)
537 | $button->setCondition(function(\Illuminate\Database\Eloquent\Model $model) {
538 | return auth()->user()->can('delete', $model);
539 | });
540 |
541 | $control->addButton($button);
542 | ```
543 |
544 | Также в ControlLink в качестве второго параметра (отвечает за текст на кнопке) можно передавать функцию-замыкание, по аналогии с первым параметром (отвечает за url-адрес ссылки). Это дает возможность генерировать динамические заголовки на кнопке для каждой строки в таблице, например, выводить туда название каждой конкретной модели и/или кол-во записей из какой-либо связи этой модели:
545 |
546 | ```php
547 | $link = new \SleepingOwl\Admin\Display\ControlLink(function (\Illuminate\Database\Eloquent\Model $model) {
548 | return 'http://localhost/'.$model->getKey(); // Генерация ссылки
549 | }, function (\Illuminate\Database\Eloquent\Model $model) {
550 | return $model->title . ' (' . $model->images_count . ')'; // Генерация текста на кнопке
551 | }, 50);
552 | ```
553 |
554 | **На данный момент существует два класса кнопок**
555 | - `SleepingOwl\Admin\Display\ControlButton` - кнопка внутри формы для сабмита
556 | - `SleepingOwl\Admin\Display\ControlLink` - кнопка ссылка
557 |
558 | Также вы можете добавлять свои классы кнопок, реализовав интерфейс `SleepingOwl\Admin\Contracts\Display\ControlButtonInterface`
559 |
560 |
561 |
562 | ## Работа с Relation данными
563 |
564 | Большинство колонок могут использовать связи модели.
565 |
566 | Допустим у вас есть модель `App\User` и у данной модели есть связь многие ко многим `App\Role` и связь один к одному `App\Department`, т.е. пользователь может иметь несколько ролей и принадлежать отделу.
567 |
568 | **Прежде всего для моделей необходимо [настроить связи](https://laravel.com/docs/eloquent-relationships)**
569 |
570 | Для получения списка названий ролей нам необходимо выполнить что-то вроде `$user->roles->pluck('title')`, что равноценно получению данных в колонке (`roles.title`), т.е. когда класс попытается получить значение по данному ключу, он разобьет данный ключ на массив по знаку `.` и сделает следующее:
571 |
572 | ```php
573 | // Попытается получить данные по первому сегменту
574 | $roles = $user->getAttribute('roles'); // Вернет список ролей (коллекцию Collection моделей App\Role)
575 | $value = $roles->pluck('title');
576 | ```
577 |
578 | Для получения названия департамента нам необходимо выполнить что-то вроде `$user->department->title`, что равноценно получению данных в колонке (`department.title`), т.е. когда класс попытается получить значение по данному ключу, он разобьет данный ключ на массив по знаку `.` и сделает следующее:
579 |
580 | ```php
581 | // Попытается получить данные по первому сегменту
582 | $department = $user->getAttribute('department'); // Вернет объект App\Department
583 | $value = $department->getAttribute('title');
584 | ```
585 |
586 | Как мы видим работа с Relation данными достаточно проста, главное правильно настроить связи в моделях.
587 |
--------------------------------------------------------------------------------
/docs/ru/columns_editable.md:
--------------------------------------------------------------------------------
1 | # Столбцы Editable
2 |
3 | - [Введение](#Введение)
4 | - [Поддерживаемые типы](#Поддерживаемые-типы)
5 | - [Заголовок столбца](#Заголовок-столбца)
6 | - [API](#api)
7 | - [Типы](#Типы)
8 | - [Checkbox](#checkbox-editable)
9 | - [Text](#text-editable)
10 | - [Textarea](#textarea-editable)
11 | - [Date](#date-editable)
12 | - [DateTime](#datetime-editable)
13 | - [Select](#select-editable)
14 |
15 |
16 | *Расширение для класса [отображения данных](displays)*
17 |
18 |
19 | ## Введение
20 |
21 | Данные классы предназначены для добавления редактируемых колонок в таблицу. Данные колонки реализованы с помощь библиотеки [X-editable v1.5.4](http://vitalets.github.io/x-editable/)
22 |
23 | **Пример использования**
24 |
25 | ```php
26 | ...
27 | use AdminColumnEditable;
28 | ...
29 |
30 | AdminDisplay::table()
31 | ->setColumns([
32 | AdminColumnEditable::text('name')->setLabel('Название'),
33 | AdminColumnEditable::textarea('content')->setLabel('Описание'),
34 | AdminColumnEditable::datetime('updated_at', 'Updated At'),
35 | AdminColumnEditable::date('date', 'Date'),
36 | AdminColumnEditable::select('category_id')->setWidth('250px')
37 | ->setModelForOptions(new Category)
38 | ->setLabel('Категория')
39 | ->setDisplay('name')
40 | ->setLoadOptionsQueryPreparer(function($element, $query) {
41 | return $query->MyScoupe();
42 | })->setTitle('Выберите категорию:'),
43 |
44 | AdminColumnEditable::checkbox('visible')->setLabel('Отображение')->setWidth('30px'),
45 |
46 |
47 | ])
48 | ...
49 | ```
50 |
51 | Класс `SleepingOwl\Admin\Display\TableColumn`, от которого наследуются
52 | все столбцы, реализует интерфейсы `Illuminate\Contracts\Support\Arrayable`,
53 | `Illuminate\Contracts\Support\Renderable` и `SleepingOwl\Admin\Contracts\Initializable`.
54 |
55 |
56 | ## Поддерживаемые типы
57 |
58 | - `AdminColumnEditable::text($name, $label = null)`
59 | - `AdminColumnEditable::select($name, $label = null)`
60 | - `AdminColumnEditable::textarea($name, $label = null)`
61 | - `AdminColumnEditable::date($name, $label = null)`
62 | - `AdminColumnEditable::datetime($name, $label = null)`
63 | - `AdminColumnEditable::checkbox($name, $checkedLabel = null, $uncheckedLabel = null)`
64 |
65 |
66 |
67 | ## Заголовок столбца
68 |
69 | Каждый столбец таблицы имеет заголовок и хранится в виде отдельного класса
70 | `SleepingOwl\Admin\Contracts\Display\TableHeaderColumnInterface`.
71 |
72 | **Пример работы с заголовком**
73 |
74 | ```php
75 | ...
76 | ->setColumns([
77 | ...
78 | AdminColumn::link('title')->setLabel('Title')->setOrderable(false),
79 | ...
80 | ]);
81 | ```
82 |
83 | **Или работая напрямую с классом заголовка**
84 | ```php
85 | ...
86 | ->setColumns([
87 | ...
88 | $link = AdminColumn::link('title')
89 | ...
90 | ]);
91 |
92 | $link->getHeader()
93 | ->setTitle('Title')
94 | ->setOrderable(false)
95 | ->setHtmlAttribute('class', 'bg-success text-center')
96 | ->setHtmlAttribute('data-tooltip', 'Test tooltip');
97 | ```
98 |
99 |
100 |
101 | ## API
102 |
103 |
104 | ## Методы доступные во всех элементах
105 | Во всех Editable элементах доступны методы обычных [столбцов таблиц](https://sleepingowladmin.ru/docs/columns#api)
106 |
107 | Помимо этого существуют специальные методы.
108 |
109 |
110 | #### setUrl
111 | Вы можете установить свой url для отправки данных и принятия их в Кастом контроллере
112 |
113 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setUrl(string $url): return self
114 |
115 | #### setTitle
116 | Установка сообщения в форме редактирования значения.
117 |
118 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setTitle(string $title): return self
119 |
120 | #### setReadonly
121 | Позволяет задать, будет ли данный эдитабл редактируемым или отобразится просто текстом. Имеет более низкий приоритет, чем политика на редактирование записи (если запись запрещено изменять политикой - эдитабл будет текстом)
122 |
123 | __Пример:__
124 | ```php
125 | AdminColumnEditable::textarea('description', 'Textarea')
126 | ->setReadonly(function($item) {
127 | return $item->id > 5;
128 | }),
129 |
130 | AdminColumnEditable::text('title', 'Title1')
131 | ->setReadonly(true)
132 | ```
133 |
134 |
135 | #### setEditableMode
136 | Устанавливает способ появления формы редактирования. Внутри ячейки - 'inline' или по умолчанию во всплывающем окне - 'popup'
137 |
138 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setEditableMode(string $mode): return self
139 |
140 |
141 | ## Типы
142 |
143 |
144 |
145 | ### CheckBox Editable
146 | `SleepingOwl\Admin\Display\Column\Editable\Checkbox`
147 | Данный элемент позволяет менять значение столбцов типа boolean прямо в таблице.
148 |
149 | ```php
150 | AdminColumnEditable::checkbox('visible')->setLabel('Отображение'),
151 | //or
152 | AdminColumnEditable::checkbox('visible','Видно', 'Не видно')->setLabel('Отображение'),
153 | ```
154 |
155 |
156 |
157 | #### setCheckedLabel
158 | Отображаемый текст в таблице при значении True
159 |
160 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setCheckedLabel(string $label): return self
161 |
162 | #### setUncheckedLabel
163 | Отображаемый текст в таблице при значении False
164 |
165 | SleepingOwl\Admin\Display\Column\Editable\Checkbox::setUncheckedLabel(string $label): return self
166 |
167 |
168 |
169 | ### Text Editable
170 | `SleepingOwl\Admin\Display\Column\Editable\Text`
171 | Данный элемент позволяет менять текстовое значение прямо в таблице.
172 |
173 | ```php
174 | AdminColumnEditable::text('name')->setLabel('Имя'),
175 | ```
176 |
177 |
178 |
179 | ### Textarea Editable
180 | `SleepingOwl\Admin\Display\Column\Editable\Textarea`
181 | Данный элемент позволяет менять текстовое значение прямо в таблице. В форме редактирования появится textarea.
182 |
183 | ```php
184 | AdminColumnEditable::textarea('description')->setLabel('Описание'),
185 | ```
186 |
187 |
188 |
189 | ### Date Editable
190 | `SleepingOwl\Admin\Display\Column\Editable\Date`
191 | Данный элемент позволяет менять текстовое значение прямо в таблице. В форме редактирования появится datepicker.
192 |
193 | ```php
194 | AdminColumnEditable::date('date')->setLabel('Дата'),
195 | ```
196 |
197 |
198 |
199 | ### DateTime Editable
200 | `SleepingOwl\Admin\Display\Column\Editable\Datetime`
201 | Данный элемент позволяет менять текстовое значение прямо в таблице. В форме редактирования появится datepicker с выбором дня и времени.
202 |
203 | ```php
204 | AdminColumnEditable::datetime('updated_at')->setLabel('Изменено'),
205 | ```
206 |
207 |
208 |
209 | ### Select Editable
210 | `SleepingOwl\Admin\Display\Column\Editable\Select`
211 | Данный элемент позволяет менять текстовое значение прямо в таблице. В форме редактирования появится datepicker с выбором дня и времени.
212 |
213 | ```php
214 | AdminColumnEditable::select('country_id')
215 | ->setModelForOptions(new Country)
216 | ->setLabel('label')
217 | ->setDisplay('title')
218 | ```
219 |
--------------------------------------------------------------------------------
/docs/ru/configuration.md:
--------------------------------------------------------------------------------
1 | # Конфигурация
2 |
3 | [php artisan sleepingowl:install](installation#artisan) во время установки автоматически публикует конфиг `sleeping_owl.php`.
4 |
5 | Если вы хотите опубликовать конфиг вручную выполните эту команду:
6 | ```bash
7 | $ php artisan vendor:publish --provider="SleepingOwl\Admin\Providers\SleepingOwlServiceProvider" --tag="config"
8 | ```
9 |
10 | ## Параметры конфигурации
11 | - [Главные](#main)
12 | - [Datatables](#datatables)
13 | - [Другие](#other)
14 | - [ENV-настройки](#env-settings)
15 | - [Автообновление Datatables](#autoupdate)
16 |
17 |
18 |
19 | #### `title`
20 | Строка для отображения в заголовке страницы
21 |
22 | #### `logo`
23 | Логотип отображаемый в верхней панеле
24 |
25 | #### `logo_mini`
26 | Логотип отображаемый в верхней панели при минимизированной боковой панели
27 |
28 | #### `menu_top` (только в v.6+)
29 | Текст отображаемый над меню
30 |
31 |
32 | #### `state_datatables` (только в v.6+) (default: `true`)
33 | Сохранение состояния DataTables в localStorage
34 |
35 | #### `state_tabs` (только в v.6+) (default: `false`)
36 | Сохранение активности табов
37 |
38 | #### `state_filters` (только в v.6+) (default: `false`)
39 | Сохранение значений фильтров в datatables
40 |
41 |
42 | #### `url_prefix` (default: `'admin'`)
43 | Префикс адреса для административного модуля
44 |
45 | #### `domain` (default: `false`)
46 | Включение/отключение поддержки субдомена для админки
47 |
48 | #### `middleware` (default: `['web', 'auth']`)
49 | Посредник, который ограничивают административный модуль от доступа неавторизованных пользователей
50 |
51 |
52 | #### `enable_editor` (default: `false`)
53 | Включение и добавление редактирования настроек
54 |
55 | #### `env_keys_readonly` (default: `false`)
56 | Делает поле ключей только для просмотра
57 |
58 | #### `env_can_delete` (default: `true`)
59 | Разрешает/запрещает удалять ключ/значение
60 |
61 | #### `env_can_add` (default: `true`)
62 | Разрешает/запрещает добавлять ключ/значение (при условии что `env_keys_readonly == false`)
63 |
64 | #### `env_editor_url` (default: `'env/editor'`)
65 | URL, для редактирования env файла настроек
66 |
67 | #### `env_editor_policy` (default: `null`)
68 | Добавление политики
69 |
70 | #### `env_editor_excluded_keys`
71 | Массив ключей или масок ключей для скрытия в редакторе файла настроек
72 | ```php
73 | 'env_editor_excluded_keys' => [
74 | 'APP_KEY', 'DB_*',
75 | ],
76 | ```
77 |
78 | #### `env_editor_middlewares` (default: `[]`)
79 | Добавление посредника для редактирование настроек
80 |
81 | #### `auth_provider` (default: `'users'`)
82 | Провайдер авторизации пользователей. [Custom User Providers](https://laravel.com/docs/authentication#adding-custom-user-providers)
83 |
84 | #### `bootstrapDirectory` (default: `app_path('Admin')`)
85 | Путь к директории автозапуска SleepingOwl Admin
86 |
87 | #### `imagesUploadDirectory` (default: `'images/uploads'`)
88 | Путь к директории изображений относительно `public`
89 |
90 | #### `filesUploadDirectory` (default: `'files/uploads'`)
91 | Путь к директории файлов относительно `public`
92 |
93 | #### `template` (default: `SleepingOwl\Admin\Templates\TemplateDefault::class`)
94 | Класс используемого шаблона, должен быть унаследован от `SleepingOwl\Admin\Contracts\TemplateInterface`
95 |
96 | #### `datetimeFormat` (default: `'d.m.Y H:i'`)
97 | #### `dateFormat` (default: `'d.m.Y'`)
98 | #### `timeFormat` (default: `'H:i'`)
99 | Формат даты и времени для использования в столбцах и элементах формы по умолчанию
100 |
101 | #### `wysiwyg`
102 | Настройки для Wysiwyg редакторов текста по умолчанию
103 |
104 | #### `datatables` (default: `[]`)
105 | Настройки datatables по умолчанию
106 |
107 | #### `datatables_highlight` (default: `false`)
108 | Подсветка столбцов DataTables при наведении мыши (глобальное включение / выключение).
109 | Для включения на определенной datatable - добавить класс `.lightcolumn`
110 |
111 | ```php
112 | //config
113 | 'datatables_highlight' => true,
114 |
115 | //Section
116 | //.table-primary, .table-secondary, .table-info, .table-success, .table-warning, .table-danger
117 | //.table-light, .table-gray, .table-white, .table-black, .table-red, .table-dark
118 | $display = AdminDisplay::datatablesAsync()
119 | ->setHtmlAttribute('class', 'table-primary table-striped table-hover lightcolumn');
120 | ```
121 |
122 |
123 | #### `dt_autoupdate` (default: `false`)
124 | Включение/отключение автообновления datatables
125 |
126 | #### `dt_autoupdate_interval` (default: `5`)
127 | Время обновления datatables в минутах
128 |
129 | #### `dt_autoupdate_class` (default: `''`)
130 | Класс автообновления. Если не задано все datatables будут с автообновлением
131 |
132 | #### `dt_autoupdate_color` (default: `'#dc3545'`)
133 | Цвет прогрессбара автообновления таблиц
134 |
135 | #### `breadcrumbs` (default: `true`)
136 | Включение/отключение хлебных крошек
137 |
138 | #### `scroll_to_top` (default: `true`)
139 | Включение/отключение кнопки перехода вверх на странице
140 |
141 | #### `scroll_to_bottom` (default: `true`)
142 | Включение/отключение кнопки перехода вниз страницы
143 |
144 | #### `imageLazyLoad`
145 | Включение/отключение ленивой загрузки изображений в таблицах и дататаблицах
146 |
147 | #### `imageLazyLoadFile`
148 | Изображение по умолчанию для отображения не загруженных страниц. Можно указать пустое изображение через `data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==` либо указать путь относительно паблик папки
149 |
150 |
151 | #### `aliases`
152 | Алиасы, которые инициализируются пакетом
153 |
154 |
155 | ## Следующий шаг
156 | - [Описание работы системы](ru/global)
157 | - [Авторизация](ru/authentication)
158 |
--------------------------------------------------------------------------------
/docs/ru/extend.md:
--------------------------------------------------------------------------------
1 | # Добавление новых элементов
2 |
3 | - [Display](#display)
4 | - [Column](#column)
5 | - [Column Editable](#column-editable)
6 | - [Column Filter](#column-filter)
7 | - [Filter](#display-filter)
8 | - [Form](#form)
9 | - [Element](#form-element)
10 |
11 |
12 | Для расширения возможностей админ панели вы можете создавать свои классы и использовать их в качестве элементов.
13 |
14 | **Пример**
15 |
16 | ```php
17 | $display = \AdminDisplay::table();
18 | $display->setColumns([
19 | \AdminColumn::link('title') // Передача через фасад
20 | new \App\Display\Column\CustomColumn(...)
21 | ])
22 | ```
23 |
24 | Для удобства использования и возможности выноса элементов в отдельные пакеты в системе реализована регистрация классов
25 | через класс `SleepingOwl\Admin\AliasBinder`, который помогает связать класс с коротким именем и создавать новый объект
26 | при запросе класса по ключу.
27 |
28 | **Пример: допустим вы решили добавить новый элемент формы:**
29 | ```php
30 |
31 | class AppServiceProvider extends ServiceProvider
32 | {
33 | public function boot()
34 | {
35 | $formElementContainer = app('sleeping_owl.form.element');
36 |
37 | $formElementContainer->add('email', App\Form\Element::class);
38 | // или
39 | \AdminFormElement::add('email', App\Form\Element::class);
40 | }
41 | }
42 | ```
43 |
44 | Регистрация всех основных элементов происходит в классе [AliasesServiceProvider](https://github.com/LaravelRUS/SleepingOwlAdmin/blob/development/src/Providers/AliasesServiceProvider.php)
45 |
46 | Особенности при регистрации контейнеров рассмотрим отдельно для каждого типа.
47 |
48 |
49 | ## Display
50 |
51 | - Контейнер `sleeping_owl.display`
52 | - Фасад `AdminDisplay`
53 |
54 | При добавлении класса необходимо, чтобы он реализовывал интерфейс `SleepingOwl\Admin\Contracts\DisplayInterface`
55 | Для удобства существует абстрактный класс, в котором реализованы базовые возможности `SleepingOwl\Admin\Display\Display`
56 |
57 | #### Список доступных элементов
58 | ```php
59 | 'datatables' => \SleepingOwl\Admin\Display\DisplayDatatables::class,
60 | 'datatablesAsync' => \SleepingOwl\Admin\Display\DisplayDatatablesAsync::class,
61 | 'tab' => \SleepingOwl\Admin\Display\DisplayTab::class,
62 | 'tabbed' => \SleepingOwl\Admin\Display\DisplayTabbed::class,
63 | 'table' => \SleepingOwl\Admin\Display\DisplayTable::class,
64 | 'tree' => \SleepingOwl\Admin\Display\DisplayTree::class,
65 | 'page' => \SleepingOwl\Admin\Navigation\Page::class,
66 | ```
67 |
68 |
69 |
70 | ## Column
71 |
72 | - Контейнер `sleeping_owl.table.column`
73 | - Фасад `AdminColumn`
74 |
75 | При добавлении класса необходимо, чтобы он реализовывал интерфейс `SleepingOwl\Admin\Contracts\ColumnInterface`
76 | Для удобства существует абстрактный класс, в котором реализованы базовые возможности
77 | - `SleepingOwl\Admin\Display\TableColumn` - класс без привязки к Eloquent модели
78 | - `SleepingOwl\Admin\Display\Column\NamedColumn` - с привязкой к Eloquent модели
79 |
80 | #### Список доступных элементов
81 | ```php
82 | 'action' => \SleepingOwl\Admin\Display\Column\Action::class,
83 | 'checkbox' => \SleepingOwl\Admin\Display\Column\Checkbox::class,
84 | 'control' => \SleepingOwl\Admin\Display\Column\Control::class,
85 | 'count' => \SleepingOwl\Admin\Display\Column\Count::class,
86 | 'custom' => \SleepingOwl\Admin\Display\Column\Custom::class,
87 | 'datetime' => \SleepingOwl\Admin\Display\Column\DateTime::class,
88 | 'filter' => \SleepingOwl\Admin\Display\Column\Filter::class,
89 | 'image' => \SleepingOwl\Admin\Display\Column\Image::class,
90 | 'lists' => \SleepingOwl\Admin\Display\Column\Lists::class,
91 | 'order' => \SleepingOwl\Admin\Display\Column\Order::class,
92 | 'text' => \SleepingOwl\Admin\Display\Column\Text::class,
93 | 'link' => \SleepingOwl\Admin\Display\Column\Link::class,
94 | 'relatedLink' => \SleepingOwl\Admin\Display\Column\RelatedLink::class,
95 | 'email' => \SleepingOwl\Admin\Display\Column\Email::class,
96 | 'treeControl' => \SleepingOwl\Admin\Display\Column\TreeControl::class,
97 | ```
98 |
99 |
100 |
101 | ## Column Editable
102 |
103 | - Контейнер `sleeping_owl.table.column.editable`
104 | - Фасад `AdminColumnEditable`
105 |
106 | При добавлении класса необходимо, чтобы он реализовывал интерфейс
107 | - `SleepingOwl\Admin\Contracts\ColumnInterface`
108 | - `SleepingOwl\Admin\Contracts\Display\ColumnEditableInterface`
109 |
110 | #### Список доступных элементов
111 | ```php
112 | 'checkbox' => \SleepingOwl\Admin\Display\Column\Editable\Checkbox::class,
113 | ```
114 |
115 |
116 |
117 | ## Column Filter
118 |
119 | - Контейнер `sleeping_owl.column_filter`
120 | - Фасад `AdminColumnFilter`
121 |
122 | При добавлении класса необходимо, чтобы он реализовывал интерфейс `SleepingOwl\Admin\Contracts\ColumnFilterInterface`
123 | Для удобства существует абстрактный класс, в котором реализованы базовые возможности `SleepingOwl\Admin\Display\Column\Filter\BaseColumnFilter`
124 |
125 | #### Список доступных элементов
126 | ```php
127 | 'text' => \SleepingOwl\Admin\Display\Column\Filter\Text::class,
128 | 'date' => \SleepingOwl\Admin\Display\Column\Filter\Date::class,
129 | 'daterange' => \SleepingOwl\Admin\Display\Column\Filter\DateRange::class,
130 | 'range' => \SleepingOwl\Admin\Display\Column\Filter\Range::class,
131 | 'select' => \SleepingOwl\Admin\Display\Column\Filter\Select::class,
132 | ```
133 |
134 |
135 | ## Display Filter
136 |
137 | - Контейнер `sleeping_owl.display.filter`
138 | - Фасад `AdminDisplayFilter`
139 |
140 | При добавлении класса необходимо, чтобы он реализовывал интерфейс `SleepingOwl\Admin\Contracts\FilterInterface`
141 | Для удобства существует абстрактный класс, в котором реализованы базовые возможности `SleepingOwl\Admin\Display\Filter\FilterBase`
142 |
143 | #### Список доступных элементов
144 | ```php
145 | 'field' => \SleepingOwl\Admin\Display\Filter\FilterField::class,
146 | 'scope' => \SleepingOwl\Admin\Display\Filter\FilterScope::class,
147 | 'custom' => \SleepingOwl\Admin\Display\Filter\FilterCustom::class,
148 | 'related' => \SleepingOwl\Admin\Display\Filter\FilterRelated::class,
149 | ```
150 |
151 |
152 | ## Form
153 |
154 | - Контейнер `sleeping_owl.display.filter`
155 | - Фасад `AdminDisplayFilter`
156 |
157 | При добавлении класса необходимо, чтобы он реализовывал интерфейс
158 | - `SleepingOwl\Admin\Contracts\FormInterface`
159 | - `SleepingOwl\Admin\Contracts\DisplayInterface`
160 |
161 | Для удобства класс формы можно наследовать от `SleepingOwl\Admin\Form\FormDefault`
162 |
163 | #### Список доступных элементов
164 | ```php
165 | 'form' => \SleepingOwl\Admin\Form\FormDefault::class,
166 | 'elements' => \SleepingOwl\Admin\Form\FormElements::class,
167 | 'tabbed' => \SleepingOwl\Admin\Form\FormTabbed::class,
168 | 'panel' => \SleepingOwl\Admin\Form\FormPanel::class,
169 | ```
170 |
171 |
172 | ## Form Element
173 |
174 | - Контейнер `sleeping_owl.form.element`
175 | - Фасад `AdminFormElement`
176 |
177 | При добавлении класса необходимо, чтобы он реализовывал интерфейс `SleepingOwl\Admin\Contracts\FormElementInterface`
178 | Для удобства существует абстрактный класс, в котором реализованы базовые возможности
179 | - `SleepingOwl\Admin\Form\FormElement` - класс без привязки к Eloquent модели
180 | - `SleepingOwl\Admin\Form\Element\NamedFormElement` - с привязкой к Eloquent модели
181 |
182 | #### Список доступных элементов
183 | ```php
184 | 'columns' => \SleepingOwl\Admin\Form\Columns\Columns::class,
185 | 'text' => \SleepingOwl\Admin\Form\Element\Text::class,
186 | 'time' => \SleepingOwl\Admin\Form\Element\Time::class,
187 | 'date' => \SleepingOwl\Admin\Form\Element\Date::class,
188 | 'daterange' => \SleepingOwl\Admin\Form\Element\DateRange::class,
189 | 'timestamp' => \SleepingOwl\Admin\Form\Element\Timestamp::class,
190 | 'textaddon' => \SleepingOwl\Admin\Form\Element\TextAddon::class,
191 | 'select' => \SleepingOwl\Admin\Form\Element\Select::class,
192 | 'multiselect' => \SleepingOwl\Admin\Form\Element\MultiSelect::class,
193 | 'hidden' => \SleepingOwl\Admin\Form\Element\Hidden::class,
194 | 'checkbox' => \SleepingOwl\Admin\Form\Element\Checkbox::class,
195 | 'ckeditor' => \SleepingOwl\Admin\Form\Element\CKEditor::class,
196 | 'custom' => \SleepingOwl\Admin\Form\Element\Custom::class,
197 | 'password' => \SleepingOwl\Admin\Form\Element\Password::class,
198 | 'textarea' => \SleepingOwl\Admin\Form\Element\Textarea::class,
199 | 'view' => \SleepingOwl\Admin\Form\Element\View::class,
200 | 'image' => \SleepingOwl\Admin\Form\Element\Image::class,
201 | 'images' => \SleepingOwl\Admin\Form\Element\Images::class,
202 | 'file' => \SleepingOwl\Admin\Form\Element\File::class,
203 | 'radio' => \SleepingOwl\Admin\Form\Element\Radio::class,
204 | 'wysiwyg' => \SleepingOwl\Admin\Form\Element\Wysiwyg::class,
205 | 'upload' => \SleepingOwl\Admin\Form\Element\Upload::class,
206 | 'html' => \SleepingOwl\Admin\Form\Element\Html::class,
207 | 'number' => \SleepingOwl\Admin\Form\Element\Number::class,
208 | 'dependentselect' => \SleepingOwl\Admin\Form\Element\DependentSelect::class,
209 | ```
--------------------------------------------------------------------------------
/docs/ru/fast_start.md:
--------------------------------------------------------------------------------
1 | # Быстрый старт
2 |
3 | - [Демо версия](#demo)
4 | - [Создание простого CRUD в SOA для Чайников](#crud-create)
5 | - [Чат](#chat)
6 |
7 |
8 | ## Демо версия
9 | После установки пользователь получает пустую админку и не знает куда же двигаться дальше.
10 | Самым простым вариантом будет клонирование [Demo](http://demo.sleepingowladmin.ru/admin) и изучение на ней основных возможностей.
11 |
12 | ```
13 | git clone https://github.com/SleepingOwlAdmin/demo demo.soa
14 | ```
15 | После клонирования создайте .env файл копированием .env.example и заполните настройки базы данных.
16 |
17 | Поочередно запустите:
18 | ```
19 | composer install
20 | ...
21 | composer update
22 | ...
23 | php artisan key:generate
24 | ...
25 | php artisan migrate --seed
26 | ```
27 | Демо версия готова. SleepingOwlAdmin находится в папке \Admin
28 |
29 | Роуты \Admin\Http\routes.php
30 |
31 | Навигация \Admin\navigation.php
32 |
33 | Разделы \Admin\Http\Sections\
34 |
35 | Кастомные Представления и Представления Виджетов в Admin\resources\ и доступны по view('admin::name')
36 |
37 | Для вставки своего view (\Admin\resources\views\index.blade.php) в основной layout SOA используйте.
38 | ```
39 | use AdminSection;
40 | ...
41 | return AdminSection::view(view('admin::index',['variable'=>$variable]), 'Заголовок');
42 | ...
43 | ```
44 |
45 |
46 |
47 | ## Создание простого CRUD в SOA для Чайников
48 | Хорошая статья для новичков по созданию новой [секции CRUD](http://laravel.su/articles/laravel-sleeping-owl-crud-for-dummers)
49 |
50 |
51 |
52 | ## Чат SleepingOwlAdmin
53 | Если у вас возникли вопросы можно попросить совета в [Чате SleepingOwlAdmin](https://gitter.im/LaravelRUS/SleepingOwlAdmin)
--------------------------------------------------------------------------------
/docs/ru/filters.md:
--------------------------------------------------------------------------------
1 | # Фильтры данных
2 |
3 | - [Типы фильтров](#Типы-фильтров)
4 | - [Фильтр по полю](#Фильтр-по-полю)
5 | - [Фильтр по eloquent scopes](#Фильтр-по-eloquent-scopes)
6 | - [Произвольный фильтр](#Произвольный-фильтр)
7 |
8 | *Расширение для класса [отображения данных](displays)*
9 |
10 | Используются для фильтрации списка данных на основе параметров запроса. Являются разновидностью фильтрации данных, без использования формы.
11 |
12 | Т.е., например, у вас есть таблица с новостями из различных категорий (`category_id`) и вы хотите отобразить новости из определенной категории:
13 |
14 | ```php
15 | $display = AdminDisplay::table()
16 | ->setFilters(
17 | AdminDisplayFilter::field('category_id')->setTitle('Category ID [:value]')
18 | )
19 | ->setColumns(
20 | AdminColumn::link('title', 'Заголовок'),
21 | AdminColumn::link('category', 'Категория'),
22 | AdminColumn::datetime('created_at', 'Дата публикации')->setWidth('150px')
23 | )->paginate(20);
24 | ```
25 |
26 | В этом примере показан простейший пример применения фильтра. И если теперь в браузере указать `?category_id=1`, то при формировании запроса для выборки данных в него будет вставлено условие `where category_id = 1` и в заголовке таблицы будет отображена строка `Category ID [1]`
27 |
28 |
29 | ### Типы фильтров:
30 | - Фильтр по полю
31 | - Фильтр по [eloquent scopes](https://laravel.com/docs/eloquent#query-scopes)
32 | - Произвольный фильтр
33 |
34 | ## API (Методы доступные во всех фильтрах)
35 |
36 | #### setName
37 | Указание ключа поля, по которому будет производиться фильтрация
38 |
39 | SleepingOwl\Admin\Display\Filter\FilterBase::setName(string $name): return self
40 |
41 | #### setAlias
42 | Указание алиаса для поля, который будет использоваться вместо ключа поля для получение значения из запроса.
43 |
44 | SleepingOwl\Admin\Display\Filter\FilterBase::setAlias(string $alias): return self
45 |
46 | ```php
47 | AdminDisplayFilter::field('category_id')->setAlias('category'); // ?category=1
48 | ```
49 |
50 | #### setTitle
51 | Указание заголовка в случае применения этого фильтра. Т.е. как только фильтр сработает, над списком результатов будет выведен заголовок для фильтра, если сработало несколько фильтров, то заголовки будут разделены знаком ` | `
52 |
53 | SleepingOwl\Admin\Display\Filter\FilterBase::setTitle(\Closure|string $title): return self
54 |
55 | ```php
56 | AdminDisplayFilter::field('category_id')->setTitle('Category ID [:value]');
57 |
58 | // or
59 |
60 | AdminDisplayFilter::field('category_id')->setTitle(function($value) {
61 | return "Category ID [{$value}]";
62 | });
63 | ```
64 |
65 | #### setValue
66 | Принудительное указание значения для фильтрации. **При указании значения фильтр не будет обращаться к параметрам запроса**
67 |
68 | SleepingOwl\Admin\Display\Filter\FilterBase::setValue(mixed $value): return self
69 |
70 |
71 | ```php
72 | AdminDisplayFilter::field('category_id')->setValue(1);
73 | ```
74 |
75 |
76 | ## Фильтр по полю
77 | Данный фильтр привязан к полю модели.
78 |
79 | ```php
80 | AdminDisplayFilter::field('category_id');
81 | ```
82 |
83 |
84 | ### API
85 |
86 | #### setOperator
87 | Указание оператора сравнения. Помимо обычного сравнения вы можете указать как именно фильтр должен проверять значение.
88 |
89 | SleepingOwl\Admin\Display\Filter\FilterBase::setOperator(string $operator): return self
90 |
91 | - `equal` - `column = value`
92 | - `not_equal` - `column != value`
93 | - `less` - `column < value`
94 | - `less_or_equal` - `column <= value`
95 | - `greater` - `column > value`
96 | - `greater_or_equal` - `column >= value`
97 | - `begins_with` - `column like value%`
98 | - `not_begins_with` - `column not like value%`
99 | - `contains` - `column like %value%`
100 | - `not_contains` - `column not like %value%`
101 | - `ends_with` - `column like %value`
102 | - `not_ends_with` - `column not like %value`
103 | - `is_empty` - `column = ''`
104 | - `is_not_empty` - `column != ''`
105 | - `is_null` - `column is null`
106 | - `is_not_null` - `column is not null`
107 | - `between` - `column between value`
108 | - `not_between` - `column not between value`
109 | - `in` - `column in value`
110 | - `not_in` - `column not in value`
111 |
112 | ```php
113 | AdminDisplayFilter::field('category_id')->setOperator('in'); // ?category_id[]=1&category_id[]=2&category_id[]=5
114 | ```
115 |
116 |
117 | ## Фильтр по eloquent scopes
118 | Этот фильтр будет применять `scope` ([eloquent scopes](https://laravel.com/docs/eloquent#query-scopes)) к вашему запросу. Допустим вы выводите список новостей и хотите иметь возможность фильтровать ваши записи по `scope`, который имеется в модели `App\Post`, с помощью которой вы формируете список.
119 |
120 | ```php
121 | orderBy('created_at', 'desc');
136 | }
137 |
138 | /**
139 | * @param $query
140 | *
141 | * @return \Illuminate\Database\Eloquent\Builder
142 | */
143 | public function scopeType($query, $type)
144 | {
145 | return $query->where('type', $type);
146 | }
147 | }
148 | ```
149 |
150 | ```php
151 | $display = AdminDisplay::table()
152 | ->setFilters(
153 | AdminDisplayFilter::scope('latest'); // ?latest
154 | AdminDisplayFilter::scope('type'); // ?type=news | ?latest&type=news
155 | );
156 | ```
157 |
158 |
159 | ## Произвольный фильтр
160 | Используется в случае если вы хотите задать фильтр с произвольным запросом
161 |
162 | ```php
163 | AdminDisplayFilter::custom('custom_filter')->setCallback(function($query, $value) {
164 | $query->where('myField', $value);
165 | }); // ?custom_filter=test
166 | ```
167 |
--------------------------------------------------------------------------------
/docs/ru/form.md:
--------------------------------------------------------------------------------
1 | # Формы
2 |
3 | - [Form](#form)
4 | - [Card](#card) (panel)
5 | - [Tabbed](#tabbed)
6 | - [API](#api)
7 | - [Tabs](#tabs)
8 | - [Columns](#columns)
9 |
10 |
11 | ## form
12 | * Класс `\SleepingOwl\Admin\Form\FormDefault`
13 | * View `resources\views\default\form\default.blade.php`
14 |
15 | Данный тип формы выводит элементы без дизайна. При желании внешний вид формы можно настроит с помощью HTML атрибутов
16 |
17 | ```php
18 | $form = AdminForm::form()->setElements([
19 | AdminFormElement::text('title', 'Title'),
20 | ]);
21 |
22 | $form->addElement(
23 | AdminFormElement::date('created_at', 'Created at')
24 | );
25 |
26 | $form->setHtmlAttribute('class', 'card');
27 | $form->getButtons()->setHtmlAttribute('class', 'card-footer');
28 | ```
29 |
30 |
31 | ## card
32 | в основе которой лежит [Bootstrap конпонент card](https://bootstrap-4.ru/docs/4.0/components/card/)
33 |
34 | * Класс `\SleepingOwl\Admin\Form\FormCard`
35 | * View `resources\views\default\form\card.blade.php`
36 |
37 | Данный тип формы автоматически добавляет к форме html атрибут `class="card"` и к кнопкам формы `class="card-footer"` и позволяет размещать элементы формы в блоки `header`, `body`, `footer`
38 |
39 | ```php
40 | $form = AdminForm::card()
41 | ->addHeader([
42 | AdminFormElement::text('title', 'Title'),
43 | ])
44 | ->addBody(
45 | AdminFormElement::wysiwyg('text', 'Text', 'ckeditor')->required()
46 | )
47 | ->addFooter(
48 | AdminFormElement::select('type', 'Type'), ...)
49 | );
50 |
51 | $form->addItem(AdminFormElement::date('created_at', 'Created at'));
52 |
53 | $form->addElement(AdminFormElement::date('created_at', 'Created at')); // Поместит элемент без блока
54 |
55 | $form->setElements([
56 | AdminFormElement::date('created_at', 'Created at')
57 | ]); // Поместит список элементов без блока
58 | ```
59 |
60 | Блоки формы - это классы, реализующие интерфейс `SleepingOwl\Admin\Contracts\Form\CardInterface`, при необходимости вы можете создать свой класс блока и добавлять его в форму:
61 |
62 | ```php
63 | $form->addElement(new \App\Form\Card\CustomBlockClass([
64 | AdminFormElement::text('title', 'Title')
65 | ]));
66 | ```
67 |
68 | ### API
69 |
70 | #### addItem
71 | Добавление элемента в форму. Если в форме уже есть блоки (`header`, `body`, `footer`), то элемент будет добавлен в последний добавленный блок, если блоков нет, то будет создан блок `body` и в него помещен элемент.
72 |
73 | SleepingOwl\Admin\Form\FormDefault::addItem(mixed $item): return self
74 |
75 | #### addHeader
76 | Добавление элементов в блок `card-heading`
77 |
78 | SleepingOwl\Admin\Form\FormCard::addHeader(array|\SleepingOwl\Admin\Contracts\FormElementInterface $items): return self
79 |
80 | #### addBody
81 | Добавление элементов в блок `card-body`. Если предыдущий блок `body`, то между ними будет вставлен элемент `
`
82 |
83 | SleepingOwl\Admin\Form\FormCard::addBody(array|\SleepingOwl\Admin\Contracts\FormElementInterface $items): return self
84 |
85 | #### addFooter
86 | Добавление элементов в блок `card-footer`
87 |
88 | SleepingOwl\Admin\Form\FormCard::addFooter(array|\SleepingOwl\Admin\Contracts\FormElementInterface $items): return self
89 |
90 |
91 | ## tabbed
92 | Разновидность форм, в которой элементы можно разделять на вкладки.
93 |
94 | ```php
95 | AdminForm::tabbed()->setElements([
96 | 'tab1' => [
97 | ....
98 | ],
99 | 'tab2' => [
100 | ....
101 | ]
102 | ]);
103 | ```
104 |
105 |
106 | ## API (методы доступные во всех классах)
107 |
108 | В классах форм используется трейт:
109 | - [HtmlAttributes](html_attributes), с помощью которого для них можно настраивать HTML атрибуты.
110 | - [Assets](assets#assets-trait), с помощью которого для них можно подключать ассеты.
111 |
112 | #### setButtons
113 | Указание класса отвечающего за вывод кнопок формы. По умолчанию `SleepingOwl\Admin\Form\FormButtons`
114 |
115 | SleepingOwl\Admin\Form\FormDefault::setButtons(\SleepingOwl\Admin\Contracts\FormButtonsInterface $buttons): return self
116 |
117 | #### setView
118 | Указание view отвечающего за вывод формы
119 |
120 | SleepingOwl\Admin\Form\FormDefault::setView(\Illuminate\View\View|string $view): return self
121 |
122 | #### setAction
123 | Указание ссылки, на которую будут отправлены данные формы.
124 |
125 | SleepingOwl\Admin\Contracts\FormInterface::setAction(string $action): return self
126 |
127 | #### setElements
128 | Добавление массива элементов в форму
129 |
130 | SleepingOwl\Admin\Contracts\Form\ElementsInterface::setElements(array $elements): return self
131 |
132 |
133 | #### addElement
134 | Добавление элемента в форму
135 |
136 | SleepingOwl\Admin\Form\FormElements::addElement(mixed $element): return self
137 |
138 | ## AdminColumn
139 | в случае необходимости можно использовать колонки таблиц
140 |
141 | ```php
142 | AdminForm::form()->setElements([
143 | AdminFormElement::upload('image', 'Image'), // Элемент загрузки картинки
144 | AdminColumn::image('image', 'Image') // Вывод загружененой картинки
145 | ])
146 | ```
147 |
148 |
149 | ## Tabs
150 | Вы можете в качестве элемента формы помещать табы. **Делайте названия табов уникальными при размещении нескольких разделов со вкладками, т.к. табы могут включаться некорректно.**
151 |
152 | ```php
153 | $tabs = AdminDisplay::tabbed();
154 | $tabs->setTabs(function ($id) {
155 | $tabs = [];
156 |
157 | $tabs[] = AdminDisplay::tab(AdminForm::elements([
158 | AdminFormElement::text('title', 'Title')->required(),
159 | ]))->setLabel('SEO');
160 |
161 | $tabs[] = AdminDisplay::tab(new \SleepingOwl\Admin\Form\FormElements([
162 | AdminFormElement::date('created_at', 'Created at')->required()
163 | ]))->setLabel('Dates');
164 |
165 | return $tabs;
166 | });
167 |
168 | $tabs->appendTab([
169 | AdminFormElement::text('title', 'Title')->required(),
170 | ], 'Tab 1');
171 |
172 |
173 | $tabs1 = AdminDisplay::tabbed();
174 |
175 | $tabs1 = ....;
176 |
177 |
178 | AdminForm::form()
179 | ->addElement($tabs)
180 | ->setElements([
181 | AdminFormElement::upload('image', 'Image'), // Элемент загрузки картинки
182 | AdminColumn::image('image', 'Image') // Вывод загружененой картинки
183 | ])
184 | ->addElement($tabs1);
185 |
186 | // or
187 |
188 | $form = AdminForm::card()
189 | ->addHeader([
190 | $tabs
191 | ]);
192 |
193 | // or
194 |
195 | $form = AdminForm::card()
196 | ->setElements([
197 | AdminFormElement::upload('image', 'Image'),
198 | $tabs
199 | ]);
200 | ```
201 |
202 |
203 | ## Columns
204 | Позволяет разбивать форму на несколько столбцов. Колонки могут быть использованы в табах и наоборот.
205 |
206 | ```php
207 | $columns = AdminFormElement::columns([
208 | [
209 | AdminFormElement::text('title', 'Title')->required()
210 | ],
211 | // or
212 | function() {
213 | return [
214 | AdminFormElement::text('title', 'Title')->required()
215 | ];
216 | },
217 | // or
218 | new \SleepingOwl\Admin\Form\Columns\Column([
219 | AdminFormElement::date('created_at', 'Created At')->required()
220 | ])
221 | ]);
222 |
223 | $columns->addColumn([
224 | AdminFormElement::date('created_at', 'Created At')->required()
225 | ]);
226 |
227 | // or
228 |
229 | $columns->addColumn(function() {
230 | return [
231 | AdminFormElement::date('created_at', 'Created At')->required()
232 | ];
233 | });
234 |
235 | // or
236 |
237 | $columns->addColumn(new \SleepingOwl\Admin\Form\Columns\Column([
238 | AdminFormElement::date('created_at', 'Created At')->required()
239 | ]));
240 |
241 |
242 |
243 | $columns->addColumn($subColumns = AdminFormElement::columns([
244 | [
245 | AdminFormElement::text('description', 'Description')
246 | ]
247 | ]);
248 |
249 | $subColumns->addColumn(...)
250 |
251 | $form = AdminForm::card()->addBody($columns);
252 | ```
253 |
254 | #### Ширина колонок
255 |
256 | Вы можете задавать ширину каждой из колонок с соответствии с синтаксисом Bootstrap, для разной ширины экрана пользователя: XS, SM, MD и LG. Для этого в метод addColumn() в качестве второго аргумента необходимо передать значение ширины. Сделать это можно несколькими способами:
257 |
258 | ```php
259 | // Передать число:
260 | // каждая колонка будет иметь class="col-md-6"
261 | AdminFormElement::columns()
262 | ->addColumn([
263 | #...
264 | ], 6)
265 | ->addColumn([
266 | #...
267 | ], 6)
268 | ,
269 |
270 | // Передать строку:
271 | // каждая колонка будет иметь class="col-xs-12 col-sm-6 col-md-6 col-lg-6"
272 | AdminFormElement::columns()
273 | ->addColumn([
274 | #...
275 | ], 'col-xs-12 col-sm-6 col-md-6 col-lg-6')
276 | ->addColumn([
277 | #...
278 | ], 'col-xs-12 col-sm-6 col-md-6 col-lg-6')
279 | ,
280 |
281 | // Передать массив строк: вариация предыдущего метода,
282 | // каждая колонка будет иметь class="col-xs-12 col-sm-6 col-md-6 col-lg-6"
283 | AdminFormElement::columns()
284 | ->addColumn([
285 | #...
286 | ], ['col-xs-12', 'col-sm-6', 'col-md-6', 'col-lg-6'])
287 | ->addColumn([
288 | #...
289 | ], ['col-xs-12', 'col-sm-6', 'col-md-6', 'col-lg-6'])
290 | ,
291 |
292 | // Не передавать второй аргумент:
293 | // все колонки будут иметь одинаковую ширину, в зависимости от их количества.
294 | // Класс, отвечающий за ширину, будет вычислен автоматически.
295 | // Так, при передаче трех колонок, каждая из них будет иметь class="col-md-4"
296 | AdminFormElement::columns()
297 | ->addColumn([
298 | #...
299 | ])
300 | ->addColumn([
301 | #...
302 | ])
303 | ->addColumn([
304 | #...
305 | ])
306 | ,
307 | ```
308 |
309 | #### Пример использования колонок с табами
310 | ```php
311 |
312 | $tabs = AdminDisplay::tabbed([
313 | 'Tab 1' => new FormElements([
314 | AdminFormElement::text('title', 'Title')->required()
315 | ]),
316 | 'Tab 2' => new FormElements([
317 | AdminFormElement::select('type', 'Type'),
318 | AdminFormElement::date('event_at', 'Event at')->setFormat('Y-m-d H:i:00')
319 | ])
320 | ]);
321 |
322 | $columns = AdminFormElement::columns();
323 |
324 | $columns->addColumn([$tabs]);
325 |
326 | $columns->addColumn([
327 | AdminFormElement::date('created_at', 'Created at')
328 | ]);
329 |
330 | // Or
331 |
332 | $tabs->appendTab(new FormElements([$columns]));
333 | ```
334 |
--------------------------------------------------------------------------------
/docs/ru/global.md:
--------------------------------------------------------------------------------
1 | # Описание работы системы
2 |
3 | Работа системы начинается в тот момент, когда вы подключаете сервис провайдер `SleepingOwl\Admin\Providers\SleepingOwlServiceProvider` в ваше Laravel приложение
4 |
5 | ```php
6 | // config/app.php
7 | ...
8 | 'providers' => [
9 | ...
10 |
11 | /*
12 | * SleepingOwl Service Provider
13 | */
14 | SleepingOwl\Admin\Providers\SleepingOwlServiceProvider::class,
15 |
16 | /*
17 | * Application Service Providers...
18 | */
19 | App\Providers\AppServiceProvider::class,
20 | ...
21 | ],
22 | ```
23 |
24 | После подключения, пакет `SleepingOwl` произведет регистрацию своих компонентов:
25 |
26 | - Подключение конфига sleeping_owl.php
27 | - Регистрация view шаблонов c namespace `sleeping_owl::`
28 | - Регистрация языковых файлов с namespace `sleeping_owl::`
29 | - Регистрация media assets из файла https://github.com/LaravelRUS/SleepingOwlAdmin/blob/master/resources/assets.php
30 | - Публикация media библиотек в `public/packages/sleepingowl`
31 | - Регистрация сервис провайдеров из конфига `sleeping_owl` (Это сделано для того, чтобы вам не пришлось вручную
32 | подключать кучу лишних сервис провайдеров и вы всегда могли изменить набор)
33 | - Регистрация фасадов из конфига `sleeping_owl`
34 | - Регистрация консольных команд
35 |
36 | Если вам необходимо заменить системный шаблон, то необходимо поместить его `resources\views\vendor\sleeping_owl\default\`, т.е.
37 | если есть шаблон по пути `sleepingowl\src\resources\default\display\extensions\columns.blade.php`, то путь в системе должен быть
38 | `resources\views\vendor\sleeping_owl\default\display\extensions\columns.blade.php`
39 |
40 | ## Регистрируемые сервис контейнеры:
41 |
42 | ```php
43 | // AdminSection
44 | 'sleeping_owl' => ['SleepingOwl\Admin\Admin', 'SleepingOwl\Admin\Contracts\AdminInterface']
45 |
46 | // AdminTemplate
47 | 'sleeping_owl.template' => ['SleepingOwl\Admin\Contracts\Template\TemplateInterface']
48 |
49 | 'sleeping_owl.breadcrumbs' => ['SleepingOwl\Admin\Contracts\Template\Breadcrumbs']
50 |
51 | // AdminWidgets
52 | 'sleeping_owl.widgets' => ['SleepingOwl\Admin\Contracts\Widgets\WidgetsRegistryInterface', 'SleepingOwl\Admin\Widgets\WidgetsRegistry']
53 |
54 | // MessagesStack
55 | 'sleeping_owl.message' => ['SleepingOwl\Admin\Widgets\Messages\MessageStack']
56 |
57 | // AdminNavigation
58 | 'sleeping_owl.navigation' => ['SleepingOwl\Admin\Navigation', 'SleepingOwl\Admin\Contracts\Navigation\NavigationInterface']
59 |
60 | // WysiwygManager
61 | 'sleeping_owl.wysiwyg' => ['SleepingOwl\Admin\Wysiwyg\Manager', 'SleepingOwl\Admin\Contracts\Wysiwyg\WysiwygMangerInterface']
62 |
63 | // Meta
64 | 'sleeping_owl.meta' => ['assets.meta', 'SleepingOwl\Admin\Contracts\Template\MetaInterface', 'SleepingOwl\Admin\Templates\Meta'],
65 | ```
66 | Также для удобства работы с данными, классы полей, таблиц, форм и т.д. собраны в отдельные группы (https://github.com/LaravelRUS/SleepingOwlAdmin/blob/master/src/Providers/AliasesServiceProvider.php),
67 | доступ к данным каждой группы также осуществляется через сервис контейнер
68 |
69 | - AdminColumnFilter - `sleeping_owl.column_filter`
70 | - AdminDisplay - `sleeping_owl.display`
71 | - AdminColumn - `sleeping_owl.table.column`
72 | - AdminColumnEditable - `sleeping_owl.table.column.editable`
73 | - AdminDisplayFilter - `sleeping_owl.display.filter`
74 | - AdminForm - `sleeping_owl.form`
75 | - AdminFormElement - `sleeping_owl.form.element`
76 |
77 | **Если вы хотите добавить, допустим, новый тип поля, вам необходимо сделать следующее**
78 |
79 | ```php
80 | \AdminColumn::add('field_type', \App\Fields\CustomField::class);
81 | // или
82 | app('sleeping_owl.table.column')->add('field_type', \App\Fields\CustomField::class);
83 |
84 | //После чего поле будет доступно следующим образом
85 |
86 | \AdminColumn::field_type()->...
87 | // или
88 | app('sleeping_owl.table.column')->field_type()->...
89 | ```
90 |
91 | ## Подключение файлов
92 |
93 | После регистрации всех компонентов происходит поиск файлов в директории `app/Admin` и их подключение.
94 | - Первым делом происходит подключение `bootstrap.php`
95 | - Далее файлы конфигурации моделей
96 |
97 | **После того, как во всех сервис провайдерах приложения будет вызван метод `boot`, будет произведено**:
98 |
99 | ?> Вызов производится по событию `app()->booted` для того, чтобы вы имели возможность регистрировать модели не только через файлы в папке `app/Admin`, но и через сервис провайдеры
100 |
101 | - Подключение `app/Admin/routes.php` *(При наличии файла)*
102 | - Регистрация системных роутов
103 | - Подключение `app/Admin/navigation.php` *(При наличии файла)*
104 |
105 | !> После регистрации системных роутов, создание новых разделов может привести к ошибкам при использовании алиасов
106 |
107 |
108 | ## Рабочий стол (Dashboard)
109 | В стандартную сборку SleepingOwlAdmin включен пустой шаблон дашборда с возможностью вставки в него виджетов https://github.com/SleepingOwlAdmin/docs/blob/master/ru/widgets.md
110 |
111 | При желании вы можете переопределить view шаблона дэшборда для разметки блоков для виджетов, либо переопределить роут и указать контроллер который отвечает за дашборд
112 | ```php
113 | Route::get('', ['as' => 'admin.dashboard', 'uses' => '\App\Http\Controllers\DashboardController@index']);
114 | ```
115 |
--------------------------------------------------------------------------------
/docs/ru/html_attributes.md:
--------------------------------------------------------------------------------
1 | # HTML атрибуты
2 |
3 | Данный trait используется для организации работы с HTML атрибутами в классах. Это может пригодится, если вы создаете например класс,
4 | который на выходе будет преобразован в HTML и необходимо дать пользователю возможность указать css классы, идентификатор и другие атрибуты
5 | для элемента.
6 |
7 | Допустим у нас есть класс `TableColumn`, который преобразуется в `{{ $value }} | ` и вы хотите дать пользователю
8 | возможность указывать атрибуты, чтобы на выходе получить ``
9 |
10 | Для этого классу необходимо подключить данный trait
11 |
12 | ```php
13 | 'test',
29 | 'attributes' => $this->htmlAttributesToString(),
30 | ];
31 | }
32 |
33 | public function render()
34 | {
35 | return view(
36 | 'table_column',
37 | $this->toArray()
38 | );
39 | }
40 | }
41 | ```
42 |
43 | ```html
44 | | {{ $value }} |
45 | ```
46 |
47 | И теперь можно данному классу можно назначать атрибуты
48 |
49 | ## API
50 |
51 |
52 | ## setHtmlAttribute
53 | Указание HTML атрибута
54 |
55 | ```php
56 | $column->setHtmlAttribute('class', 'bg-primary');
57 | $column->setHtmlAttribute('class', 'text-right');
58 | $column->setHtmlAttribute('id', 'row-3');
59 | $column->setHtmlAttribute('data-value', 'test');
60 |
61 | // Или в виде массива
62 |
63 | $column->setHtmlAttributes([
64 | 'class' => ['bg-primary', 'text-right'],
65 | 'id' => 'row-3',
66 | 'data-value' => 'test'
67 | ]);
68 |
69 | // return test |
70 | ```
71 |
72 |
73 | ## replaceHtmlAttribute
74 | Переопределение класса
75 |
76 | ```php
77 | $column->replaceHtmlAttribute('class', 'new-class');
78 |
79 | // return test |
80 | ```
81 |
82 |
83 | ## hasClassProperty
84 | Проверка на существование класса
85 |
86 | ```php
87 | $column->setHtmlAttribute('class', 'new-class');
88 | $column->hasClassProperty('new-class'); // return true
89 | ```
90 |
91 |
92 | ## hasHtmlAttribute
93 | Проверка на существование атрибута
94 |
95 | ```php
96 | $column->setHtmlAttribute('data-value', 'test');
97 | $column->hasHtmlAttribute('data-value'); // return true
98 | ```
99 |
100 |
101 | ## removeHtmlAttribute
102 | Удаление атрибута
103 |
104 | ```php
105 | $column->removeHtmlAttribute('data-value');
106 | ```
107 |
108 |
109 | ## clearHtmlAttributes
110 | Удаление всех атрибутов
111 |
112 | ```php
113 | $column->clearHtmlAttributes();
114 | ```
115 |
116 |
117 | ## htmlAttributesToString
118 | Преобразование атрибутов в строку
119 |
120 | ```php
121 | $column->htmlAttributesToString();
122 | // return "class="new-class" id="row-3" data-value="test""
123 | ```
--------------------------------------------------------------------------------
/docs/ru/image_upload.md:
--------------------------------------------------------------------------------
1 | # Загрузка картинок D&D, Из окна CKEditor (Image Upload)
2 |
3 | - [Версия CKEditor](#ckeditor)
4 | - [Переопределение файла assets.php](#assets-php)
5 | - [Настройка конфигурации](#config)
6 | - [Настройка кастомного контроллера](#custom-controller)
7 |
8 |
9 | ## Скачивание ckeditor
10 |
11 | Для начала вам нужно скачать версию ckeditor отсюда [CkEditor Addons](http://ckeditor.com/addons/search/plugins/image).
12 |
13 | Плагины которые нам понадобятся называются: `Upload Image (uploadimage)` и `Enchanced Image (image2)`
14 |
15 | Далее вам потребуется добавить свою локализацию, тему и скачать оптимизированную версию CKEditor
16 | Разместить ее следует в директорию где у вас собираются ассеты в отдельную папку, желательно (public)
17 |
18 |
19 | ## Переопределение файла assets.php
20 |
21 | *AppServiceProvider.php*
22 | ```php
23 | public function boot()
24 | {
25 | ...
26 |
27 | if (file_exists($assetsFile = __DIR__ . '/../../resources/assets/admin/assets.php')) {
28 | include $assetsFile;
29 | }
30 |
31 | ...
32 | }
33 | ```
34 | *assets.php*
35 | ```php
36 | js(null, '/packages/ckeditor/ckeditor.js', ['jquery']); //path to ckeditor.js (in public)
40 |
41 | ```
42 |
43 |
44 | ## Настройка Конфигурации
45 |
46 | *sleeping_owl.php*
47 |
48 | ```php
49 | 'wysiwyg' => [
50 |
51 | ...
52 |
53 | 'ckeditor' => [
54 | 'height' => 400,
55 |
56 | 'toolbarGroups' => [
57 |
58 | ....
59 |
60 | ],
61 | ...
62 |
63 | 'extraPlugins' => 'uploadimage,image2',
64 | 'uploadUrl' => '/storage/images_admin', //path to custom controller
65 | 'filebrowserUploadUrl' => '/storage/images_admin', //path to custom controller (for browser ckeditor)
66 | ],
67 |
68 | ...
69 | ],
70 | ```
71 |
72 |
73 | ## Настройка кастомного контроллера
74 |
75 | *routes.php* or *admin_routes.php*
76 |
77 | ```php
78 | Route::post('storage/images_admin', [
79 | 'as' => 'upload.image.s3',
80 | 'uses' => "ImageController@storeAdmin"
81 | ]);
82 | ```
83 |
84 | *ImageController.php*
85 |
86 | ```php
87 |
88 | namespace App\Http\Controllers;
89 |
90 | use Request;
91 | use App\Http\Controllers\Controller;
92 |
93 |
94 | class ImageController extends Controller
95 | {
96 | /**
97 | * Method to upload and save images
98 | * @param Request $request
99 | * @return string
100 | */
101 | public function storeAdmin(Request $request)
102 | {
103 | //Your upload logic
104 |
105 | $result = [
106 | 'url' => $url_image,
107 | 'value' => $path_to_image,
108 | 'uploaded' => 1,
109 | 'fileName' => pathinfo($path_to_image, PATHINFO_FILENAME)
110 | ];
111 |
112 | if ($request->CKEditorFuncNum && $request->CKEditor && $request->langCode) {
113 | //that handler to upload image CKEditor from Dialog
114 | $funcNum = $request->CKEditorFuncNum;
115 | $CKEditor = $request->CKEditor;
116 | $langCode = $request->langCode;
117 | $token = $request->ckCsrfToken;
118 |
119 | return view('helper.ckeditor.upload_file', compact('result', 'funcNum', 'CKEditor', 'langCode', 'token'));
120 | }
121 |
122 | return $result;
123 | }
124 | }
125 |
126 | ```
127 |
128 | */helper/ckeditor/upload_file.blade.php*
129 |
130 | ```php
131 |
132 |
133 |
134 |
135 | Example: File Upload
136 |
137 |
138 | @php
139 | // Check the $_FILES array and save the file. Assign the correct path to a variable ($url).
140 | $url = $result['url'];
141 | // Usually you will only assign something here if the file could not be uploaded.
142 | $message = 'Some message';
143 |
144 | echo "";
145 | @endphp
146 |
147 |
148 | ```
149 |
150 | ## И да прибудет с вами сила
--------------------------------------------------------------------------------
/docs/ru/installation.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | - [Support](#support)
4 | - [Composer](#composer)
5 | - [Добавление сервис провайдера](#service-provider)
6 | - [Artisan](#artisan)
7 |
8 |
9 |
10 | ## Support
11 | - Laravel ~5.5 || ~6.*
12 | - PHP 7.1.3+
13 |
14 |
15 |
16 | ## Composer
17 | Установить пакет можно помощью командной строки
18 |
19 | ```bash
20 | $ composer require laravelrus/sleepingowl
21 |
22 | //or branch
23 | $ composer require laravelrus/sleepingowl:dev-development
24 | ```
25 |
26 |
27 | или вручную добавив пакет в `composer.json`
28 |
29 | ```json
30 | {
31 | ...
32 | "require": {
33 | ...
34 | "laravelrus/sleepingowl": "dev-development",
35 | }
36 | }
37 | ```
38 | и выполнить команду
39 |
40 | ```bash
41 | $ composer update
42 | ```
43 |
44 |
45 | ## Service Provider
46 | !> Для Laravel 5.5+ пакет подключится автоматически либо можно указать вручную:
47 |
48 | **config/app.php**
49 | ```php
50 | 'providers' => [
51 | ...
52 | /**
53 | * SleepingOwl Service Provider
54 | */
55 | SleepingOwl\Admin\Providers\SleepingOwlServiceProvider::class,
56 |
57 | /**
58 | * Application Service Providers...
59 | */
60 | App\Providers\AppServiceProvider::class,
61 | ...
62 | ]
63 | ```
64 |
65 |
66 | ## Artisan
67 |
68 | Запустите artisan команду для установки SleepingOwl Admin
69 |
70 | ```bash
71 | $ php artisan sleepingowl:install
72 | ```
73 |
74 | #### Что делает эта команда
75 | - Публикует конфигурацию SleepingOwl Admin `config/sleepign_owl.php`
76 | - Публикует ресурсы из SleepingOwl Admin в `public/packages/sleepingowl/default`.
77 | ```bash
78 | $ php artisan vendor:publish --tag=assets --force
79 | ```
80 | - Создает директорию автозапуска (`app/Admin`)
81 | - Создает файл конфигурации меню по умолчанию (`app/Admin/navigation.php`)
82 | - Создает файл автозапуска по умолчанию (`app/Admin/bootstrap.php`)
83 | - Создает файл роутов по умолчанию (`app/Admin/routes.php`)
84 | - Создает структуру директории 'public' (`images/uploads`)
85 | - Создает [Service Provider](model_configuration_section) `app\Providers\AdminSectionsServiceProvider`
86 |
87 |
88 | ## Следующий шаг
89 | - [Конфигурация](ru/configuration)
90 | - [Руководство по обновлению](ru/update)
91 |
--------------------------------------------------------------------------------
/docs/ru/javascript.md:
--------------------------------------------------------------------------------
1 | # Javasript API
2 |
3 | - [Config](#config)
4 | - [Сообщения](#messages)
5 | - [События](#events)
6 | - [Модули](#modules)
7 | - [Подключение WYSIWYG редакторов](#wysiwyg)
8 | - [Url](#url)
9 | - [User](#user)
10 | - [Asset](#asset)
11 |
12 |
13 | ## Admin:
14 |
15 | #### Получение текущего токена (Readonly)
16 |
17 | `Admin.token`
18 |
19 | #### Получение текущей локали (Readonly)
20 |
21 | `Admin.locale`
22 |
23 | #### Получение текущего окружения (Readonly)
24 |
25 | `Admin.env`
26 |
27 | #### Проверка на активность дебага (Readonly)
28 |
29 | `Admin.debug`
30 |
31 |
32 | #### Объект `Admin.Config`
33 |
34 | Настройки приложения хранятся в глобальном объекте `window.GlobalConfig` и при старте приложения передаются в этот объект
35 |
36 | ```js
37 | Admin.Config.get(key, [default])
38 | Admin.Config.set(key, value)
39 | Admin.Config.has(key)
40 | Admin.Config.merge(config)
41 | Admin.Config.all()
42 | ```
43 |
44 | Из этих настроек можно получить:
45 | - `Admin.Config.get('debug')` - состояние `debug` приложения
46 | - `Admin.Config.get('env')` - состояние `env` приложения
47 | - `Admin.Config.get('locale')` - локаль приложения
48 | - `Admin.Config.get('url')` - URL приложения
49 | - `Admin.Config.get('url_path')` - относительный путь (только в @dev-development ветке)
50 | - `Admin.Config.get('lang')` - текущие ключи и значения локализации
51 | - `Admin.Config.get('wysiwyg')` - WYSIWYG настройки из файла конфигурации
52 | - `Admin.Config.get('template')` - информация о шаблоне по умолчанию
53 | - `Admin.Config.get('user_id')` - идентификатор активного пользователя
54 | - `Admin.Config.get('datetime_format')` - текущий формат даты и времени
55 | - `Admin.Config.get('date_format')` - текущий формат даты
56 | - `Admin.Config.get('state_tabs')` - сохранение активности табов
57 | - `Admin.Config.get('state_filters')` - сохранение значений фильтров datatables
58 |
59 |
60 |
61 | ## Сообщения
62 |
63 | Для вывода сообщений используется [SweetAlert2](https://limonte.github.io/sweetalert2/)
64 |
65 | ```js
66 | // Сообщение об ошибке
67 | Admin.Messages.error('title', 'message')
68 |
69 | // Success сообщение
70 | Admin.Messages.success('title', 'message')
71 |
72 | // Произвольное сообщение
73 | Admin.Messages.message('title', 'message', 'error')
74 |
75 | // Сообщение с подтверждением
76 | Admin.Messages.confirm('title', 'message').then(confirm, dismiss)
77 |
78 | // Сообщение с полем ввода
79 | Admin.Messages.prompt('title', 'message', 'placeholder').then(confirm, dismiss)
80 | ```
81 |
82 |
83 | ## События
84 |
85 | В системе есть простая система обработки событий `Admin.Events`
86 |
87 | ```js
88 | // Подписка на событие
89 | Admin.Events.on('event:name', function() {
90 | // your js code here ...
91 | })
92 |
93 | // Запуск события и передача аргументов
94 | Admin.Events.fire('event:name', param1, param2, ....)
95 | ```
96 |
97 | #### Список событий
98 |
99 | * `wysiwyg:switchOn [editor]` - Редактор подключен в input [`editor`] - объект инициализированного редактора
100 | * `wysiwyg:switchOff [textareaId]` - Редактор выключен [`textareaId`] - ID инпута
101 | * `wysiwyg:exec [command, textareaId, data]` - Вызов команды редактора
102 | * `bootstrap::tab::shown [tab]` - Отображение вкладки [`tab`] - ключ активного таба
103 | * `bootstrap::tab::hidden [tab]` - Скрытие вкладки
104 | * `datatables::draw [Datatable]` - Рендер datatables [`Datatable`] - объект отрендереной таблицы
105 | * `display.tree::changed`
106 |
107 |
108 | ## Модули
109 |
110 | Модуль представляет собой блок кода, который будет запускаться при каждом старте системы
111 |
112 | #### Регистрация модуля
113 |
114 | ```js
115 | Admin.Modules.register(key, function() {
116 | // your js code here ...
117 | }, prioroty, events);
118 |
119 | // key - ключ (название) текущего модуля. В системе не может быть нескольких модулей с одним ключом (модуль будет переопределен)
120 | // callback - код который будет выполнен при запуске модуля
121 | // prioroty - приоритет запуска модулей. (После запуска системы, все модули сортируются по приоритету и происходит последовательный запуск)
122 | // events - событие или массив событий при возникновении которых код модуля будет запущен повторно.
123 | ```
124 |
125 | #### Ручной запуск модулей
126 |
127 | ```js
128 | Admin.Modules.call(key)
129 | ```
130 |
131 |
132 |
133 | ## Подключение WYSIWYG редакторов
134 |
135 | Предназначен для регистрации и запуска редакторов текста в системе.
136 |
137 | #### Регистрация редактора
138 |
139 | Регистрация по сути заключается в указании трех функций, которые будут вызваны в момент подключения редактора, отключения и выполнении каких либо команд.
140 |
141 | ```js
142 | Admin.WYSIWYG.register(name, switchOnHandler, switchOffHandler, execHandler);
143 |
144 | function switchOnHandler(textareaId, config) {
145 | // textareaId - идентификатор поля ввода к которому необходимо подключить редактор
146 | // config - дополнительные настройки
147 |
148 | editor = new WYSIWYGEditor(textareaId)
149 | editor.setConfig(config)
150 | return editor
151 | }
152 |
153 | function switchOffHandler(editor, textareaId) {
154 | // editor - объект подключенного редактора
155 | // textareaId - идентификатор поля ввода к которому необходимо подключить редактор
156 |
157 | editor.destroy()
158 | }
159 |
160 | function execHandler(editor, command, textareaId, data) {
161 | // editor - объект подключенного редактора
162 | // command - команда, которую необходимо выполнить
163 | // textareaId - идентификатор поля ввода к которому необходимо подключить редактор
164 | // data - дополнительные данные
165 |
166 | switch (command) {
167 | case 'insert':
168 | editor.insertText(data);
169 | break;
170 | }
171 | }
172 |
173 | // name - ключ (Название) редактора
174 | // switchOnHandler - функция, которая будет вызвана в момент подключения. Обязательно должен вернуть объект подключаемого редактора (Происходит запуск события wysiwyg:switchOn)
175 | // switchOffHandler - функция, которая будет вызвана в момент отключения редактора (Происходит запуск события wysiwyg:switchOff)
176 | // execHandler - функция, которая будет вызвана в момент вызова команды редактора (Происходит запуск события wysiwyg:exec)
177 | ```
178 |
179 | #### Подключение редактора
180 |
181 | ```js
182 | // Сначала должен быть зарегистрирован в системе редактор
183 | Admin.WYSIWYG.register('ckeditor', switchOnHandler, switchOffHandler, execHandler);
184 |
185 |
186 | Admin.WYSIWYG.switchOn('MyTextarea', 'ckeditor', {param1: ..., param2: ...})
187 | ```
188 |
189 | #### Отключение редактора
190 |
191 | ```js
192 | Admin.WYSIWYG.switchOff('MyTextarea')
193 | ```
194 |
195 | #### Выполнение команды
196 |
197 | ```js
198 | Admin.WYSIWYG.exec('MyTextarea', 'insert', 'Текст который вставляем в редактор')
199 | ```
200 |
201 |
202 |
203 | ## Url
204 |
205 | Модуль предназначен для работы с url адресами.
206 |
207 | #### Получение якоря
208 | ```js
209 | Admin.Url.hash
210 | ```
211 |
212 | #### Генерация ссылки на asset файл для текущей темы
213 | ```js
214 | Admin.Url.asset(path, query)
215 | // path - относительный путь до файла
216 | // query - параметры для генерации query string {foo: bar, baz: bar} = ?foo=bar&baz=bar
217 |
218 | Admin.Url.asset('script.js') // http://site.com/packages/sleepingow/default/script.js
219 | ```
220 |
221 | #### Генерация admin ссылки
222 | ```js
223 | Admin.Url.admin(path, query)
224 | // path - относительный путь
225 | // query - параметры для генерации query string {foo: bar, baz: bar} = ?foo=bar&baz=bar
226 |
227 | Admin.Url.admin('users/1') // http://site.com/backend/users/1
228 | ```
229 |
230 | #### Генерация front ссылки
231 | ```js
232 | Admin.Url.app(path, query)
233 | // path - относительный путь
234 | // query - параметры для генерации query string {foo: bar, baz: bar} = ?foo=bar&baz=bar
235 |
236 | Admin.Url.app('users/1') // http://site.com/users/1
237 | ```
238 |
239 | #### Получение системных данных
240 | ```js
241 | Admin.Url.url // ссылка на front
242 | Admin.Url.url_prefix // получение значения url prefix админ панели
243 | Admin.Url.url_path // получение относительного пути (только в @dev-development ветке)
244 | Admin.Url.asset_dir// относительный путь до хранения ассетов для текущей темы
245 | ```
246 |
247 |
248 |
249 | ## User
250 |
251 | #### Получение ID авторизованного пользователя
252 |
253 | ```js
254 | Admin.User.id: int|null
255 | ```
256 |
257 | #### Получение статуса авторизации пользователя
258 |
259 | ```js
260 | Admin.User.isAuthenticated(): bool
261 | ```
262 |
263 |
264 | ## Asset
265 |
266 | #### Подключение CSS файлов
267 | Если файл с переданным путем уже добавлен на страницу, он будет пропущен.
268 | Возвращает объект `Promise`.
269 |
270 | ```js
271 | Admin.Asset.css(string url): Promise
272 | ```
273 |
274 | #### Подключение JS файлов
275 | Если файл с переданным путем уже добавлен на страницу, он будет пропущен.
276 | Возвращает объект `Promise`.
277 |
278 | ```js
279 | Admin.Asset.js(string url): Promise
280 | ```
281 |
282 | #### Подключение Image файлов
283 | Возвращает объект `Promise`.
284 | https://habrahabr.ru/company/zerotech/blog/317256/
285 |
286 | ```js
287 | Admin.Asset.img(string url): Promise
288 |
289 | Admin.Asset.img('http://sizte.com/logo.png').then(function(url) {
290 | $('#images').append('
');
291 | })
292 | ```
293 |
--------------------------------------------------------------------------------
/docs/ru/localization.md:
--------------------------------------------------------------------------------
1 | # Локализация
2 |
3 | SleepingOwl Admin использует локаль из конфигурации в вашем `config/app.php`.
4 |
5 | ```php
6 | /*
7 | |--------------------------------------------------------------------------
8 | | Application Locale Configuration
9 | |--------------------------------------------------------------------------
10 | |
11 | | The application locale determines the default locale that will be used
12 | | by the translation service provider. You are free to set this value
13 | | to any of the locales which will be supported by the application.
14 | |
15 | */
16 |
17 | 'locale' => 'ru',
18 | ```
19 |
20 |
21 | ## Поддерживаемые локали
22 |
23 | - en
24 | - ru
25 | - uk
26 | - zn-CN
27 | - локали es, pl, pt-BR пока не поддерживаются полностью, и совсем не поддерживаются в новой ветке `dev-bs4` но мы работаем над этим
28 |
29 |
30 |
31 | ## Ваши собственные локали
32 |
33 | Вы можете добавить свою локализацию. Для этого создайте файл
34 | `resources/lang/vendor/sleeping_owl/{locale}/lang.php`, вставьте все
35 | из `vendor/laravelrus/sleepingowl/resource/lang/{locale}/lang.php` и
36 | сделайте необходимые изменения.
37 |
38 | **Вы можете отправить мне вашу локализацию для включения ее в основной состав пакета.**
39 |
40 | А так же Вы можете поправить / добавить перевод на сайте https://www.transifex.com/sleepingowl/sleepingowl-admin-panel/
41 |
--------------------------------------------------------------------------------
/docs/ru/menu_configuration.md:
--------------------------------------------------------------------------------
1 | # Конфигурация меню
2 | - [Объект Navigation](#navigation)
3 | - [Добавление разделов](#add-page)
4 | - [Добавление разделов в виде массива](#set-pages)
5 | - [Добавление секции в подраздел при инициализации](#add-sub-section)
6 | - [Получение списка разделов](#get-pages)
7 | - [Получение кол-ва разделов с учетом вложенности](#count-pages)
8 | - [Права на видимость разделов](#access)
9 | - [Пример меню](#menu-example)
10 | - [Объект страницы](#page)
11 | - [API](#page-api)
12 | - [Badges](#page-badge)
13 | - [Page Collection](#page-collection)
14 |
15 |
16 | Конфигурация меню SleepingOwl Admin по умолчанию располагается в `app/Admin/navigation.php`. Если файл
17 | возвращает массив, то этот массив будет также использоваться для построения меню.
18 |
19 |
20 | ## Объект Navigation
21 |
22 | Navigation представлен классом `SleepingOwl\Admin\Navigation` (Реализует интерфейс `KodiComponents\Navigation\Contracts\NavigationInterface`), который инициализируется через Service Container - `sleeping_owl.navigation` и доступен с помощью:
23 |
24 | #### Service Container
25 | ```php
26 | $navigation = app('sleeping_owl.navigation');
27 | ```
28 |
29 | #### Фасад
30 | `AdminNavigation`
31 |
32 | Данный объект содержит в себе массив всех элементов меню для административного интерфейса.
33 |
34 |
35 | ## Добавление разделов
36 |
37 | В меню можно добавлять любые объекты реализующие интерфейс `KodiComponents\Navigation\Contracts\PageInterface`
38 |
39 | ```php
40 | addPage(string|array|PageInterface $page): PageInterface
41 | ```
42 |
43 | **Если в качестве аргумента передана строка или массив, то в качестве раздела будет создан объект `SleepingOwl\Admin\Navigation\Page`**
44 |
45 | #### Аргумент `array $page`
46 | При передаче параметров раздела в виде массива, будет произведен обход каждого ключа массива и вызван метод `set + $key` и передано в качестве аргумента значение, т.е.
47 |
48 | ```php
49 | AdminNavigation::addPage(['title' => 'test', 'priority' => 100, 'badge' => function() {
50 | return 100
51 | }]);
52 |
53 | // выполнит следующее
54 | $page = app()->make(KodiComponents\Navigation\Contracts\PageInterface::class);
55 | $page->setTitle('test');
56 | $page->setPriority(100);
57 | $page->addBadge(function() { // Для бейджев несколько другое условие
58 | return 100
59 | });
60 |
61 | $navigation->getPages()->push($page);
62 | ```
63 |
64 | #### Аргумент `string $page`
65 | При передаче параметра раздела в виде строки, будет создан новый объект раздела и указан заголовок.
66 |
67 | ```php
68 | AdminNavigation::addPage('test');
69 |
70 | // выполнит следующее
71 | $page = app()->make(KodiComponents\Navigation\Contracts\PageInterface::class);
72 | $page->setTitle('test');
73 | $navigation->getPages()->push($page);
74 | ```
75 |
76 | #### Аргумент `PageInterface $page`
77 | В навигацию будет добавлен новый раздел - переданный объект
78 |
79 | ```php
80 | AdminNavigation::addPage(Page $page);
81 | $navigation->getPages()->push($page);
82 | ```
83 |
84 | Новый раздел в меню можно добавить несколькими способами:
85 |
86 | #### Через сервис контейнер
87 |
88 | ```php
89 | app('sleeping_owl.navigation')
90 | ->addPage()
91 | ->setTitle('Blog')
92 | ->setUrl('/blog');
93 | ```
94 |
95 | #### Фасад
96 | ```php
97 | // Создание элемента меню для модели
98 | AdminNavigation::addPage('Blog')
99 | ->setPriority(100)
100 | ->setIcon('fa fa-newspaper-o');
101 | ```
102 |
103 | #### `AdminSection` класс
104 | ```php
105 | AdminSection::addMenuPage(\App\User::class);
106 | ```
107 |
108 |
109 | ## Добавление разделов в виде массива
110 |
111 | Для более удобной генерации меню можно передавать список разделов в виде массива, тогда при обходе массива меню, для каждого раздела будет вызван метод `addPage`
112 |
113 | **Пример**
114 | ```php
115 | AdminNavigation::setFromArray([
116 | [
117 | 'title' => 'Permissions',
118 | 'icon' => 'fa fa-group',
119 | 'pages' => [
120 | [
121 | 'title' => 'Users',
122 | 'url' => ...
123 | ],
124 | [
125 | 'title' => 'Roles',
126 | 'url' => ...
127 | ],
128 | ]
129 | ],
130 | (new \SleepingOwl\Admin\Navigation\Page(\App\Model\News::class))
131 | ->setIcon('fa fa-newspaper-o')
132 | ->setPriority(0)
133 | ]);
134 | ```
135 |
136 | Данные правила действуют и для внутренних разделов
137 |
138 | ```php
139 | $page = new \SleepingOwl\Admin\Navigation\Page(\App\Model\News::class);
140 | $page->setIcon('fa fa-newspaper-o');
141 | $page->setFromArray([
142 | ...
143 | ]);
144 | ```
145 |
146 |
147 | ## Добавление секции в подраздел при инициализации
148 | **Внимание:**
149 | Что бы добавление работало, необходимо, чтобы инициализация классов разделов, происходила раньше, чем обработка секций.
150 |
151 | ```php
152 | // AdminSectionsServiceProvider.php
153 | public function boot(\SleepingOwl\Admin\Admin $admin)
154 | {
155 | ...
156 | $this->app->call([$this, 'registerNavigation']);
157 | parent::boot($admin);
158 | ...
159 | }
160 |
161 | ```
162 |
163 | Если вы хотите добавить секцию, как подраздел пункта меню, в ходе инициализации секции, то необходимо установить id этого пункта меню для последующего поиска:
164 | ```php
165 | [
166 | 'title' => 'Parent Section',
167 | 'id' => 'parent-section'
168 | ],
169 | ```
170 | Далее в секции производим поиск родительского раздела и добавляем свою секцию:
171 | ```php
172 | /**
173 | * Initialize class.
174 | */
175 | public function initialize()
176 | {
177 | $page = \AdminNavigation::getPages()->findById('parent-section');
178 |
179 | $page->addPage(
180 | $this->makePage(300)
181 | );
182 | }
183 | ```
184 |
185 |
186 |
187 | ## Получение списка разделов
188 |
189 | ```php
190 | AdminNavigation::getPages(): KodiComponents\Navigation\PageCollection
191 |
192 | $page = AdminNavigation::getPages()->first(): KodiComponents\Navigation\Contracts\PageInterface
193 | $page->getPages(): KodiComponents\Navigation\PageCollection
194 | ```
195 |
196 |
197 | ## Получение кол-ва разделов с учетом вложенности
198 |
199 | ```php
200 | AdminNavigation::countPages(): int;
201 |
202 | AdminNavigation::getPages()->first()->countPages(); // Подсчет кол-во детей для конкретного раздела
203 | ```
204 |
205 |
206 | ## Права на видимость разделов
207 |
208 | Также для разделов меню можно настраивать правила видимости.
209 | Процесс проверки прав доступа выглядит следующим образом: каждый объект меню может иметь свое локальное правило
210 | проверки прав
211 |
212 | ```php
213 | AdminNavigation::addPage(\App\Blog::class)->setAccessLogic(function() {
214 | return auth()->user()->isSuperAdmin();
215 | })
216 | ```
217 |
218 | **Если правило для страницы не указано:**
219 | - Если пункт меню является ссылкой на раздел и раздел не доступен для просмотра, пункт исчезнет из меню.
220 | - Если у страницы есть предок, то происходит проверка наличия правила, если оно указано, то будет произведена проверка.
221 | - Если предок не имеет правила, то подъем дальше по иерархии до глобального правила.
222 |
223 | **Есть несколько сценариев настройки прав доступа:**
224 | - Указать глобальное правило
225 |
226 | ```php
227 | AdminNavigation::setAccessLogic(function(Page $page) {
228 | return auth()->user()->isSuperAdmin();
229 | });
230 | ```
231 | - Указать правило для конкретной страницы
232 | - Указать правило для раздела содержащего страницы, это правило
233 | распространится на все внутренние страницы не имеющие своего правила
234 |
235 |
236 |
237 | ## Пример меню
238 | Вот простой пример как может выглядеть конфигурация меню:
239 |
240 | ```php
241 | return [
242 | [
243 | 'title' => 'Permissions',
244 | 'icon' => 'fa fa-group',
245 | 'pages' => [
246 | (new Page(\App\User::class))
247 | ->setIcon('fa fa-user')
248 | ->setPriority(0),
249 | (new Page(\App\Role::class))
250 | ->setIcon('fa fa-group')
251 | ->setPriority(100)
252 | ]
253 | ]
254 | ];
255 | ```
256 |
257 |
258 | ## Объект страницы
259 |
260 | Каждый раздел меню (страница) - объект `SleepingOwl\Admin\Navigation\Page`, реализующий
261 | интерфейс `KodiComponents\Navigation\Contracts\PageInterface` и наследует
262 | интерфейс `KodiComponents\Navigation\Contracts\NavigationInterface`, т.е. каждый раздел ведет себя также как и объект `Navigation`
263 | Данный объект содержит все параметры текущей страницы, а также массив вложенных разделов.
264 |
265 | На данный момент доступны два класса страниц
266 |
267 | - `KodiComponents\Navigation\Page` - для создания обычных разделов
268 | - `SleepingOwl\Admin\Navigation\Page` - для создания разделов привязанных к классу конфигурации модели
269 |
270 | ### `KodiComponents\Navigation\Page`
271 |
272 | ```php
273 | new KodiComponents\Navigation\Page(
274 | string $title = null,
275 | string|Illuminate\Contracts\Routing\UrlGenerator $url = null,
276 | string $id = null,
277 | int $priority = 100,
278 | string $icon = null
279 | )
280 | ```
281 |
282 | ### `SleepingOwl\Admin\Navigation\Page`
283 |
284 | ```php
285 | new SleepingOwl\Admin\Navigation\Page(
286 | string $modelClass = null
287 | )
288 | ```
289 |
290 |
291 | ## API
292 |
293 | ### `addAlias(array|string $aliases)`
294 | Добавление дополнительного списка `url` адресов, по которым данный раздел должен быть активен
295 |
296 | ### `addPage(string|array|PageInterface|null $page)`
297 | [Добавление дочерней страницы](#add-page)
298 |
299 | ### `setPages(Closure $pages)`
300 | Добавление дочерних страниц через анонимную функцию
301 |
302 | ```php
303 | $page->setPages(function($page) {
304 | $page->addPage(...);
305 | });
306 | ```
307 |
308 | ### `setId(string $id)`
309 | Добавление уникального идентификатора для страницы, необходим для [поиска страницы](#find-by-id)
310 |
311 | ```php
312 | AdminNavigation::addPage(['title' => '...', 'id' => 'unique_string']);
313 | ```
314 |
315 | ### `setTitle(string $title)`
316 | Указание заголовка для страницы
317 |
318 |
319 | ### `setIcon(string $icon)`
320 | Указание иконки для страницы
321 |
322 | ### `setUrl(string $url)`
323 | Указание ссылки
324 |
325 | ### `setPriority(int $priority)`
326 | Указание приоритета вывода
327 |
328 |
329 | ### `getPath(int $priority)`
330 | Получение массива заголовков для текущего раздела с учетом родительских разделов
331 |
332 | ```php
333 | $page1 = 'Title 1';
334 | $page2 = 'Title 2';
335 | $page3 = 'Title 3';
336 |
337 | $page3->getPath() // ['Title 1', 'Title 2', 'Title 3']
338 | ```
339 |
340 | ### `getPath(int $priority)`
341 | Получение массива (цепочки) от текущей страницы для корневой для построения хлебных крошек
342 |
343 |
344 |
345 | ## Badges
346 |
347 | Каждая страница может содержать неограниченное кол-во бейджев. При вызове метода `setBadge` или `addBadge`
348 | происходит передача текущего бейджа в стек. При выводе страницы будут выведены все бейджы из стека.
349 |
350 | ### `setBadge(KodiComponents\Navigation\Contracts\BadgeInterface $badge)`
351 | Добавление объекта бейджа
352 |
353 | ### `addBadge(string|Closure $value, array $htmlAttributes)`
354 | Добавление бейджа
355 |
356 | ```php
357 | $page->addBadge(function() {
358 | return News::count();
359 | }, ['class' => 'label-danger'])
360 | ```
361 |
362 |
363 | ## Page Collection
364 |
365 | Объект `KodiComponents\Navigation\PageCollection` наследуется от `Illuminate\Support\Collection` и содержит массив
366 | дочерних страниц для разделов и объекта навигации.
367 |
368 |
369 | ### `findById(string $id): PageInterface|null`
370 | Поиск страницы по ID
371 |
372 | ```php
373 | AdminNavigation::getPages()->findById('unique_string'): PageInterface|null
374 | ```
375 |
376 |
377 | ### `findByPath(string $path, string $separator = '/'): PageInterface|null`
378 | Поиск страницы по [пути вложенности](#page-path)
379 |
380 | ```php
381 | // с разделителем `Title 1/Title 2/Title 3`
382 | AdminNavigation::getPages()->findByPath('Title 1/Title 2/Title 3'): PageInterface|null
383 | ```
--------------------------------------------------------------------------------
/docs/ru/model_configuration.md:
--------------------------------------------------------------------------------
1 | # Конфигурация модели
2 |
3 | !> Это старый способ и лучше его не использовать. Сразу переходите [сюда](model_configuration_section)
4 |
5 | - [Конфигурация модели](#Конфигурация-модели)
6 | - [Всплывающие сообщения при совершении действий](#Всплывающие-сообщения-при-совершении-действий)
7 | - [Запрет на выполнение действий](#Запрет-на-выполнение-действий)
8 | - [Переопределение редиректа при выполнении действий](#Переопределение-редиректа-при-выполнении-действий)
9 | - [Ограничение прав доступа](#Ограничение-прав-доступа)
10 | - [События](#События)
11 | - [Переопределение контроллера](#Переопределение-контроллера)
12 | - [API (Доступные методы)](#api-Доступные-методы)
13 |
14 | Конфигурация моделей SleepingOwl Admin должна быть расположена в директории, которая указывается в конфиге `sleeping_owl.bootstrapDirectory` (*по умолчанию: `app/admin`*).
15 |
16 | Вы можете хранить конфигурацию моделей в одном файле или разделить на несколько по желанию.
17 |
18 | Ниже приведен пример того, как может выглядеть конфигурация модели:
19 |
20 | ```php
21 | AdminSection::registerModel(Company::class, function (ModelConfiguration $model) {
22 | $model->setTitle('Companies');
23 | // Display
24 | $model->onDisplay(function () {
25 | $display = AdminDisplay::table()->setColumns([
26 | AdminColumn::link('title')->setLabel('Title')->setWidth('400px'),
27 | AdminColumn::text('address')->setLabel('Address')->setAttribute('class', 'text-muted'),
28 | ]);
29 | $display->paginate(15);
30 | return $display;
31 | });
32 | // Create And Edit
33 | $model->onCreateAndEdit(function() {
34 | $form = AdminForm::panel()->addBody(
35 | AdminFormElement::text('title', 'Title')->required()->unique(),
36 | AdminFormElement::textarea('address', 'Address')->setRows(2),
37 | AdminFormElement::text('phone', 'Phone')
38 | );
39 | return $form;
40 | });
41 | })
42 | ->addMenuPage(Company::class, 0)
43 | ->setIcon('fa fa-bank');
44 | ```
45 |
46 | По умолчанию раздел будет доступен по ссылке `admin/companies`, т.е. будет взято название класса в множественной форме. Для указания собственного пути, необходимо использовать метод `setAlias`
47 |
48 | ```php
49 | ...
50 | $model->setAlias('subdir/companies');
51 | ...
52 | ```
53 |
54 |
55 | ## Всплывающие сообщения при совершении действий
56 |
57 | Вы можете изменить текст сообщений, который отображается при добавлении, редактировании и удалении записи.
58 |
59 | ```php
60 | AdminSection::registerModel(Company::class, function (ModelConfiguration $model) {
61 |
62 | // Создание записи
63 | $model->setMessageOnCreate('Company created');
64 |
65 | // Редактирование записи
66 | $model->setMessageOnUpdate('Company updated');
67 |
68 | // Удаление записи
69 | $model->setMessageOnDelete('Company deleted');
70 |
71 | // Восстановление записи
72 | $model->setMessageOnRestore('Company restored');
73 | });
74 | ```
75 |
76 |
77 | ## Запрет на выполнение действий
78 |
79 | Бывают случаи когда необходимо например запретить редактирование или удаление данных в разделе. Для этого целей существую специальные методы:
80 |
81 | ```php
82 | AdminSection::registerModel(Company::class, function (ModelConfiguration $model) {
83 | // Запрет на просмотр
84 | $model->disableDisplay();
85 |
86 | // Запрет на создание
87 | $model->disableCreating();
88 |
89 | // Запрет на редактирование
90 | $model->disableEditing();
91 |
92 | // Запрет на удаление
93 | $model->disableDeleting();
94 |
95 | // Запрет на восстановление
96 | $model->disableRestoring();
97 | })
98 | ```
99 |
100 |
101 | ## Переопределение редиректа при выполнении действий
102 |
103 | Бывают случаи когда необходимо назначить свою логику для редиректа - например вы хотите что бы система отправляла
104 | пользователя после нажатия на кнопку сохранить в таблицу, а не на страницу редактирования
105 |
106 | ```php
107 | AdminSection::registerModel(Company::class, function (ModelConfiguration $model) {
108 | // Редирект при редактировании в таблицу
109 | $model->setRedirect(['edit' => 'display']);
110 |
111 | // Редирект при редактировании в таблицу
112 | $model->setRedirect(['create' => 'display']);
113 |
114 | // Оба случая вместе
115 | $model->setRedirect(['create' => 'display', 'edit' => 'display']);
116 |
117 | //В противном случае сработает дефолтная логика
118 |
119 | })
120 | ```
121 |
122 |
123 |
124 | ## Ограничение прав доступа
125 |
126 | По умолчанию все пользователи имеют доступ к разделам админ панели. Если вы хотите настроить права доступа к каким либо разделам вам необходимо в первую очередь включить проверку прав
127 |
128 | ```php
129 | AdminSection::registerModel(User::class, function (ModelConfiguration $model) {
130 | ...
131 | $model->enableAccessCheck();
132 | ...
133 | });
134 | ```
135 |
136 | После этого за проверку за каждое действие будет отвечать `Gate` https://laravel.com/docs/5.2/authorization#via-the-gate-facade
137 |
138 | Как мы можем это использовать? В Laravel имеется для решения этой задачи отличное средство - `Policies` https://laravel.com/docs/5.2/authorization#policies
139 |
140 | Поэтому необходимо создать класс, например `App\Policies\UserPolicy`
141 |
142 | ```php
143 | isSuperAdmin()) {
164 | return true;
165 | }
166 | }
167 |
168 | /**
169 | * @param User $user
170 | * @param User $item
171 | *
172 | * @return bool
173 | */
174 | public function display(User $user, User $item)
175 | {
176 | return true;
177 | }
178 |
179 | /**
180 | * @param User $user
181 | * @param User $item
182 | *
183 | * @return bool
184 | */
185 | public function create(User $user, User $item)
186 | {
187 | return true;
188 | }
189 |
190 | /**
191 | * @param User $user
192 | * @param User $item
193 | *
194 | * @return bool
195 | */
196 | public function edit(User $user, User $item)
197 | {
198 | return true;
199 | }
200 |
201 | /**
202 | * @param User $user
203 | * @param User $item
204 | *
205 | * @return bool
206 | */
207 | public function delete(User $user, User $item)
208 | {
209 | return true;
210 | }
211 |
212 | /**
213 | * @param User $user
214 | * @param User $item
215 | *
216 | * @return bool
217 | */
218 | public function restore(User $user, User $item)
219 | {
220 | return true;
221 | }
222 | }
223 |
224 | ```
225 |
226 | Данный класс содержит методы вызываемые в момент проверки прав доступа к определенным операциям, в первую очередь вызывается метод `before`, в котором производится глобальная проверка прав, если он возвращает true, то дальнейшая проверка не проводится, если ничего не возвращает, то дальше происходит вызов метода, отвечающего за конкретное действие и передается два параметра:
227 | - Объект текущего пользователя
228 | - Объект для которого нужно проверить права доступа
229 |
230 | Например если мы хотим чтобы пользователь мог создавать записи и редактировать только свои записи в блоге:
231 |
232 | ```php
233 | public function create(User $user, Post $post)
234 | {
235 | return true;
236 | }
237 |
238 | public function edit(User $user, Post $post)
239 | {
240 | return $post->isAutoredBy($user);
241 | }
242 | ```
243 |
244 | Теперь остается зарегистрировать policy в `App\Providers\AuthServiceProvider`
245 |
246 | ```php
247 | protected $policies = [
248 | ...
249 | \App\User::class => \App\Policies\UserPolicy::class
250 | ...
251 | ];
252 | ```
253 |
254 | После чего раздел будет использовать этот policy для проверки прав доступа.
255 |
256 | Данный механизм позволяет очень гибко настраивать права доступа к каждому разделу.
257 |
258 |
259 | ## События
260 |
261 | У вас есть возможность подписаться на события создания, редактирования, удаления и восстановления записей в разделе.
262 |
263 | ```php
264 | AdminSection::registerModel(Company::class, function (ModelConfiguration $model) {
265 |
266 | // Создание записи
267 | $model->creating(function(ModelConfiguration $model, Company $company) {
268 | // Если вернуть false, то создание будет прервано
269 | });
270 |
271 | $model->created(function(ModelConfiguration $model, Company $company) {
272 |
273 | });
274 |
275 | // Обновление записи
276 | $model->updating(function(ModelConfiguration $model, Company $company) {
277 | // Если вернуть false, то обновление будет прервано
278 | });
279 |
280 | $model->updated(function(ModelConfiguration $model, Company $company) {
281 |
282 | });
283 |
284 | // Удаление записи
285 | $model->deleting(function(ModelConfiguration $model, Company $company) {
286 | // Если вернуть false, то удаление будет прервано
287 | });
288 |
289 | $model->deleted(function(ModelConfiguration $model, Company $company) {
290 |
291 | });
292 |
293 | // Восстановление записи
294 | $model->restoring(function(ModelConfiguration $model, Company $company) {
295 | // Если вернуть false, то восстановление будет прервано
296 | });
297 |
298 | $model->restored(function(ModelConfiguration $model, Company $company) {
299 |
300 | });
301 | });
302 | ```
303 |
304 | Также чисто теоретически можно подписаться на событие следующим образом
305 |
306 | ```php
307 | Even::listen('sleeping_owl.section.updating:'.Company::class, function(ModelConfiguration $model, Company $company) {
308 |
309 | });
310 | ```
311 |
312 |
313 | ## Переопределение контроллера
314 |
315 | В случае если вы хотите использовать собственный контроллер используйте метод `setControllerClass`
316 |
317 | ```php
318 | AdminSection::registerModel(User::class, function (ModelConfiguration $model) {
319 | ...
320 | $model->setControllerClass(UserController::class);
321 | ...
322 | });
323 | ```
324 |
325 | ```php
326 | namespace App\Http\Controllers;
327 |
328 | class UserController extends \SleepingOwl\Admin\Http\Controllers\AdminController
329 | {
330 | ...
331 | }
332 | ```
333 |
334 |
335 | ## API (Доступные методы)
336 |
337 | ### setAlias
338 | Установка алиаса ссылки для раздела *(По умолчанию название класса модели во множественном числе)*
339 |
340 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setAlias(string $alias)
341 |
342 | ```php
343 | $model->setAlias('manage/user');
344 | ```
345 |
346 | ### setTitle
347 | Установка заголовка для раздела *(По умолчанию название класса модели во множественном числе)*
348 |
349 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setTitle(string $title)
350 |
351 |
352 | ### setCreateTitle
353 | Установка заголовка для страницы создания
354 |
355 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setCreateTitle(string $title)
356 |
357 | ### setUpdateTitle
358 | Установка заголовка для страницы редактирования
359 |
360 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setUpdateTitle(string $title)
361 |
362 | ### onDisplay
363 | Описание данных для вывода списка записей на страницы
364 |
365 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::onDisplay(\Closure $callback)
366 |
367 | ### onCreate
368 | Описание формы для страницы создания записи (Форму редактирования необходимо будет описывать отдельно)
369 |
370 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::onCreate(\Closure|null $callback)
371 |
372 | ### onEdit
373 | Описание формы для страницы редактирования записи (Форму создания необходимо будет описывать отдельно)
374 |
375 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::onEdit(\Closure|null $callback)
376 |
377 | ##### Arguments
378 | * $callback **Closure|null** В функцию будет передан идентификатор записи
379 |
380 |
381 | ### onCreateAndEdit
382 | Описание формы для страницы создания и редактирования записи
383 |
384 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::onCreateAndEdit(\Closure|null $callback)
385 |
386 | ##### Arguments
387 | * $callback **Closure|null** В функцию будет передан идентификатор записи
388 |
389 |
390 | ### onDelete
391 | Код, который будет выполнен в момент удаления записи
392 |
393 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::onDelete(\Closure|null $callback)
394 |
395 | ##### Arguments
396 | * $callback **Closure|null** В функцию будет передан идентификатор записи
397 |
398 |
399 | ### onDestroy
400 | Код, который будет выполнен в момент окончательного удаления записи (в случае если запись помечена как удаленная)
401 |
402 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::onDestroy(\Closure|null $callback)
403 |
404 | ##### Arguments
405 | * $callback **Closure|null** В функцию будет передан идентификатор записи
406 |
407 | ### onRestore
408 | Код, который будет выполнен в момент восстановления записи
409 |
410 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::onRestore(\Closure|null $callback)
411 |
412 | ##### Arguments
413 | * $callback **Closure|null** В функцию будет передан идентификатор записи
414 |
415 |
416 | ### disableDisplay
417 | Запрет страницы просмотра списка записей раздела
418 |
419 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::disableDisplay()
420 |
421 |
422 | ### disableCreating
423 | Запрет создания записей
424 |
425 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::disableCreating()
426 |
427 | ### disableEditing
428 | Запрет редактирования записей
429 |
430 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::disableEditing()
431 |
432 | ### disableDeleting
433 | Запрет удаления записей
434 |
435 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::disableDeleting()
436 |
437 |
438 | ### disableDestroying
439 | Запрет окончательного удаления записей (в случае если запись помечена как удаленная)
440 |
441 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::disableDestroying()
442 |
443 | ### disableRestoring
444 | Запрет восстановления записей
445 |
446 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::disableRestoring()
447 |
448 |
449 | ### enableAccessCheck
450 | Включение проверки прав доступа для раздела (Для проверки прав доступа используется `Gate`. По умолчанию доступ запрещен для всех)
451 |
452 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::enableAccessCheck()
453 |
454 | ### disableAccessCheck
455 | Выключение проверки прав доступа
456 |
457 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::disableAccessCheck()
458 |
459 | ### setMessageOnCreate
460 | Установка текста сообщения отображаемого после создания записи
461 |
462 | mixed SleepingOwl\Admin\Model\ModelConfiguration::setMessageOnCreate(string $messageOnCreate)
463 |
464 | ### setMessageOnUpdate
465 | Установка текста сообщения отображаемого после обновления записи
466 |
467 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setMessageOnUpdate(string $messageOnUpdate)
468 |
469 | ### setMessageOnDelete
470 | Установка текста сообщения отображаемого после удаления записи
471 |
472 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setMessageOnDelete(string $messageOnDelete)
473 |
474 | ### setMessageOnDestroy
475 | Установка текста сообщения отображаемого после окончательного удаления записи (в случае если запись помечена как удаленная)
476 |
477 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setMessageOnDestroy(string $messageOnDestroy)
478 |
479 | ### setMessageOnRestore
480 | Установка текста сообщения отображаемого после восстановления записи
481 |
482 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setMessageOnRestore(string $messageOnRestore)
483 |
484 |
485 | ### setControllerClass
486 | Установка названия класса, который будет использован для работы с данными раздела
487 |
488 | \SleepingOwl\Admin\Model\ModelConfiguration SleepingOwl\Admin\Model\ModelConfiguration::setControllerClass(string $controllerClass)
489 |
490 | ### setIcon
491 | Установка иконки для раздела (Будет отображаться в меню)
492 |
493 | \SleepingOwl\Admin\Model\ModelConfigurationManager SleepingOwl\Admin\Model\ModelConfigurationManager::setIcon(string $icon)
494 |
495 |
496 | ### addToNavigation
497 | Добавление раздела в меню
498 |
499 | \SleepingOwl\Admin\Navigation\Page SleepingOwl\Admin\Model\ModelConfigurationManager::addToNavigation(integer $priority, string|\Closure|\KodiComponents\Navigation\Contracts\BadgeInterface $badge)
500 |
501 | ##### Arguments
502 | * $priority **integer** Приоритет вывода в списке
503 | * $badge **string|Closure|KodiComponents\Navigation\Contracts\BadgeInterface** Текст или класс бейджа, который отображается рядом с пунктом меню (Например кол-во записей)
504 |
505 | ### creating
506 | Событие срабатывающее в процессе создания записи (В случае если метод возвращает false, запись не будет создана)
507 |
508 | SleepingOwl\Admin\Model\ModelConfigurationManager::creating(Closure $callback)
509 |
510 | ##### Arguments
511 | * $callback **Closure|null** В функцию будет передан `ModelConfigurationInterface $config` и `\Illuminate\Database\Eloquent\Model $model`
512 |
513 | ### created
514 | Событие срабатывающее после создания записи
515 |
516 | SleepingOwl\Admin\Model\ModelConfigurationManager::created(Closure $callback)
517 |
518 | ##### Arguments
519 | * $callback **Closure|null** В функцию будет передан `ModelConfigurationInterface $config` и `\Illuminate\Database\Eloquent\Model $model`
520 |
521 | ### updating
522 | Событие срабатывающее в процессе обновления записи (В случае если метод возвращает false, запись не будет обновлена)
523 |
524 | SleepingOwl\Admin\Model\ModelConfigurationManager::updating(Closure $callback)
525 |
526 | ##### Arguments
527 | * $callback **Closure|null** В функцию будет передан `ModelConfigurationInterface $config` и `\Illuminate\Database\Eloquent\Model $model`
528 |
529 | ### updated
530 | Событие срабатывающее после обновления записи
531 |
532 | SleepingOwl\Admin\Model\ModelConfigurationManager::updated(Closure $callback)
533 |
534 | ### deleting
535 | Событие срабатывающее в процессе удаления записи (В случае если метод возвращает false, запись не будет удалена)
536 |
537 | SleepingOwl\Admin\Model\ModelConfigurationManager::deleting(Closure $callback)
538 |
539 | ##### Arguments
540 | * $callback **Closure|null** В функцию будет передан `ModelConfigurationInterface $config` и `\Illuminate\Database\Eloquent\Model $model`
541 |
542 | ### deleted
543 | Событие срабатывающее после удаления записи
544 |
545 | SleepingOwl\Admin\Model\ModelConfigurationManager::deleted(Closure $callback)
546 |
547 | ##### Arguments
548 | * $callback **Closure|null** В функцию будет передан `ModelConfigurationInterface $config` и `\Illuminate\Database\Eloquent\Model $model`
549 |
550 | ### restoring
551 | Событие срабатывающее в процессе восстановления записи (В случае если метод возвращает false, запись не будет восстановлена)
552 |
553 | SleepingOwl\Admin\Model\ModelConfigurationManager::restoringClosure $callback)
554 |
555 | ##### Arguments
556 | * $callback **Closure|null** В функцию будет передан `ModelConfigurationInterface $config` и `\Illuminate\Database\Eloquent\Model $model`
557 |
558 | ### restored
559 | Событие срабатывающее после восстановления записи
560 |
561 | SleepingOwl\Admin\Model\ModelConfigurationManager::restored(Closure $callback)
562 |
563 | ##### Arguments
564 | * $callback **Closure|null** В функцию будет передан `ModelConfigurationInterface $config` и `\Illuminate\Database\Eloquent\Model $model`
--------------------------------------------------------------------------------
/docs/ru/releases.md:
--------------------------------------------------------------------------------
1 | # Описание версий
2 |
3 |
4 | ## SleepingOwl Admin 4
5 |
6 | Начиная с 4-й версии развитие пакета производится силами сообщества [LaravelRUS](https://github.com/LaravelRUS).
7 |
8 | Официальная версия документации V4 (Russian): https://github.com/LaravelRUS/SleepingOwlAdmin-docs
9 | Официальная версия документации V4 (English - needed help to translate from Russian): https://github.com/LaravelRUS/SleepingOwlAdmin-docs/blob/master/eng/
10 |
11 | Эта документация на отдельном сайте: http://sleepingowl.laravel.su/ (там и другие ссылки полезные есть)
12 |
13 | Группа Вконтакте: https://vk.com/sleepingowladm
14 |
15 | Сайт сообщества: laravel.su
16 |
17 | ---
18 |
19 |
20 | ## SleepingOwl Admin 3 (beta)
21 |
22 | ВНИМАНИЕ: данная вресия более не поддерживается.
23 |
24 | ### Ссылки
25 |
26 | GitHub: https://github.com/sleeping-owl/admin/tree/development
27 |
28 | Демо: http://sleepingowladmindemo2.cloudcontrolled.com/
29 |
30 | Документация на русском языке: http://sleeping-owl.github.io/v3/ru/Introduction.html
31 |
32 | Документация на английском
33 | http://sleeping-owl.github.io/v3/en/Introduction.html
34 |
35 | ---
36 |
37 |
38 | ## SleepingOwl Admin 2
39 |
40 | ВНИМАНИЕ: данная вресия более не поддерживается.
41 |
42 | ### Ссылки
43 |
44 | GitHub: https://github.com/sleeping-owl/admin
45 |
46 | Демо: http://sleepingowladmindemo.cloudcontrolled.com/admin/login
47 |
48 | Документация на русском языке: http://sleeping-owl.github.io/ru/Introduction.html
49 |
50 | Документация на английском: http://sleeping-owl.github.io/en/Introduction.html
51 |
52 |
53 |
--------------------------------------------------------------------------------
/docs/ru/routes_configuration.md:
--------------------------------------------------------------------------------
1 | # Конфигурация роутов
2 |
3 | Вы можете регистрировать свои роуты в файле `routes.php` в директории `bootstrapDirectory` (*по умолчанию: `app/Admin/routes.php`*).
4 |
5 | ```php
6 | Route::get('my-url', function () {
7 | $content = 'my page content';
8 | return AdminSection::view($content, 'My Page Title');
9 | });
10 |
11 | Route::post('category/my-url', '\App\Http\Controllers\MyController@postMyUrl');
12 |
13 | Route::any('my-page', [
14 | 'as' => 'admin.my-page',
15 | 'uses' => '\App\Http\Controllers\MyPageController@myPage',
16 | ]);
17 | ```
18 |
19 | Все роуты будут зарегистрированы с административным префиксом и middleware.
20 |
21 | !>**Важно**: Если вы хотите отобразить свой контент внутри административного интерфейса используйте метод `AdminSection::view($content, $title)`.
--------------------------------------------------------------------------------
/docs/ru/update.md:
--------------------------------------------------------------------------------
1 | # Руководство по обновлению
2 |
3 | Обновление пакета осуществляется с помощью `composer`
4 |
5 | ```bash
6 | $ composer update
7 | ```
8 |
9 | После обновления, желательно выполнять команду
10 |
11 | ```bash
12 | $ php artisan sleepingowl:update
13 | ```
14 | или
15 |
16 | ```bash
17 | $ php artisan vendor:publish --tag=assets --force
18 | ```
19 |
20 |
21 | для обновления компонентов.
22 |
23 | Также стоит сбросить кеш view
24 |
25 | ```bash
26 | $ php artisan view:clear
27 | ```
28 |
29 | При желании можно добавить команду в `composer.json` для автоматического запуска команды
30 |
31 | ```json
32 | {
33 | "scripts": {
34 | "post-update-cmd": [
35 | "php artisan sleepingowl:update"
36 | ]
37 | },
38 | }
39 | ```
40 |
--------------------------------------------------------------------------------
/docs/ru/widgets.md:
--------------------------------------------------------------------------------
1 | # Управление виджетами
2 |
3 | Виджеты предназначены для вставки в блоки `@yield` или `@stack` в шаблоны собственных кусков HTML кода.
4 | Они могут быть полезны, например, если вам необходимо добавить в шаблон навигации по админ панели собственные пункты меню.
5 |
6 | ## Как использовать
7 |
8 | Каждый виджет представляет собой класс реализующий интерфейс `SleepingOwl\Admin\Contracts\Widgets\WidgetInterface`. Для удобства существует
9 | абстрактный класс `SleepingOwl\Admin\Widgets\Widget`, которы реализует часть методов интерфейса и вы можете наследовать свой класс от него.
10 |
11 | **Пример класса виджета**
12 |
13 | ```php
14 | render();
53 | }
54 |
55 | /**
56 | * Путь до шаблона, в который добавляем
57 | *
58 | * @return string|array
59 | */
60 | public function template()
61 | {
62 | // AdminTemplate::getViewPath('dashboard') == 'sleepingowl:default.dashboard'
63 | return \AdminTemplate::getViewPath('dashboard');
64 | }
65 |
66 | /**
67 | * Блок в шаблоне, куда помещаем
68 | *
69 | * @return string
70 | */
71 | public function block()
72 | {
73 | return 'block.top';
74 | }
75 | }
76 |
77 | ```
78 |
79 |
80 | После создания класса, его необходимо зарегистрировать с реестре виджетов, например так:
81 |
82 | ```php
83 | class AppServiceProvider extends ServiceProvider
84 | {
85 | /**
86 | * Список виджетов, которые необходимо подключить в шаблоны
87 | *
88 | * @var array
89 | */
90 | protected $widgets = [
91 | \App\Widgets\DashboardMap::class,
92 | \App\Widgets\NavigationUserBlock::class
93 | ];
94 |
95 | public function boot()
96 | {
97 | // Регистрация виджетов в реестре
98 | /** @var WidgetsRegistryInterface $widgetsRegistry */
99 | $widgetsRegistry = $this->app[\SleepingOwl\Admin\Contracts\Widgets\WidgetsRegistryInterface::class];
100 |
101 | foreach ($this->widgets as $widget) {
102 | $widgetsRegistry->registerWidget($widget);
103 | }
104 | }
105 | }
106 |
107 | ```
108 |
109 | **При вставки виджетов в блоки `@yield` необходимо помнить, что ваш HTML должен содержать директиву `@parent` https://laravel.com/docs/blade#extending-a-layout**
110 |
111 |
112 | ## Список блоков:
113 | - `\AdminTemplate::getViewPath('_layout.inner')` Основной шаблон
114 | - `content.top`
115 | - `content.bottom`
116 | - `\AdminTemplate::getViewPath('_partials.navigation')` Боковое меню
117 | - `sidebar.top`
118 | - `sidebar.ul.top`
119 | - `sidebar.ul.bottom`
120 | - `sidebar.botto`
121 | - `\AdminTemplate::getViewPath('_partials.header')` Верхнее меню
122 | - `navbar`
123 | - `navbar.left`
124 | - `navbar.right`
125 |
126 | - `\AdminTemplate::getViewPath('dashboard')` Дашборд
127 | - `block.top`
128 | - `block.top.column.left`
129 | - `block.top.column.right`
130 | - `block.content`
131 | - `block.content.column.left`
132 | - `block.content.column.right`
133 | - `block.footer`
--------------------------------------------------------------------------------