├── .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` --------------------------------------------------------------------------------