diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..6c3cc2e3 --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +
Параметр | Описание |
---|---|
Совместимость событий администратора | Включает события onAdminSave и onAdminSaveAfter для плагинов. Включено по умолчанию. |
Дополнительные сведения см. в разделе Объекты Flex.
Параметр | Описание |
---|---|
Включить кэширование индекса | Кэширование индекса ускоряет поиск за счёт создания временных индексов поиска для запросов. |
Срок службы кэша индекса (в секундах) | Время жизни для кэширования индекса в секундах. |
Включить кэширование объектов | Кэширование объектов ускоряет загрузку данных и изображений объекта.. |
Срок службы кэша объектов (в секундах) | Время жизни для кеширования объектов в секундах. |
Включить кэширование рендеринга | Кэширование рендеринга ускоряет отрисовку контента за счёт кэширования результирующего HTML. |
Время жизни кэша рендеринга (в секундах) | Срок службы кэширования рендеринга в секундах. |
Если визуализируемый HTML-код содержит динамическое содержимое, кэш рендеринга можно отключить из шаблона Twig с помощью {% do block.disableCache() %}
.
Группы пользователей определяют общие роли для пользователей. Это предпочтительный способ установить разрешения для пользователей, поскольку управлять ролями проще, чем изменять правила индивидуально для каждой учётной записи.
После создания группы пользователей вы можете назначить её учётным записям пользователей на вкладке «Доступ».
Параметр | Описание |
---|---|
Имя группы | Название группы — это идентификатор группы. Его нельзя изменить после создания группы. |
Отображаемое имя | Отображаемое имя — это видимое имя группы. |
Описание | |
Иконка | |
Enabled | Если установлено значение Да, группа была включена на вашем сайте. Если Нет, разрешения, установленные группой, не применяются. |
Разрешения | Список всех разрешений на вашем сайте. См. ниже. |
Администраторам особенно полезна область разрешений. Здесь вы можете точно настроить, какой доступ получит конкретный пользователь, и что он сможет делать внутри админки.
Вот краткое описание параметров разрешений и того, что они позволяют кому-либо делать.
Параметр | Значение | Описание |
---|---|---|
Вход на сайт | site.login | Позволяет пользователю авторизоваться на сайте. |
Параметр | Значение | Описание |
---|---|---|
Вход в админку | admin.login | Позволяет пользователю войти в систему с правами администратора. Должно быть установлено на Да, чтобы пользователь мог войти в систему. |
Суперпользователь | admin.super | Назначает пользователя суперадминистратором, что дает ему возможность видеть и настраивать все области сайта.. |
Очистка кэша | admin.cache | Предоставляет пользователю доступ к кнопкам сброса кэша. |
Настройка | admin.configuration | Предоставляет пользователю доступ к области Настройка админки. |
Управление конфигурацией системы | admin.configuration.system | Предоставляет пользователю доступ к вкладке Система в разделе Настройка. |
Управление конфигурацией сайта | admin.configuration.site | Предоставляет пользователю доступ к вкладке Сайт в разделе Настройка. |
Управление конфигурацией мультимедиа | admin.configuration.media | Предоставляет пользователю доступ к вкладке Медиа в разделе Настройка. |
Просмотр информации о сервере | admin.configuration.info | Предоставляет пользователю доступ к вкладке Информация в разделе Настройка. |
Управление страницами | admin.configuration.pages | Предоставляет пользователю доступ к Управлению страницами, находящейся внутри области Страницы. |
Управление аккаунтами | admin.configuration.accounts | Предоставляет пользователю доступ к Управлению аккаунтами, находящейся внутри области Аккаунты. |
Страницы | admin.pages | Предоставляет пользователю полный доступ к области Страницы. |
Обслуживание сайта | admin.maintenance | Предоставляет пользователю полный доступ к области Обслуживание внутри Панели управления. |
Статистика сайта | admin.statistics | Предоставляет пользователю полный доступ к области Статистика внутри Панели управления. |
Управление плагинами | admin.plugins | Предоставляет пользователю полный доступ к области Плагины. |
Управление темами | admin.themes | Предоставляет пользователю полный доступ к области Темы. |
Доступ к сервису | admin.tools | Доступ к инструментам администратора. |
Аккаунты пользователей | admin.accounts | Предоставляет пользователю полный доступ к области Учётные записи. |
Разрешения пользователя и группы для управления информацией, связанной с учётной записью:
Параметр | Значение | Описание |
---|---|---|
Настройка | admin.configuration | Предоставляет пользователю доступ к области Настройка. |
Настройка учётных записей | admin.configuration.accounts | Предоставляет пользователю доступ к области Настройка учётных записей внутри раздела Аккаунты. |
Аккаунты | admin.accounts | Предоставляет пользователю доступ к области Аккаунты. |
Создание | admin.accounts.create | Предоставляет пользователю доступ к Созданию аккаунтов и групп. |
Просмотр | admin.accounts.read | Предоставляет пользователю доступ к Просмотру аккаунтов и групп. |
Обновление | admin.accounts.update | Предоставляет пользователю доступ к Обновлению аккаунтов и групп. |
Удаление | admin.accounts.delete | Предоставляет пользователю доступ к Удаление аккаунтов и групп. |
Список | admin.accounts.list | Предоставляет пользователю доступ к области Аккаунты. |
Возможные значения разрешений:
Параметр | Значение | Описание |
---|---|---|
Разрешено | true | Разрешает действие, если не установлен Запрет. |
Запрещено | false | Запрещает действие. При наличии разрешения и запрета на одно и то же действие в приоритете Запрет. |
Не задано | null | Никакого эффекта, но действует как Запрет, если никакие другие правила не применяются. |
Разрешения, установленные специально для учётной записи пользователя, имеют приоритет над разрешениями группы. Если разрешение не было задано в учётной записи, проверка доступа будет выполнена для всех групп пользователей, к которым принадлежит пользователь. Если какая-либо из групп пользователей отказала в действии, пользователь не имеет разрешения на это действие. В противном случае, если какая-либо из групп пользователей разрешила действие, разрешение будет предоставлено. Если разрешение не было установлено ни в одной из групп пользователей, то разрешение суперпользователь действует как универсальное разрешено, в противном случае будет применено отказано.
Страница профиля в админке позволяет просматривать и обновлять индивидуальные настройки профиля. Здесь задаются ваш аватар, адрес электронной почты, имя, язык и многое другое. Администраторы здесь также могут настроить группы и уровни разрешений для отдельных пользователей.
Доступ к странице профиля очень прост. После того как вы вошли в систему, вы можете получить доступ к своему профилю, выбрав область боковой панели с изображением вашего аватара и именем. Это приведет вас непосредственно к вашему собственному профилю.
Кроме того, администраторы смогут легко перейти на страницу профиля другого пользователя, добавив admin/user/example
к URL-адресу своего сайта. Замените example
именем пользователя, для которого хотите отредактировать информацию профиля и/или разрешения.
В области Профиль администратора можно быстро и стильно взглянуть на свой аватар, имя и титул. Ваш аватар автоматически создается с помощью Gravatar, глобальной службы аватаров, которая позволяет загружать одно изображение профиля и использовать его на нескольких сайтах и сервисах.
Если у вас нет изображения, загруженного в Gravatar, или если вы предпочитаете использовать изображение по вашему выбору, вы можете загрузить изображение здесь, перетащив нужный файл в область для загрузки файлов. Вы также можете щелкнуть эту область, чтобы вызвать средство выбора файла, которое позволит вам найти, выбрать и загрузить файл изображения из вашей системы.
После того, как вы загрузили новое изображение, просто нажмите кнопку Сохранить в правом верхнем углу страницы.
В разделе Учётная запись на странице профиля вы можете обновить свою контактную информацию, имя, язык и т. д. Здесь нельзя изменить свое Имя пользователя, так как оно напрямую связано с тем, где хранится ваша пользовательская информация, но можно изменить другую необходимую информацию.
2-факторная аутентификация обеспечивает дополнительный уровень безопасности для вашего сайта. Узнайте больше об этой функции в разделе Безопасность.
Эта вкладка видна только пользователям, у которых есть разрешения на управление пользователями.
Параметр | Описание |
---|---|
Группы | Список групп пользователей. |
Разрешения | Список всех разрешений на вашем сайте. См. групповые разрешения. |
Страница Настройка дает вам доступ к настройкам конфигурации Система и Сайт вашего сайта. Кроме того, вы можете просмотреть разбивку свойств вашего сервера по ряду областей, включая PHP, SQL, серверную среду и другие различные компоненты, которые определяют работу вашего сайта.
Конфигурация требует уровня доступа access.admin.super
или access.admin.configuration
и access.admin.configuration_site
.
Вкладка Сайт позволяет вам настроить параметры, найденные в файле /user/config/site.yaml
. Эта вкладка дает вам доступ к параметрам и полям, которые определяют связанные с сайтом переменные, такие как имя, автор по умолчанию и метаданные, используемые на вашем сайте.
Ниже приводится разбивка различных разделов конфигурации, которые отображаются на вкладке Сайт.
В этом разделе вы устанавливаете значения по умолчанию для основных параметров сайта.
Параметр | Описание |
---|---|
Заголовок сайта | Заголовок по умолчанию для вашего сайта, часто используемый темами. |
Автор по умолчанию | Имя автора по умолчанию, часто используется в темах или содержимом страницы. |
Имейл по умолчанию | Электронная почта по умолчанию для ссылки в темах или на страницах. |
Типы таксономии | Типы таксономии должны быть определены здесь, если вы хотите использовать их на страницах. |
Тизер - отличный способ сделать небольшой предварительный просмотр содержимого страницы. Вы можете использовать разделитель на странице, чтобы установить точку отсечения между итоговым содержанием и всем основным содержанием страницы. Эти настройки дают вам возможность
Параметр | Описание |
---|---|
Включено | Включить сводку страницы (сводка будет такой же, как и содержимое страницы) |
Размер тизера | Количество символов на странице для использования в качестве сводки содержания. |
Формат | short = использовать первое вхождение разделителя или размера; long = разделитель тизера игнорируется |
Разделитель | Разделитель сводки (по умолчанию '==='). Обычно вы размещаете это после вступительного абзаца, а все, что до него, появляется в сводке страницы. |
Метаданные - важная часть закулисного оформления страницы. Он может улучшить SEO, то, как ваши ссылки будут отображаться в различных поисковых системах и социальных сетях, и многое другое. Здесь вы можете установить различные свойства метаданных.
Параметр | Описание |
---|---|
Метаданные | Значения метаданных по умолчанию, которые будут отображаться на каждой странице, если страница не отменена. |
Перенаправления и маршрутизация никогда не были такими простыми. Просто настройте все это в этом разделе, и все готово.
Параметр | Описание |
---|---|
Пользовательские перенаправления | Пути перенаправления на другие страницы. Допустима стандартная замена Regex. |
Пользовательская маршрутизация | Пути к псевдонимам других страниц. Допустима стандартная замена Regex. |
Страница Настройка дает вам доступ к настройкам конфигурации Система и Сайт вашего сайта. Кроме того, вы можете просмотреть разбивку свойств вашего сервера по ряду областей, включая PHP, серверную среду и другие различные компоненты, которые определяют работу вашего сайта.
Конфигурация требует уровня доступа access.admin.super
или access.admin.configuration
.
Вкладка Система позволяет вам настроить параметры, найденные в файле /user/config/system.yaml
. Эти настройки влияют на то, сколько основных системных функций Grav работает. Здесь можно настроить домашнюю страницу сайта, параметры кэширования и многое другое.
Эти настройки разделены на несколько разделов, каждый из которых посвящен определенному аспекту работы Grav.
Ниже приводится разбивка различных разделов конфигурации, которые появляются на вкладке Система.
В этом разделе вы устанавливаете основные свойства обработки контента для вашего сайта. Здесь задаются домашняя страница, тема по умолчанию и различные другие параметры отображения содержимого.
Параметр | Описание |
---|---|
Главная страница | Выберите страницу, которую хотите сделать главной страницей вашего сайта. |
Тема по умолчанию | Устанавливает основную тему по умолчанию, используемую на вашем сайте. |
Обработка | Управляйте обработкой страниц. Может устанавливаться для каждой страницы, а не глобально. |
Часовой пояс | Заменить часовой пояс сервера по умолчанию. |
Краткий формат даты | Установите краткий формат даты, который может использоваться темами. |
Длинный формат даты | Установите длинный формат даты, который может использоваться темами. |
Порядок по умолчанию | Страницы в списке будут отображаться в этом порядке, если он не переопределен. |
Порядок сортировки по умолчанию | Направление страниц в списке. |
Количество страниц по умолчанию | Максимальное количество страниц по умолчанию в списке. |
Публикация на основе даты | Автоматически (не) публиковать сообщения в зависимости от их даты. |
События | Включение или отключение определённых событий. Отключение их может сломать плагины. |
Перенаправить маршрут по умолчанию | Автоматически перенаправлять на маршрут страницы по умолчанию. |
В этом разделе настраиваются многоязыковые функции.
Параметр | Описание |
---|---|
Поддерживаемые языки | Список двухбуквенных кодов языков, разделенных запятыми (например, 'en, fr, de'). |
Поддержка перевода | Поддержка переводов в Grav, плагинах и темах. |
Резервный перевод | Загрузка других переводов, если строк для активного языка не существует. |
Активный язык в сессии | Хранить активный язык в сеансе пользователя. |
Язык в редиректе на Home | Включать язык в перенаправлении на домашнюю страницу (/en). |
Маршрут в редиректе на Home | Включать маршрут в перенаправлении на домашнюю страницу. |
В этом разделе можно настроить параметры заголовка HTTP. Это полезно для браузерного кэширования и оптимизации.
Параметр | Описание |
---|---|
Срок действия | Устанавливает заголовок истекает. Значение в секундах. |
Дата последнего изменения | Устанавливает последний измененный заголовок, который может помочь оптимизировать кэширование прокси и браузера. |
ETag | Устанавливает заголовок ETag, чтобы помочь определить, когда страница была изменена. |
Vary: Accept Encoding | Устанавливает заголовок Vary: Accept Encoding, чтобы помочь с кэшированием прокси и CDN. |
Упоминание составляет большую часть содержания страниц Grav. В этом разделе вы можете включить опцию Markdown Extra, а также задать, как Grav обрабатывает Markdown.
Параметр | Описание |
---|---|
Markdown Extra | Включить поддержку по умолчанию для Markdown Extra. |
Авто разрывы строк | Включите поддержку автоматического разрыва линии в разметке Markdown. |
Авто URL ссылки | Включить автоматическое преобразование URL-адресов в HTML-гиперссылки. |
Экранирование разметки | Преобразование тегов разметки в HTML-сущности. |
Встроенная функция кэширования Grav помогает сделать его одним из самых быстрых вариантов CMS с плоским файлом. В этом разделе вы можете настроить основные функции кэширования вашего сайта.
Параметр | Описание |
---|---|
Кэширование | Глобальный переключатель ВКЛ/ВЫКЛ для включения/выключения кэширования Grav. |
Метод проверки кэша | Устанавливает метод проверки кэша. Опции: File, Folder и None. |
Драйвер кэширования | Выберите, какой драйвер кэша должен использовать Grav. Auto detect = поиск наилучшего. |
Префикс кэша | Идентификатор части ключа Grav. Не меняйте, если не знаете, что делаете. |
Время жизни | Устанавливает срок службы кэша в секундах. 0 = бесконечно. |
Сжатие Gzip | Включите GZip сжатие Grav страницы для повышения производительности. |
Этот раздел посвящен функции шаблонизации Grav Twig. Здесь вы можете настроить кэширование, отладку и изменение настроек обнаружения Twig.
Параметр | Описание |
---|---|
Кэширование Twig | Управляйте механизмом кэширования Twig. Оставьте это включенным для лучшей производительности. |
Отладка Twig | Позволяет не загружать расширение отладчика Twig. |
Обнаружение изменений | Позволяет автоматически компилировать кэш Twig при обнаружении изменений в шаблонах. |
Экранирование переменных | Автоэскейпы всех переменных. Может сломать ваш сайт. |
В этом разделе рассматривается обработка ресурсов, включая ресурсы CSS и JavaScript.
Параметр | Описание |
---|---|
Объединять CSS | Конвейер CSS - это объединение нескольких ресурсов CSS в один файл. |
Минимизировать CSS | Сокращать CSS во время конвейерной обработки. |
Минимизировать CSS (переопределение для Windows) | Минимизировать переопределение для платформ Windows. По умолчанию false из-за ThreadStackSize. |
Переписать CSS | Переписывать любые относительные URL-адреса CSS во время конвейерной обработки. |
Объединять JavaScript | Конвейер JS - это объединение нескольких ресурсов JS в один файл. |
Минимизировать JavaScript | Сокращать JS во время конвейерной обработки. |
Включить временные метки активов | Включить метки времени активов. |
Коллекции | Добавьте отдельные коллекции активов. |
Здесь вы можете настроить, как Grav будет обрабатывать сообщения об ошибках и отображать их. Это полезный инструмент при разработке сайта.
Параметр | Описание |
---|---|
Выводить ошибки | Показать полную страницу ошибок в стиле обратной трассировки. |
Логи ошибок | Записывать ошибки в папку /logs . |
Как и обработка ошибок, встроенные инструменты отладки Grav дают вам возможность находить и устранять проблемы. Это особенно полезно во время разработки.
Параметр | Описание |
---|---|
Отладчик | Включить отладчик Grav и следующие настройки. |
Отладка Twig | Включить отладку в шаблонах Twig. |
Завершение открытых соединений | Закрывать соединение перед вызовом onShutdown() . false для отладки. |
Этот раздел определяет, как Grav обрабатывает медиаконтент. Здесь настраиваются качество изображения и другие параметры обработки мультимедиа.
Параметр | Описание |
---|---|
Качество изображений по умолчанию | Качество изображения по умолчанию для использования при передискретизации или кэшировании изображений (85%). |
Кэшировать все картинки | Пропускайте все изображения через систему кэширования Grav, даже если они не требуют манипуляций с медиа. |
Отладка водяного знака изображения | Показывать наложение поверх изображений, указывающее глубину пикселя изображения, например, при работе с Retina. |
Включить временные метки на медиа | Добавляет метку времени на основе даты последнего изменения к каждому элементу мультимедиа. |
Кэширование изображений, которые уже были оптимизированы (за пределами Grav), может привести к тому, что выходной файл будет иметь гораздо больший размер файла, чем исходный. Это происходит из-за ошибки в библиотеке изображений Gregwar и не имеет прямого отношения к Grav (дополнительную информацию см. в этом открытом выпуске). Альтернативный вариант - установить для параметра «Кэшировать все изображения» значение Нет
.
В этом разделе вы можете включить поддержку сеанса, установить ограничения времени ожидания и имя файла cookie сеанса, используемого для обработки этой информации.
Параметр | Описание |
---|---|
Инициализировать сессию | Включите поддержку сессий в Grav. |
Время ожидания | Устанавливает тайм-аут сеанса в секундах. |
Имя | Идентификатор, используемый для формирования имени файла cookie сеанса. Используйте только буквы, цифры, дефисы или символ подчеркивания. |
Этот раздел содержит расширенные параметры системы.
Параметр | Описание |
---|---|
Абсолютный путь | Абсолютные или относительные URL-адреса для base_url . |
Разделитель параметров | Разделитель для переданных параметров, которые можно изменить для Apache в Windows. |
Дашборд служит центром информации подключаемого плагина админки. На этой странице вы можете проверять статистику трафика, информацию об обслуживании, обновления Grav, создавать новые резервные копии, видеть последние обновления страниц, а также быстро очищать кэш.
Это отправная точка для вашего административного опыта.
Содержимое дашборда будет меняться в зависимости от разрешений пользователя. Например, предоставление доступа access.admin.super
разблокирует все. Если этот уровень доступа не предоставлен, access.admin.main maintenance
разрешает очистку и обновление кэша, access.admin.pages
разрешает доступ к страницам, access.admin.statistics
позволяет отображать статистику посетителей сайта.
В верхней части панели инструментов вы найдете две кнопки. Первая из них инициирует очистку кэша Grav. Нажатие основной кнопки Очистить кэш приведет к очистке всего кэша, включая кэш ресурсов и изображений. Используя раскрывающийся список справа, вы можете выбрать один из конкретных типов процессов очистки кэша.
Например, если вы хотите очистить кэш изображений, не затрагивая другие кэшированные данные, вы можете сделать это здесь.
Вторая кнопка запускает проверку обновлений для вашего сайта. Сюда входят любые поддерживаемые плагины, темы и сама CMS. Если будут обнаружены новые обновления, вы получите уведомление на панели управления. Это не единственный метод Grav для проверки обновлений.
Проверки обновлений также запускаются всякий раз, когда загружается новая страница в админке, и кэшируются в течение одного дня. Если вы очистите кэш Grav и загрузите новую страницу в админке, проверка обновлений будет выполнена автоматически.
Разделы Обслуживание и Статистика предоставляют вам быстрый доступ к важной информации о вашем сайте.
На стороне Техническое обслуживание вы можете увидеть процентный график, позволяющий узнать, сколько бит и частей Grav полностью обновлены.
Если доступны новые обновления, появится кнопка Обновить, которая позволяет выполнить обновление в один клик для всех плагинов и тем. Эта кнопка не обновляет CMS, уведомления об обновлении которой можно найти чуть выше разделов «Обслуживание» и «Статистика».
Вы можете обновить ядро Grav, нажав кнопку Обновить Grav сейчас на панели уведомлений.
Также есть график, показывающий, как долго сайт был без резервного копирования. При нажатии кнопки Создать резервную копию будет создан zip-файл, который вы можете загрузить и сохранить в качестве резервной копии данных вашего сайта.
Резервные копии также хранятся в папке backup/
вашей установки Grav. Вы можете получить их через FTP или инструменты веб-менеджера, предоставленные вашей хостинговой компанией.
В области Статистика отображаются простые и наглядные данные о трафике с разбивкой по количеству посетителей, которые интерфейсная часть сайта получила за последний день, неделю и месяц (30 дней). Статистика за прошедшую неделю отображается в виде гистограммы, разделенной днями недели.
В области Последние обновлённые страницы админки вы можете сразу увидеть последние изменения содержимого, внесенные на страницы вашего сайта Grav. Этот список отсортирован по последнему обновлению и создается каждый раз, когда вы обновляете страницу. Выбор заголовка страницы в этом списке приведет вас прямо к редактору страницы в админке.
Кнопка Управление страницами переводит вас на административную панель Страницы.
Страница профиля в админке позволяет просматривать и обновлять индивидуальные настройки профиля. Здесь устанавливается ваш аватар, адрес электронной почты, имя, язык и другие параметры. Для администраторов здесь также можно настроить группы и уровни разрешений для отдельных пользователей.
Доступ к странице профиля прост. После входа в систему с правами администратора вы можете получить доступ к своему профилю, выбрав область боковой панели с изображением вашего аватара и именем. Вы попадете прямо в свой профиль.
Кроме того, администраторам понравится простота перехода на страницу профиля другого пользователя, добавив к URL-адресу своего сайта admin/user/example
. Замените example именем пользователя, для которого они хотят редактировать информацию профиля и / или разрешения.
В области Профиль администратора можно быстро и стильно взглянуть на свой аватар, имя и титул. Ваш аватар автоматически создается с помощью Gravatar, глобальной службы аватаров, которая позволяет загружать одно изображение профиля и использовать его на нескольких сайтах и сервисах.
Если у вас нет изображения, загруженного в Gravatar, или если вы предпочитаете использовать изображение по вашему выбору, вы можете загрузить изображение сюда, перетащив файл изображения в область Переместите файлы сюда или нажмите на эту область. Вы также можете щелкнуть область, чтобы открыть средство выбора файла, которое позволит вам найти, выбрать и загрузить файл изображения из вашей системы.
После загрузки нового изображения просто нажмите кнопку Сохранить в правом верхнем углу страницы.
В разделе Учетная запись на странице профиля вы можете обновить свою контактную информацию, имя, язык и т. д. Вы не можете редактировать здесь свое имя пользователя, так как оно напрямую связано с тем, где хранится ваша пользовательская информация, но вы можете редактировать все, что вам нужно.
Двухфакторная аутентификация обеспечивает дополнительный уровень безопасности для вашего сайта. Дополнительные сведения об этой функции см. в разделе Безопасность данного руководства.
Администраторы найдут область разрешений особенно полезной. Здесь вы можете точно настроить, что пользователь будет иметь доступ и делать в рамках администратора.
Вот краткое описание параметров разрешений и того, что они позволяют кому-то делать.
Параметр | Описание |
---|---|
admin.super | Назначает пользователя суперадминистратором, предоставляя ему возможность видеть и настраивать все области сайта. |
admin.login | Позволяет пользователю войти в систему администратора. Для входа в систему должен иметь значение Yes. |
admin.cache | Предоставляет пользователю доступ к кнопкам сброса кэша. |
admin.configuration | Предоставляет пользователю доступ к области Конфигурация администратора. Это не включает в себя никаких вкладок или подразделов. |
admin.configuration_system | Предоставляет пользователю доступ к вкладке Система в области Конфигурация администратора. |
admin.configuration_site | Предоставляет пользователю доступ к вкладке Сайт в области Конфигурация администратора. |
admin.configuration_media | Предоставляет пользователю доступ к вкладке Медиа в области Конфигурация администратора. |
admin.configuration_info | Предоставляет пользователю доступ к вкладке Информация в области Конфигурация администратора. |
admin.pages | Предоставляет пользователю доступ к области Страницы администратора. |
admin.maintenance | Дает пользователю возможность получить доступ к области Техническое обслуживание дашборда админки. |
admin.statistics | Дает пользователю возможность получить доступ к области Статистика дашборда админки. |
admin.plugins | Предоставляет пользователю доступ к области Плагины администратора. |
admin.themes | Предоставляет пользователю доступ к области Темы администратора. |
admin.users | Позволяет пользователю получать доступ к профилям других пользователей и редактировать её. Это не включает в себя разрешения. |
site.login | Позволяет пользователю войти в интерфейс. |
Плагин админки имеет несколько обработчиков событий, которые можно использовать во время жизненного цикла Grav. См. общую документацию плагина для использования обработчиков событий в главе Плагины.
Перехватчики событий админки вызываются таким же образом, как и основные перехватчики событий.
Плагин админки запускает различные задачи в зависимости от взаимодействия с пользователем. Задачи могут включать выход из системы, вход в систему, сохранение, 2faverify и т. д. После завершения задачи срабатывает этот обработчик событий.
При создании новой страницы это событие вызывается после первоначальной установки данных заголовка, что позволяет плагинам программно манипулировать блоком метаданных.
Используйте событие onAdminSave()
для управления данными объекта страницы $object
перед их сохранением в файловой системе.
После сохранения страницы в панели админки это событие запускается.
При создании папки через панель это событие срабатывает сразу после создания новой папки и выполнения стандартной очистки кэша.
Срабатывает после удаления страницы или папки. Сразу после этого следует стандартная очистка кэша.
Срабатывает после завершения задачи добавления мультимедиа, но до отображения подтверждающего сообщения.
Срабатывает после завершения задачи удаления мультимедиа, но до отображения подтверждающего сообщения.
На этой странице представлены инструкции по расширению панели админки, а также примеры расширений.
Как и при расширении или изменении обычной темы Grav, вы будете переопределять шаблоны, чтобы изменить структуру и внешний вид подключаемого модуля админки. Это означает, что шаблоны, которые ваш плагин объявляет для использования вместо шаблонов по умолчанию, должны точно отражать структуру темы админки. Например, если мы хотим изменить аватар в левой части навигации, мы должны изменить nav-user-avatar.html.twig
.
В подключаемом модуле админки путь к шаблонам следующий: user/plugins/admin/themes/grav/templates
, в дальнейшем именуемый ADMIN_TEMPLATES. Файл, который мы ищем, это ADMIN_TEMPLATES/partials/nav-user-avatar.html.twig
, который содержит <img src="https://www.gravatar.com/avatar/{{ admin.user.email|md5 }}?s=47" />
.
В вашем плагине путь к шаблонам должен быть: user/plugins/myadminplugin/admin/themes/grav/templates
, в дальнейшем именуемый PLUGIN_TEMPLATES. Соответствующий файл должен быть PLUGIN_TEMPLATES/partials/nav-user-avatar.html.twig
, который будет содержать что-то вроде <img src="{{ myadminplugin_avatar_image_path }}" />
.
Таким образом, мы переопределяем путь к шаблону, но без разрушения. Мы нацелены только на соответствующий шаблон таким образом, чтобы не переопределять ненужные шаблоны и не мешать другим темам администратора регистрировать свои альтернативные шаблоны для того же использования. Для этого прописываем путь в нашем плагине вот так:
<?php
+
+public static function getSubscribedEvents()
+{
+ return [
+ 'onAdminTwigTemplatePaths' => ['onAdminTwigTemplatePaths', 0]
+ ];
+}
+
+public function onAdminTwigTemplatePaths($event)
+{
+ $paths = $event['paths'];
+ $paths[] = __DIR__ . '/admin/themes/grav/templates';
+ $event['paths'] = $paths;
+}
+
Важно помнить, что тема, используемая в плагине админки, чувствительна к доступным шаблонам. Как правило, вам следует изменять шаблоны только со слабым воздействием, то есть вносить изменения, которые не нарушат интерфейс для любого пользователя, устанавливающего ваш плагин. В этом смысле лучше переопределить nav-user-avatar.html.twig
, чем nav.html.twig
, поскольку последний содержит гораздо больше функций, но использует {% include 'partials/nav-user-details.html.twig' %}
, чтобы включить первый.
В файлах шаблонов админки включено автоматическое экранирование. Вам не нужно добавлять фильтр |e
для экранирования HTML-содержимого, но требуется добавлять |raw
при вводе HTML.
Чтобы создать пользовательское поле, мы добавим его в PLUGIN_TEMPLATES/forms/fields/myfield
. В папке myfield нам нужен шаблон Twig, который объявляет, как будет работать поле. Самый простой способ добавить поле — найти аналогичное поле в ADMIN_TEMPLATES/forms/fields
и скопировать его, чтобы увидеть, как они структурированы. Например, чтобы добавить слайдер диапазона HTML, мы создаем PLUGIN_TEMPLATES/forms/fields/range/range.html.twig
. В этом файле мы добавляем:
{% extends "forms/field.html.twig" %}
+
+{% block input_attributes %}
+ type="range"
+ {% if field.validate.min %}min="{{ field.validate.min }}"{% endif %}
+ {% if field.validate.max %}max="{{ field.validate.max }}"{% endif %}
+ {% if field.validate.step %}step="{{ field.validate.step }}"{% endif %}
+ {{ parent() }}
+{% endblock %}
+
Это добавляет тип поля под названием «диапазон» с типом диапазон, который позволяет пользователю выбирать значение, сдвигая кнопку. Чтобы использовать новое поле в чертеже, мы просто добавим его в blueprints.yaml:
form:
+ fields:
+ radius:
+ type: range
+ label: Radius
+ id: radius
+ default: 100
+ validate:
+ min: 0
+ max: 100
+ step: 10
+
Это дает нам ползунок со значением по умолчанию 100, где допустимые значения находятся в диапазоне от 0 до 100, и каждое значение увеличивается на 10, когда мы его перемещаем.
Мы могли бы расширить это, используя доступные блоки prepend
илиappend
, например, добавив визуальный индикатор выбранного значения. Мы изменяем range.html.twig
, чтобы он содержал следующее:
{% extends "forms/field.html.twig" %}
+
+{% block input_attributes %}
+ type="range"
+ style="display: inline-block;vertical-align: middle;"
+ {% if field.id is defined %}
+ oninput="{{ field.id|e }}_output.value = {{ field.id|e }}.value"
+ {% endif %}
+ {% if field.validate.min %}min="{{ field.validate.min }}"{% endif %}
+ {% if field.validate.max %}max="{{ field.validate.max }}"{% endif %}
+ {% if field.validate.step %}step="{{ field.validate.step }}"{% endif %}
+ {{ parent() }}
+{% endblock %}
+{% block append %}
+ {% if field.id is defined %}
+ <output
+ name="{{ (scope ~ field.name)|fieldName }}"
+ id="{{ field.id|e }}_output"
+ style="display: inline-block;vertical-align: baseline;padding: 0 0.5em 5px 0.5em;"
+ >
+ {{ value|join(', ')|e('html_attr') }}
+ </output>
+ {% endif %}
+{% endblock append %}
+
Таким образом, мы добавляем тег <output>
, который будет содержать выбранное значение, и добавляем к нему и самому полю простой стиль для их правильного выравнивания. Мы также добавляем в поле атрибут oninput
, чтобы при изменении значений автоматически обновлялся тег <output>
со значением. Для этого требуется, чтобы каждое поле, использующее ползунок диапазона, имело уникальное свойство id
, например, id: radius
, которое мы объявили выше, которое должно быть чем-то вроде id: myadminplugin_radius
, чтобы избежать конфликтов.
!!Если этот новый шаблон будет доступен для фронтенда и панели админки (например, при использовании папки PLUGIN_TEMPLATES
), вам нужно экранировать все переменные с помощью |e
. В качестве альтернативы вы можете просто перейти к параметру Настройка
> Система
> Шаблонизация Twig
> Экранирование переменных
и включить его.
Как упоминалось в Основах тем, существует прямая связь между страницами в Grav и файлами шаблонов Twig, предоставленными в плагине/теме. Чтобы создать настраиваемый шаблон страницы, вам понадобится файл чертежа для определения полей для плагина админки и файл шаблона для визуализации содержимого.
В корне папки темы или плагина создайте папку с именем templates
. Внутри этой папки создайте новый файл mypage.html.twig
. Это будет шаблон Twig для нового шаблона страницы «mypage».
Пример mypage.html.twig:
{% extends 'partials/base.html.twig' %}
+
+{% block content %}
+ {{ page.header.newTextField }}
+ {{ page.content}}
+{% endblock %}
+
Дополнительную информацию о темах Twig можно найти в разделе Twig Primer.
Темы автоматически находят файлы шаблонов в папке templates
темы. Если шаблон добавляется через плагин, вам нужно добавить шаблон через событиеonTwigTemplatePaths
:
<?php
+
+public function onPluginsInitialized()
+{
+ // If in an Admin page.
+ if ($this->isAdmin()) {
+ return;
+ }
+ // If not in an Admin page.
+ $this->enable([
+ 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 1],
+ ]);
+}
+
+/**
+ * Add templates directory to twig lookup paths.
+ */
+public function onTwigTemplatePaths()
+{
+ $this->grav['twig']->twig_paths[] = __DIR__ . '/templates';
+}
+
Чтобы плагин админки предоставил новую опцию страницы mypage
, создайте папку с именемblueprints
в корне темы/плагина. Внутри этой папки создайте новый файл mypage.yaml
. Здесь вы определите настраиваемые поля для плагина админки, которые будут отображаться при создании новой страницы. Доступные поля формы можно найти в главе Формы.
Пример чертежа mypage.yaml
ниже расширяет шаблон страницы по умолчанию, а затем добавляет header.newTextField
под вкладкой содержимого:
title: My Page Blueprint
+'@extends':
+ type: default
+ context: blueprints://pages
+
+form:
+ fields:
+ tabs:
+ type: tabs
+ active: 1
+ fields:
+ content:
+ type: tab
+ fields:
+ header.newTextField:
+ type: text
+ label: 'New Text Field'
+
Подобно папке templates
, тема автоматически добавит все yaml-файлы чертежей, найденные в папке blueprints
. Если чертеж добавляется через плагин, вам нужно добавить чертеж через событие onGetPageTemplates
:
<?php
+
+public function onPluginsInitialized()
+{
+ // If in an Admin page.
+ if ($this->isAdmin()) {
+ $this->enable([
+ 'onGetPageBlueprints' => ['onGetPageBlueprints', 0],
+ 'onGetPageTemplates' => ['onGetPageTemplates', 0],
+ ]);
+ return;
+ }
+
+/**
+ * Add blueprint directory.
+ */
+public function onGetPageBlueprints(Event $event)
+{
+ $types = $event->types;
+ $types->scanBlueprints('plugin://' . $this->name . '/blueprints');
+}
+
+/**
+ * Add templates directory.
+ */
+public function onGetPageTemplates(Event $event)
+{
+ $types = $event->types;
+ $types->scanTemplates('plugin://' . $this->name . '/templates');
+}
+
После определения файлов чертежей и шаблонов создайте новую страницу в панели админки, нажав Добавить и выбрав «Моя страница»:
В форме редактирования админки теперь отображается новое настраиваемое поле «Новое текстовое поле»:
Этот FAQ предназначен для предоставления полезных руководств, советов и трюков, которые помогут вам получить максимальную отдачу от плагина админки.
Ручная установка не является рекомендуемым методом установки, однако всё ещё можно установить плагин админки вручную. В принципе, вам нужно загрузить каждый из следующих плагинов по отдельности:
Распакуйте каждый архивный файл в папку user/plugins
, затем убедитесь, что папки переименованы только в admin/
, login/
, form/
и email/
. Затем следуйте инструкциям по использованию ниже.
Когда вы впервые устанавливаете плагин админки, вам будет предложено создать пользователя с правами администратора, когда вы укажете свой браузер на своем сайте. Это простая веб-форма, обеспечивающая создание хотя бы одного пользователя-администратора.
Вы можете легко добавить других пользователей, но для этого потребуется немного поработать в терминале/командной строке. В своем терминале войдите в корень сайта Grav, на который вы хотите добавить пользователей, и введите следующую команду:
Это инициирует серию подсказок, которые помогут вам создать нового пользователя. К ним относятся создание имени пользователя, пароля, адреса электронной почты и установка уровня разрешений нового пользователя.
Вам потребуется имя пользователя, содержащее от 3 до 16 символов, которые могут включать строчные буквы, цифры, символы подчеркивания и дефисы. В имени пользователя нельзя использовать прописные буквы, пробелы и специальные символы.
В какой-то момент в процессе создания вам будет предложено выбрать набор разрешений для нового пользователя. На данный момент есть три варианта:
Роль | Описание |
---|---|
Admin | Предоставляет пользователю доступ к серверной части администратора. Эта роль не включает внешний доступ к защищенным страницам. |
Site | Предоставляет пользователю доступ ко всем страницам в интерфейсе. Это эквивалент вошедшего в систему пользователя. |
Admin and Site | Предоставляет пользователю доступ ко всему сайту, как к интерфейсу, так и к серверной части. |
Пользовательские данные хранятся в SITE_ROOT/user/accounts/
, и каждому пользователю предоставляется файл YAML, содержащий информацию для входа в систему и другие данные. Вот пример данных, содержащихся в файле учетной записи пользователя. Например, содержимое SITE_ROOT/user/accounts/tester.yaml
может быть таким:
Имя файла tester.yaml
диктуется именем пользователя tester
email: test@rockettheme.com
+access:
+ admin:
+ login: true
+ super: true
+ site:
+ login: true
+fullname: 'Tester McTesting'
+title: Admin
+hashed_password: $2y$10$5RAUI6ZCISWR.4f0D6FILu3efYq3078ZX/.9vtAnZbjxS/4PXN/WW
+
Вы можете редактировать эту информацию непосредственно в YAML-файле пользователя или выбрав свой аватар пользователя на боковой панели администратора. Это перенесет вас на страницу, где вы можете легко управлять информацией о пользователях.
Фотографии аватаров автоматически генерируются Gravatar, основываясь на адресе электронной почты пользователя.
По соображениям безопасности пароли пользователей хранятся в виде хэша. Если вы хотите изменить свой пароль, мы рекомендуем сделать это из администратора.
Каждый пользовательский файл yaml имеет свойство "доступ". Установив это свойство соответствующим образом, вы можете предоставить конкретному пользователю доступ только к определенной части администратора.
Вот объясненные в настоящее время поддерживаемые уровни доступа:
admin.login
: позволяет пользователю войти в систему с правами администратораadmin.super
: предоставляет пользователю полномочия суперадминистратора, предоставляя доступ ко всему интерфейсу и функциям администратораadmin.pages
: позволяет пользователю просматривать страницы, редактировать их и добавлять новыеadmin.main maintenance
: позволяет пользователю обновлять Grav со стороны администратора, проверять наличие обновлений и очищать кэшadmin.plugins
: позволяет пользователю получить доступ к функциям плагинов, редактировать настройки плагинов, отключать плагины или добавлять новыеadmin.themes
: позволяет пользователю получить доступ к функциям тем, редактировать настройки темы, изменять темы и добавлять новыеadmin.statistics
: позволяет пользователю видеть статистику сайтаadmin.cache
: позволяет пользователю очистить кэшadmin.configuration
: позволяет пользователю получить доступ к конфигурации экземпляра. Разрешение на отдельные части должно быть дано отдельно через переменные, перечисленные ниже. Только включение «вложенных переменных» без включения основной переменной не приведет к включению меню конфигурации для пользователя.admin.configuration_system
: позволяет пользователю изменять системные настройкиadmin.configuration_site
: позволяет пользователю изменять настройки сайтаadmin.configuration_media
: позволяет пользователю редактировать доступные типы мультимедиаadmin.configuration_info
: позволяет пользователю просматривать информацию об этом экземпляреadmin.tools
admin.settings
admin.users
Cизменения, внесенные в файл user.yaml, пока этот пользователь вошел в систему, вступят в силу только после того, как он выйдет из системы и снова войдет в систему.
Один из способов защитить вашу админ-панель - скрыть её местоположение. Для этого нужно изменить URL-адрес с
к чему-то более неоднозначному, о чем будет труднее угадать. Для этого вам нужно найти admin.yaml
, который находится в папке user/plugins/admin/
, и скопировать его в user/config/plugins/admin.yaml
.
Затем измените строку route: /admin
на что-нибудь более двусмысленное, например, route: /myspecialplace
, таким образом, если вам нужно получить доступ к панели администратора вашего сайта, вы введете
В случае, если ваш сервер теряет соединение с Интернетом, Grav Admin автоматически переходит в автономный режим. Этот режим обозначается уведомлением под нижним минимумом в верхнем левом углу окна администратора.
В автономном режиме администратор не будет пытаться получать обновления для CMS, плагинов или тем. Это предотвращает зависание и другие проблемы, которые в противном случае могли бы возникнуть из-за невозможности доступа к серверам обновлений.
После восстановления подключения к Интернету уведомление исчезнет, и автономный режим автоматически отключится.
Плагин административной панели для Grav представляет собой веб-интерфейс (графический пользовательский интерфейс), который обеспечивает удобный способ настройки Grav и легкого создания и изменения страниц. Это останется полностью необязательным плагином, который никоим образом не требуется и не нужен для эффективного использования Grav. Фактически, интерфейс админки предоставляет намеренно ограниченный вид, чтобы он оставался простым в использовании и не перегружал. Опытные пользователи по-прежнему предпочтут работать напрямую с файлами конфигурации.
Панель администратора - это довольно амбициозный плагин с множеством функций, который даст вам большую мощность и гибкость при создании ваших сайтов Grav. Поэтому, если у вас есть какие-либо вопросы, проблемы, предложения или вы обнаружите в нем одну из этих редких ошибок, воспользуйтесь одним из следующих способов получить от нас поддержку.
Для живого чата используйте Discord Chat Server для обсуждений, связанных с плагином админки.
Для ошибок, функций, улучшений создайте issue в репозитории GitHub.
Сначала убедитесь, что у вас установлена последняя версия Grav {{grav_version}} или более поздняя. Это необходимо для правильной работы плагина админки. Проверьте наличие новых версий Grav и обновитесь до них (-f
принудительно обновляет индекс GPM):
плагину админки на самом деле требуется помощь 3 других плагинов, поэтому для того, чтобы плагин Admin работал, вам сначала нужно установить плагины login, forms и email. Они доступны через GPM, и поскольку у плагина есть зависимости, вам просто нужно продолжить и установить плагин админки и согласиться, когда будет предложено установить другие:
Вы также можете установить плагин вручную, если не можете использовать GPM в своей системе.
В последней версии админки вам будет предложено создать учетную запись администратора, когда вы укажете в браузере свой сайт. Вы должны выполнить этот шаг, чтобы сразу убедиться, что действующий пользователь-администратор находится под вашим контролем.
Просто заполните форму и нажмите кнопку Создать пользователя
.
Информация о пользователе хранится в папке user/accounts/
вашей установки Grav. Вы можете редактировать значения вручную или через сам плагин админки. Вы также можете создавать новых пользователей вручную или с помощью CLI-команды bin/plugin login newuser
. Более подробная информация содержится в FAQ для администраторов.
Шаблоны регулярных выражений для имен пользователей и паролей определены в system/config/system.yaml
.
Шаблон по умолчанию для пользователей (system.username_regex
) состоит только из символов нижнего регистра, цифр, дефисов и подчеркиваний. Имена пользователей должны содержать от 3 до 16 символов.
Шаблон по умолчанию для паролей (system.pwd_regex
) состоит как минимум из восьми (8) символов, включая как минимум одну цифру, одну заглавную и одну строчную букву.
По умолчанию вы можете получить доступ к администратору, указав в своем браузере на http://yoursite.com/admin
. Вы можете просто войти в систему, используя имя_пользователя
и пароль
, заданные в YAML-файле, который вы настроили ранее.
После входа в систему ваш открытый текстовый пароль будет удален и заменен зашифрованным.
Редактор страниц в админке — мощный текстовый редактор и менеджер страниц, который позволяет вам создавать контент вашей страницы (включая медиафайлы), его параметры публикации и таксономии, настройки, переопределения и параметры для конкретной темы.
По сути, это универсальный инструмент для управления определенной страницей.
На этой странице мы рассмотрим функции и возможности вкладки Дополнительно в Редакторе страницы.
Для доступа к функциям страницы требуется уровень доступа access.admin.super
или access.admin.pages.list
. См. Учётные записи и Группы пользователей
Вы можете заметить флажки слева от некоторых параметров в этой области администратора. Эти поля указывают на то, что вы хотите изменить значения по умолчанию для этой страницы. Если их не отмечать, возвращается к пустому состоянию или состоянию по умолчанию.
В области Настройки рассматриваются различные важные параметры вашей страницы. Здесь вы можете изменить имя папки, в которой хранится страница, её родительский элемент и шаблон, используемый при отображении страницы.
Параметр | Описание |
---|---|
Числовой префикс | Числовой префикс, который обеспечивает настраиваемый порядок страниц и подразумевает видимость. |
Имя папки | Задает имя папки, в которой содержится страница. |
Родитель | Устанавливает родителя текущей страницы. Это может быть - Корневая - для страниц верхнего уровня или определённые страницы, чтобы они отображались как подстраницы. |
Шаблон страницы | Устанавливает шаблон (предоставленный темой) для применения к странице. Это напрямую влияет на внешний вид страницы. |
Класс страницы | Классы, введенные в это поле, применяются к основной части страницы. |
Раздел Порядок дает вам возможность настроить порядок страниц ненумерованных папок.
Параметр | Описание |
---|---|
Сортируемые страницы | Позволяет настроить порядок страницы. |
Переопределения - это те параметры, которые наделяют вашу страницу дополнительной функциональностью, устанавливают для её заголовка значение, отличное от значения по умолчанию, на основе имени папки, настроек кэширования, видимости навигации и делают страницу недоступной по прямому URL-адресу.
Вы также можете использовать эту область для включения и выключения различных процессов для страницы, таких как Twig, который позволяет вам вставлять Twig в содержимое вашей страницы и выполнять его рендеринг.
Параметр | Описание |
---|---|
Меню | Строка, которая будет использоваться в меню. Если не установлен, будет использоваться Заголовок. |
Псевдоним | Позволяет вам специально установить часть URL-адреса страницы. |
Обработка | Процессы, которые вы хотели бы запустить и сделать доступными в содержимом страницы. |
Шаблон отображения | Устанавливает тип страницы по умолчанию для дочерних страниц. |
Маршрутизируемая | Устанавливает, доступна ли эта страница по URL-адресу. Если этот параметр отключен, страница не будет доступна для внешнего интерфейса. |
Кэширование | Включает или отключает кэширование для страницы. |
Видимая | Определяет, отображается ли страница в навигации. |
Параметр | Описание |
---|---|
Маршрут по умолчанию | Введите новый маршрут по умолчанию. |
Канонический маршрут | Введите новое значение, которое будет использоваться для канонической маршрутизации. |
севдонимы маршрута | Создайте псевдонимы маршрута. |
Параметр | Описание |
---|---|
Порядок отображения дочерних страниц | Установите порядок отображения дочерних элементов. Вы можете выбрать имя папки или определение коллекции. |
Параметр | Описание |
---|---|
Admin event compatibility | Включает события onAdminSave и onAdminSaveAfter для плагинов. Включено по умолчанию. |
Для получения дополнительной информации см. Объекты Flex.
Параметр | Описание |
---|---|
Включить кэширование индекса | Кэширование индекса ускоряет поиск за счёт создания временных индексов поиска для запросов. |
Время жизни кэша индекса (в секундах) | Время жизни для кэширования индекса в секундах. |
Включить кэширование объектов | Кэширование объектов ускоряет загрузку данных и изображений объекта.. |
Время жизни кэша объектов (в секундах) | Время жизни для кеширования объектов в секундах. |
Включить кэширование рендеринга | Кэширование рендеринга ускоряет отрисовку контента за счёт кэширования результирующего HTML. |
Время жизни кэша рендеринга (в секундах) | Срок службы кэширования рендеринга в секундах. |
Если визуализируемый HTML-код содержит динамическое содержимое, кэш рендеринга можно отключить из шаблона Twig с помощью {% do block.disableCache() %}
.
Редактор страницы в админке — это мощный текстовый редактор и менеджер страниц, который позволяет вам создавать контент вашей страницы (включая медиафайлы), его параметры публикации и таксономии, настройки, переопределения и параметры для конкретной темы.
По сути, это универсальный инструмент для управления определенной страницей.
Для доступа к функциям страниц требуется уровень доступа access.admin.super
или access.admin.pages.list
. См Учётные записи и Группы пользователей
Вкладки, которые появляются в Редакторе страниц, не универсальны. Существует стандартный набор полей форм, которые обычно встречаются в темах Grav, однако они могут различаться в зависимости от темы. Администратор извлекает информацию о поле формы из ряда источников, включая тему и шаблон, используемые для конкретной страницы.
Вкладки и параметры, представленные в этой документации, используются по умолчанию. Разработчики тем имеют возможность добавлять свои собственные параметры на эти вкладки или даже отказаться от этих вкладок и заменить их чем-то совершенно другим. Мы документируем распространенный сценарий, основанный на теме Antimatter, чтобы служить в качестве примера.
На этой странице мы рассмотрим функции и возможности вкладки Содержание в Редакторе страницы.
Вверху страницы вы найдете административные элементы управления, которые позволяют сохранять, удалять, копировать и перемещать вашу страницу. Кроме того, вы можете нажать кнопку Назад, чтобы вернуться в основную область Страницы админки.
Кнопки Сохранить и Удалить говорят сами за себя. Они соответственно сохраняют и удаляют текущую страницу.
При нажатии кнопки Переместить открывается всплывающее окно, в котором вы можете назначить странице нового родителя. У вас есть такая же опция на вкладке Дополнительно.
Копировать создает дубликат вашей текущей страницы, добавляя «-2» (или другой числовой префикс, если «-2» уже используется) в конце имени папки. Вы можете изменить имя и заголовок папки по своему усмотрению.
Заголовок страницы обычно задается во время создания этой страницы, однако вы можете редактировать его постфактум здесь. Обратите внимание, что изменение заголовка страницы здесь не окажет прямого влияния на имя папки (которое используется для целей навигации), но изменит то, что люди видят во внешнем интерфейсе.
Это сердце редактора страниц. Здесь пишется и редактируется тело содержимого вашей страницы. В нем есть множество мощных инструментов, которые обычно можно найти только в текстовых редакторах премиум-класса на базе браузера.
Например, вы можете переключаться между режимами редактирования и предварительного просмотра с помощью кнопок и , расположенных в верхнем правая область редактора.
Поскольку контент Grav в основном основан на Markdown, ярлыки редактирования автоматически добавляют теги Markdown к вашему контенту. Например, выделение блока текста и выбор значка B окружают выделенную область полужирными тегами (выделенная область).
Вот список инструментов редактора контента:
Инструмент | Описание |
---|---|
Добавляет жирный текст. | |
Добавляет курсив. | |
Добавляет ~~зачёркивание~~. | |
Добавляет ссылки. | |
Добавляет медиа. | |
Добавляет цитаты. | |
Создает неупорядоченный список. | |
Создает упорядоченный список. | |
Активирует правку кода. | |
Активирует предварительный просмотр кода. | |
Переключает между полноэкранным редактированием и предварительным просмотром. |
Секция Вложения в нижней части вкладки Содержание посвящена медиафайлам вашей страницы. Эти файлы находятся в той же папке, что и файл страницы. Загрузить новые медиафайлы так же просто, как перетащить файл или коснуться белой области секции. Это вызовет селектор файлов, который позволит вам выбрать файлы для загрузки.
У вас уже есть медиафайлы, которые вы хотите вставить на свою страницу? Просто наведите курсор мыши на миниатюру изображения и перетащите изображение в редактор.
Вы также можете выбрать Вставить на миниатюре изображения. Это вставит медиа прямо в контент вашей страницы.
Вы также можете удалить медиафайлы, выбрав Удалить.
Раздел Страницы предоставляет вам быстрый редакторский доступ к содержанию вашего сайта. Здесь можно получить доступ к редактору страницы, удалить страницы, создать новые страницы и сразу узнать, отображается ли страница.
Для доступа к функциям страниц требуется уровень доступа access.admin.super
или access.admin.pages.list
. См. Учётные записи и Группы пользователей
Если вы часто создаете или изменяете контент на своем сайте, эта область админки станет вам хорошо знакома.
Три кнопки расположены в верхней части административной панели Управление страницами. Кнопка Назад возвращает вас на главную страницу админки, а кнопки Добавить страницу и Добавить модульный блок инициируют создание новых страниц для вашего сайта.
Ниже мы рассмотрим параметры, доступные при нажатии этих кнопок.
Кнопка Добавить страницу создает немодульную страницу для вашего сайта. После выбора появится всплывающее окно, позволяющее ввести Заголовок и Имя папки, назначить Родительскую страницу и Шаблон отображения, а также указать, должна ли страница быть видимой или скрытой.
Параметр | Описание |
---|---|
Заголовок страницы | Здесь вы вводите заголовок создаваемой страницы. |
Имя папки | Вы можете установить собственное имя папки для страницы или оставить автоматически созданное имя на основе заголовка. |
Родительская страница | Это устанавливает родительскую страницу для новой страницы. Может быть дочерним элементом другой страницы (например, домашней страницы или блога) или быть в корне вашего сайта. Установив значение опции child_type в начале родительской страницы, автоматически будет установлен Шаблон отображения по умолчанию. selected. |
Шаблон страницы | Вы можете выбрать, какой шаблон из темы вы хотите применить к странице. |
Видимая | Устанавливает, хотите ли вы, чтобы страница была видна в навигации. Можно установить на Авто, чтобы это определялось за вас. При автоматической настройке, если есть другая страница-брат, использующая числовой префикс, она использует его и поэтому видна. В противном случае он его не отображает. |
После того, как вы заполнили эту информацию, выбрав Продолжить, вы перейдете в редактор новой страницы. Мы рассмотрим Редактор страниц более подробно в следующем руководстве.
Отображение страницы в этих настройках влияет только на навигацию. Возможность посещения страницы браузером определяется настройками публикации.
Вторая кнопка в верхней части области Страницы позволяет добавить модульную подстраницу на ваш сайт. Модульные страницы отличаются от обычных страниц, потому что на самом деле они представляют собой набор страниц, упорядоченных и отображаемых как одна страница. Эта кнопка специально позволяет создавать подстраницы и назначать их родительской модульной странице.
Вот разбивка полей и параметров, которые появляются во всплывающем окне кнопки Добавить модульный блок.
Параметр | Описание |
---|---|
Заголовок страницы | Устанавливает заголовок для модульной страницы. |
Имя папки | Вы можете установить собственное имя папки для страницы или оставить автоматически созданное имя на основе заголовка. |
Страница | Устанавливает родительскую страницу для новой модульной подстраницы. Это страница, на которой будет отображаться содержимое вашей новой модульной страницы. |
Модульный шаблон | Отображает список шаблонов, предоставленных темой для модульных страниц, из которых вы можете выбрать для новой страницы. |
После того, как вы заполнили эту информацию, выбрав Продолжить, вы перейдете в редактор новой страницы. Мы рассмотрим редактор страниц более подробно в следующем руководстве.
Список страниц, который отображается в этой области, дает вам быстрый доступ ко всем вашим текущим страницам, а также быстрый способ узнать, видны ли страницы или нет.
Выбор заголовка любой страницы приведет вас прямо к редактору этой страницы. Большой значок X справа от каждой страницы позволяет удалить страницу.
Если вы наведете курсор на значок слева от страницы, он сообщит вам её текущий статус. Например, он может сказать Страница • Маршрутизируемая • Видимая, если страница является маршрутизируемой (видимой через URL-адрес) и видимой (отображается в меню навигации).
Вы можете фильтровать и искать свои страницы, чтобы упростить поиск именно той страницы, которую вы ищете. Например, используя параметр Добавить фильтры, вы можете фильтровать страницы по типу, чтобы в списке отображались только модульные, видимые и/или маршрутизируемые страницы.
Если у вас есть определённый заголовок страницы (или часть заголовка), вы можете использовать панель поиска, чтобы быстро найти конкретную страницу, которую вы ищете.
Редактор страницы в админке — это мощный текстовый редактор и менеджер страниц, который позволяет вам создавать контент вашей страницы (включая медиафайлы), его параметры публикации и таксономии, настройки, переопределения и параметры для конкретной темы.
По сути, это универсальный инструмент для управления определенной страницей.
На этой странице мы рассмотрим функции и возможности вкладки Опции в Редакторе страницы.
Для доступа к функциям страницы требуется уровень доступа access.admin.super
или access.admin.pages.list
. См. Учётные записи и Группы пользователей
Вы можете заметить флажки слева от некоторых параметров в этой области администратора. Эти поля указывают на то, что вы хотите изменить значения по умолчанию для этой страницы. Если их не отмечать, возвращается к пустому состоянию или состоянию по умолчанию.
Этот раздел посвящен управлению тем, как публикуется ваш контент. Вы можете публиковать (или отменять публикацию) контента, устанавливать даты публикации, а также даты и время отмены публикации и создавать значения метаданных, специфичные для страницы.
Параметр | Описание |
---|---|
Опубликовано | По умолчанию страница публикуется, если вы явно не указали Publish: false или через publish_date в будущем или unpublish_date в прошлом. |
Дата | Переменная даты позволяет вам специально установить дату, связанную с этой страницей. |
Дата публикации | Это официальная дата публикации страницы. Он может предоставить дату для автоматического запуска публикации. |
Дата снятия с публикации | Это дата/время, которые вы хотите отметить, чтобы страница автоматически запускала отмену публикации. |
Метаданные | Значения метаданных по умолчанию, которые будут отображаться на каждой странице, если страница не отменена. |
В области «Таксономии» вы можете настроить организационные свойства своей страницы. Здесь можно настроить категории, в которых будет отображаться страница, её теги и многое другое.
Параметр | Описание |
---|---|
Category | Это поле позволяет вам установить одну или несколько категорий для страницы. Это полезно при сортировке и фильтрации контента. |
Tag | Теги — отличный способ дать представление о том, о чем ваша страница. Это полезно для сайтов, ориентированных на контент, в качестве механизма организации и фильтрации. |
Month |
Наличие хорошей и чистой карты сайта важно по нескольким причинам. Среди них - пользовательская навигация и поисковая оптимизация (SEO). Наличие карты сайта делает ваш сайт более удобным для поисковых систем, что может иметь прямое влияние на рейтинг.
Эта область страницы параметров доступна, только если вы установили плагин Sitemap.
Параметр | Описание |
---|---|
Частота обновления карты сайта | В этом раскрывающемся списке можно установить частоту обновления карты сайта страницы. Это может время, когда вносятся изменения: ежечасно, ежедневно, еженедельно, ежемесячно, ежегодно или никогда. По умолчанию используются глобальные параметры карты сайта. |
Приоритет карты сайта | Устанавливает приоритет этой страницы в вашей карте сайта. |
Разрешения пользователя/группы для страниц:
Параметр | Значение | Описание |
---|---|---|
Настройка | admin.configuration | Предоставляет пользователю доступ к области Настройка. |
Настройка страниц | admin.configuration.pages | Предоставляет пользователю доступ к области Настройка страниц внутри раздела Страницы. |
Страницы | admin.pages | Предоставляет пользователю доступ к области Страницы. |
Создание | admin.pages.create | Предоставляет пользователю доступ к Созданию страниц. |
Просмотр | admin.pages.read | Предоставляет пользователю доступ к Просмотру страниц. |
Обновление | admin.pages.update | Предоставляет пользователю доступ к Обновлению страниц. |
Удаление | admin.pages.delete | Предоставляет пользователю доступ к Удаление страниц. |
Список | admin.pages.list | Предоставляет пользователю доступ к области Страницы. |
Все действия в Grav проверяются только на соответствие одному типу разрешения. Если вы запрещаете пользователю создавать списки или читать страницы в админке, но при этом разрешаете ему создавать, обновлять и удалять страницы, он сможет выполнять эти действия. Это означает, что даже если пользователи не видят Страницы
в админке, они могут посетить страницу редактирования напрямую и выполнить эти действия оттуда.
Начиная с Grav 1.7, вы можете и должны ограничивать CRUD доступ для отдельных страниц и их дочерних элементов непосредственно с самих страниц.
Возможные значения разрешений:
Параметр | Значение | Описание |
---|---|---|
Разрешено | true | Разрешает действие, если не установлен Запрет. |
Запрещено | false | Запрещает действие. При наличии разрешения и запрета на одно и то же действие в приоритете Запрет. |
Не задано | null | Никакого эффекта, но действует как Запрет, если никакие другие правила не применяются. |
Разрешения, установленные специально для учётной записи пользователя, имеют приоритет над разрешениями группы. Если разрешение не было задано в учётной записи, проверка доступа будет выполнена для всех групп пользователей, к которым принадлежит пользователь. Если какая-либо из групп пользователей отказала в действии, пользователь не имеет разрешения на это действие. В противном случае, если какая-либо из групп пользователей разрешила действие, разрешение будет предоставлено. Если разрешение не было установлено ни в одной из групп пользователей, то разрешение суперпользователь действует как универсальное разрешено, в противном случае будет применено отказано.
Полномочия, установленные для учетных записей пользователей и групп пользователей, действуют как разрешения по умолчанию для управления страницами. Все эти правила можно переопределить на любой странице вкладки Безопасность.
Рабочий процесс проверки авторизации CRUD для отдельной страницы следующий:
Создание
, Просмотр
, Обновление
, Удаление
или Список
группы страницы
, начиная с текущейauthors
, если пользователь указан в авторах страницы
defaults
, если пользователь авторизованЗапрещено
: немедленно останавливаемся и возвращаем false
Разрешено
: задаем флаг allow = true
true
: возвращаем true
Запрещено
: возвращаем false
Разрешено
: возвращаем true
Inherit Permissions
= Yes
, делаем те же проверки для родительской страницыnull
Корневая страница — специальная страница в Grav 1.7+, которая позволяет администраторам сайта устанавливать разрешения по умолчанию для всех страниц. Его может увидеть только Суперпользователь или пользователь с правами Настройка страниц.
Корневая страница будет сохранена в файле user/pages/root.md
и не будет содержать никакого контента, так как страница в настоящее время недоступна (это может измениться в будущем).
Этот раздел определяет внешний доступ к странице.
Параметр | Описание |
---|---|
Учитывать разрешения при отображении пункта в меню | Установите значение Yes , если страница должна отображаться в меню, только если пользователь имеет к ним доступ.. |
Доступ | Пользователь со следующими правами доступа может получить доступ к странице. |
Этот раздел определяет административный доступ к странице.
CRUD ACL для конкретной страницы работает только с использованием групп пользователей. Кроме того, в нем есть две специальные группы с именами authors
и defaults
, которые предоставляют особый доступ владельцам страниц и резерв по умолчанию для всех вошедших в систему пользователей.
Параметр | Описание |
---|---|
Наследовать разрешения | Наследовать ACL от родительской страницы. |
Авторы | Члены указанной группы имеют доступ к этой странице на уровне владельца, определённый в специальной группе «Авторы». |
Группы | Члены указанных групп имеют особый доступ к этой странице. |
Для получения дополнительной информации о том, как работают разрешения CRUD, см. раздел Разрешения страницы.
В области Плагины можно управлять своими плагинами, добавлять новые, удалять существующие и быстро получать доступ к ссылкам на документацию и другую информацию.
На этой странице мы подробно рассмотрим эту область администратора, в том числе как активировать и деактивировать установленные плагины и с легкостью добавлять новые.
Для доступа к функциям плагинов требуется уровень доступа access.admin.super
или access.admin.plugins
.
Область Управление в верхней части страницы дает вам возможность добавлять новые плагины, а также проверять наличие обновлений для существующих.
Кнопка Добавить переводит вас на страницу со списком всех доступных в настоящее время подключаемых модулей Grav, позволяя просмотреть информацию о них и установить их, выбрав кнопку «Установить» справа от нужного плагина.
Значок указывает на то, что плагин создан и поддерживается командой Grav. Плагины без этого значка были созданы сторонними разработчиками.
В этой области отображается, какие плагины в настоящее время установлены на вашем сайте. Кроме того, вы можете включать и отключать эти плагины, выбрав значок переключения справа от каждого плагина.
Выбор значка шеврона предоставит вам дополнительную информацию о плагине, включая его автора, домашнюю страницу проекта и средство отслеживания ошибок, а также его лицензию и краткое описание. Вы также можете быстро получить доступ к файлу readme плагина для получения дополнительной информации и руководства по использованию.
При нажатии на названии плагина можно перейти на страницу настроек конкретного плагина.
Плагин админки имеет набор собственных опций, доступных в разделе Плагины. Чтобы познакомиться с ними, просто перейдите в Плагины > Admin Panel и нажмите на заголовок плагина. Откроется страница с полезными параметрами, которые помогут вам настроить работу админки.
В верхней части страницы параметров представлена некоторая информация о плагине Admin Panel. Это включает в себя автора плагина, домашнюю страницу и лицензию, а также другие ссылки и информацию, которая поможет вам найти дополнительную информацию и сообщить о любых ошибках.
Это довольно стандартная функция на странице настроек любого плагина.
Раздел Основы на этой странице дает вам набор опций, которые помогут вам определить свой опыт работы с админкой. Это включает в себя возможность изменить текст, отображаемый в верхней части боковой панели, создать собственный путь к админке и многое другое.
Мы разбили эти варианты и их функции ниже.
Параметр | Описание |
---|---|
Включить кэширование админки | Здесь можно включить или отключить кэширование самой админки, не влияющее на кэш CMS. |
Administrator Path | Здесь производится изменение пути к админке. Путь по умолчанию - /admin , но вы можете указать в этом поле всё, что захотите. |
Logo Text | Здесь вы определяете текст, который отображается в верхней части боковой панели админки. |
Body Classes | Хотите по-другому взглянуть на админку? Здесь вы можете добавить классы для тега body. Используйте пробел для разделения. |
Sidebar Activation | Выберите методы ** Tab ** или ** Hover ** для раскрытия боковой панели. |
Hover Delay | Установите время задержки, необходимое для наведения курсора на сжатую боковую панель для расширения в режиме Hover. |
Sidebar Size | В качестве размера боковой панели по умолчанию выберите Автоматический или Маленький. |
Edit Mode | Выберите редактор содержимого по умолчанию. По умолчанию доступны варианты Обычный и Эксперт. |
Use Google Fonts | Использование собственных шрифтов Google. Отключите это, чтобы использовать Helvetica. Полезно при использовании кириллицы и других языков с неподдерживаемыми символами. |
Show GitHub Link | Включить или отключить отображение блока «Нашли ошибку? Пожалуйста, сообщите об этом на GitHub». |
Automatically Check for Updates | Выберите автоматическую проверку обновлений для плагина Admin Panel. |
Session Timeout | Установите здесь тайм-аут сеанса (в секундах). |
В этом разделе страницы вы можете настроить элементы, которые отображаются на дашборде.
Параметр | Описание |
---|---|
Maintenance Widget | Включить или отключить отображение области Техническое обслуживание на дашборде. |
Statistics Widget | Включить или отключить отображение области Статистика на дашборде. |
Notifications Feed Widget | Включить или отключить отображение области Уведомления на дашборде. |
News Feed Widget | Включить или отключить отображение области Лента новостей на дашборде. |
Latest Pages Widget | Включить или отключить отображение области Последние обновлённые страницы на дашборде. |
В этом разделе можно включить или отключить определённые типы уведомлений. Вы можете отключить уведомления об обновлении ленты, а также уведомления о плагинах и/или темах.
Параметр | Описание |
---|---|
Feed Notifications | Включить или отключить уведомления ленты новостей. |
Dashboard Notifications | Включить или отключить уведомления дашборда. |
Plugins Notifications | Включить или отключить уведомления плагинов. |
Themes Notifications | Включить или отключить уведомления тем . |
Одной из замечательных функций админки является его способность отслеживать и отображать информацию о трафике с панели администратора. Этот раздел параметров плагина админки дает вам возможность включить или отключить отслеживание трафика и настроить способ отображения этих данных.
Параметр | Описание |
---|---|
Visitor tracking | Вы можете включить или отключить функцию отслеживания посетителей. |
Days of stats | Это поле позволяет задать количество дней хранения данных о посетителях на графике до их удаления. |
Ignore | Игнорируйте трафик на определённые URL-адреса вашего сайта. Например, /test' или '/modular |
Двухфакторная аутентификация (2FA) - отличная мера безопасности, использующая метод аутентификации в стиле скользящего времени. Этот метод генерирует шестизначные коды, которые вы можете использовать в дополнение к вашему имени пользователя и паролю для доступа к администратору.
Чтобы воспользоваться этой функцией, вам нужно загрузить приложение с поддержкой 2FA, например Authy или Google Authenticator. Это приложение будет действовать как виртуальная связка ключей для кодов аутентификации.
Настроить двухфакторную аутентификацию в Grav очень просто. Всё, что вам нужно сделать, это перейти к Плагины > Admin Panel > Basics в админке.
Здесь вы найдете двухфакторную аутентификацию. Вы можете включить эту функцию, выбрав Да. Это позволит пользователям настроить двухфакторную аутентификацию для своих учетных записей.
Теперь вы можете выбрать изображение своего аватара, чтобы получить доступ к настройкам профиля пользователя. Затем вы захотите установить для параметра 2FA Enabled значение Yes.
QR-код появится вместе с секретным ключом 2FA. Запишите ключ и положите его в безопасное место.
Используя любое приложение для аутентификации, отсканируйте QR-код или введите секретный ключ, чтобы зарегистрировать свой ключ 2FA. Сохраните страницу своего профиля, чтобы заблокировать настройки 2FA.
Теперь рядом с вашим именем на боковой панели появится фиолетовый значок 2FA. Этот значок сообщает, что в аккаунте активна двухфакторная аутентификация.
Теперь вы можете выйти и снова войти в систему. Вы увидите те же поля для имени пользователя и пароля, но как только вы введете эту информацию, вам будет предложено ввести дополнительный шестизначный код. Этот код находится в вашем приложении для аутентификации. Он сбрасывается каждые 30 секунд, поэтому код действует только в течение этого короткого периода. На его замену сгенерируется новый код.
Это оно! Теперь у вас есть более безопасный сайт Grav!
Да, и если вы хотите изменить свой ключ 2FA, всё, что вам нужно сделать, это нажать большую красную кнопку Regenerate.
Не волнуйтесь! Еще не все потеряно.
Ваш статус 2FA и хешированный ключ хранятся в файловой системе вашего сайта в вашем пользовательском YAML-файле. Например, если ваша учетная запись пользователя - admin
, перейдите к ROOT /user/accounts/admin.yaml и найдите эти две строки:
Просто установите для twofa_enabled значение false
и сохраните. Теперь вы должны иметь доступ к своему сайту, используя только свое имя пользователя и пароль. Кроме того, вы можете использовать twofa_secret, чтобы зарегистрировать свою учетную запись в выбранном вами приложении-аутентификаторе.
Если вы считаете, что ваш секретный ключ 2FA может быть скомпрометирован, можно сгенерировать новый ключ и сделать старый недействительным, нажав большую красную кнопку Regenerate в настройках вашего профиля пользователя в админке.
Grav предлагает дополнительную мощную защиту для вашей области администрирования, такую как двухфакторная аутентификация и защита от флуда.
Атаки методом грубой силы — популярный выбор для злоумышленников. Это может происходить в форме того, что кто-то из ваших знакомых пытается угадывать ваш пароль снова и снова, пока наконец не добьется успеха, или бот, наводняющий ваш сайт попытками входа в систему, пока в конечном итоге пароль не будет обнаружен.
Функция защиты Grav от флуда (также известная как ограничение скорости) делает такие атаки исключительно сложными. Это позволяет вам установить количество неудачных попыток входа в систему в течение определенного периода времени, прежде чем учетная запись будет временно заблокирована. Кроме того, вы можете ограничить количество запросов на сброс пароля, применяемых к учетным записям, прежде чем блокировать эту функцию.
Эта функция управляется с помощью плагина Login. Требуются Login версии 2.4 или выше, Grav 1.3.3 или выше и Admin Panel 1.6.0 или выше.
Настройки для защиты от флуда находятся в плагине Login. Просто перейдите по вкладке Admin > Плагины > Login и выберите вкладку Безопасность.
Здесь вы можете установить следующее:
Это позволит вам определить, сколько неудачных попыток сброса пароля или входа в систему разрешены за определенное количество времени до того, как произойдет блокировка. Этот выход является временным и длится до тех пор, пока не будет установлен интервал.
Темы в админке - это то место, куда вы можете перейти, чтобы добавить темы вашего сайта и управлять ими.
На этой странице мы узнаем, как управлять существующими темами и добавлять новые на ваш сайт.
Для доступа к функциям тем требуется уровень доступа access.admin.super
илиaccess.admin.themes
.
В верхней части области Темы админки вы найдете кнопки Назад, Добавить и Проверить наличие обновлений.
Назад просто вернет вас либо на главную страницу админки, либо на главную страницу тем, если вы глубже погрузились в эту область админки.
Проверить наличие обновлений проверяет установленные темы на наличие обновлений.
Добавить вызывает отображение доступных в настоящее время тем Grav, которые вы можете добавить на свой сайт. Это быстрый и простой способ установить новую тему. Просто выберите кнопку Установить.
Вы перейдете на панель Информация новой темы, которая содержит более подробную информацию о теме, а также любые параметры, установленные в файле blueprints. Если вас устраивают любые изменения настроек, просто нажмите кнопку Сохранить, чтобы сохранить изменения.
Вы также можете удалить тему со своего сайта, нажав красную кнопку Удалить тему в правом нижнем углу панели.
В разделе Установленные темы отображаются установленные вами темы. При выборе эскиза темы вы попадете на информационную страницу для этой темы, а серая кнопка Активировать внизу каждой миниатюры дает вам возможность установить эту тему в качестве активной темы по умолчанию для вашего сайта.
Текущая активная тема обозначается значком Активная тема.
Вверху каждого эскиза вы увидите название и номер текущей версии каждой темы. Фиолетовый значок флажка указывает на то, что тема была создана командой Grav. Темы без этого значка создаются и поддерживаются сторонними разработчиками.
Бывают случаи, когда вы можете захотеть загрузить тему или пакет плагина, которого в настоящее время нет в основном каталоге плагинов Grav. Возможно, у вас есть тема премиум-класса, доступная в виде zip-файла, или вы разрабатываете плагин и хотите загрузить последнюю сборку в свою установку Grav для тестирования. В любом случае вы можете сделать это через FTP, но админка предлагает ещё более простое решение.
Используя инструмент Прямая установка, вы можете загрузить заархивированный пакет прямо в вашу установку Grav, и он будет доступен для использования в считанные секунды. Это не ограничивается плагинами и темами. Вы даже можете загрузить Grav таким образом и обновить (или понизить), сделав это. Это особенно полезно для участников Grav, которые хотят легко проверить свою работу.
Как и в случае с любым другим процессом установки, мы рекомендуем создать последнюю резервную копию вашей установки Grav перед использованием этого инструмента - особенно если вы планируете использовать её для изменения всей вашей установки Grav.
Первый доступный метод прямой установки — это загрузка файла. Вы можете загрузить zip-пакет прямо в Grav, используя этот инструмент. Просто нажмите кнопку Обзор... (или перетащите свой zip-пакет на кнопку в некоторых браузерах) и выберите локальный файл пакета. После того, как вы выбрали файл, просто нажмите Загрузить и установить, чтобы установить пакет.
После того, как ваш пакет будет успешно установлен, вы получите уведомление. Вот и всё!
Второй метод предполагает прямую ссылку на файл пакета. Например, если у вас есть пакет, размещенный на удаленном сервере, вы можете ввести URL-адрес этого пакета в поле. Ссылки для загрузки, удобные для GPM, такие как https://getgrav.org/download/themes/bootstrap/1.6.0
, должны работать нормально.
По умолчанию эти загрузки ограничены официальными ссылками на репозиторий GPM. Но вы можете перейти в Настройка > Система и переключить опцию Только официальный GPM на Нет, чтобы разблокировать это поле и включить прямые ссылки на zip-пакеты, которые не являются официальными репозиториями GPM. Например: http://example.com/mypackage.zip
. Это расширенная функция, которую следует использовать только в тех случаях, когда вы правильно проверили пакет как безопасный.
Система резервного копирования в Grav была полностью переписана для Grav 1.6, чтобы обеспечить больше функций и возможностей. Улучшения включают:
number
, space
или time
.Для обратной совместимости конфигурация по умолчанию имитирует систему до Grav 1.6, однако теперь она имеет ограничение в 5 ГБ по умолчанию для резервного пространства. Вы должны скопировать файл конфигурации по умолчанию (system/config/backups.yaml
) в ваш user/config/
Если вы используете плагин админки и сохраните конфигурацию, файл user/config/backups.yaml
будет создан автоматически.
Конфигурация по умолчанию следующая:
purge:
+ trigger: space
+ max_backups_count: 25
+ max_backups_space: 5
+ max_backups_time: 365
+
+profiles:
+ -
+ name: 'Default Site Backup'
+ root: '/'
+ schedule: false
+ schedule_at: '0 3 * * *'
+ exclude_paths: "/backup\r\n/cache\r\n/images\r\n/logs\r\n/tmp"
+ exclude_files: ".DS_Store\r\n.git\r\n.svn\r\n.hg\r\n.idea\r\n.vscode\r\nnode_modules"
+
space
- удалит старые резервные копии, когда вы достигнете предельного места. Контролируется max_backups_space
, измеряется в ГБtime
- удалит старые резервные копии, превышающие количество дней. Контролируется max_backups_time
, измеряемым в днях
.number
- удалит старые резервные копии сверх определенного количества. Контролируется max_backups_count
.Можно настроить массив профилей. Профиль «Резервное копирование сайта по умолчанию» настроен аналогично профилю резервного копирования Grav по умолчанию в предыдущих версиях. По умолчанию резервное копирование не обрабатывается планировщиком автоматически, но вы можете установить schedule: true
и настроить параметр schedule_at:
с предпочтительным выражением cron.
Примером более сложного набора профилей может быть:
profiles:
+ -
+ name: 'Default Site Backup'
+ root: /
+ exclude_paths: "/backup\r\n/cache\r\n/images\r\n/logs\r\n/tmp"
+ exclude_files: ".DS_Store\r\n.git\r\n.svn\r\n.hg\r\n.idea\r\n.vscode\r\nnode_modules"
+ schedule: true
+ schedule_at: '0 4 * * *'
+ -
+ name: 'Pages Backup'
+ root: 'page://'
+ exclude_files: .git
+ schedule: true
+ schedule_at: '* 3 * * *'
+
Более подробно это описано в разделе Cli Console -> Grav Command, но вот пример запуска резервного копирования вручную:
cd ~/workspace/portfolio
+bin/grav backup
+
+Grav Backup
+===========
+
+Choose a backup?
+ [0] Default Site Backup
+ [1] Pages Backup
+
+Archiving 36 files [===================================================] 100% < 1 sec Done...
+
+ [OK] Backup Successfully Created: /users/joe/workspace/portfolio/backup/pages_backup--20190227120510.zip
+
Установив custom_base_url
в system.yaml (или пользовательский базовый URL-адрес в системных настройках, в админке), мы можем держать Grav в папке, но запускать из корня домена.
Grav установлен в http://localhost:8080/grav-develop
, но вы хотите, чтобы он отвечал на http://localhost: 8080
В system.yaml установите
и установите путь сеанса к новому пути к сайту Grav:
И в корне домена установите перенаправление, например с .htaccess:
RewriteEngine On
+RewriteCond %{REQUEST_URI} !^/grav-develop/
+RewriteRule ^(.*)$ /grav-develop/$1
+
где grav-develop
— это подпапка, в которой находится Grav.
Grav установлен в http://localhost:8080/grav-develop
, но вы хотите, чтобы он отвечал на http://localhost:8080/xxxxx
.
В system.yaml установите
и установите путь сеанса к новому пути к сайту Grav:
И в новой корневой папке /xxxxx установите перенаправление, например с .htaccess:
RewriteEngine On
+RewriteCond %{REQUEST_URI} !^/grav-develop/
+RewriteRule ^(.*)$ /grav-develop/$1
+
где grav-develop
— это дочерняя подпапка, в которой находится Grav.
При разработке тем и плагинов часто требуется отображать отладочную информацию. Grav обладает мощными возможностями отладки с помощью множества функций:
Grav поставляется с отличным инструментом, облегчающим эту задачу, который вызывается через панель отладки. Эта функция отключена по умолчанию, но может быть включена либо глобально, либо для вашей среды разработки только через файл конфигурации system.yaml
:
debugger:
+ enabled: true # Включить отладчик Grav и следующие настройки
+ provider: debugbar # Задействовать панель отладки
+ shutdown:
+ close_connection: true # Закрывать соединение перед вызовом onShutdown(). `false` для отладки
+
При первом включении панель отладки может появиться в виде небольшого значка Grav в нижнем левом углу страницы. При нажатии на нее отображается полная панель отладки.
Панель отладки PHP по-прежнему показывает общее время обработки, а также использование памяти, но теперь на ней есть несколько вкладок с более подробной информацией.
Первая вкладка предназначена для сообщений, и вы можете использовать ее, чтобы помочь отладить процесс разработки Grav, разместив на этой вкладке информацию из вашего кода.
Наряду с информацией Запрос, Исключения и Конфигурация, вы также можете увидеть подробную разбивку времени Grav на панели Временная шкала:
Если вы пытаетесь отладить какой-либо PHP, например настраиваемый плагин, который вы разрабатываете, и хотите быстро проверить какой-либо объект или переменную, вы можете использовать мощную команду dump()
. Он принимает практически любую допустимую переменную PHP и выводит результаты в красиво отформатированном и раскрашенном виде в вашем браузере.
Например, вы можете легко выгрузить переменную или объект PHP:
и просмотрите результаты в своем браузере:
Вы также можете выгружать переменные на вкладку Сообщения панели отладки, используя синтаксис:
Вы также можете отображать переменные Twig из ваших шаблонов Twig. Это делается аналогичным образом, но результаты отображаются на панели Сообщения панели отладки. Эта функция отключена по умолчанию, но может быть включена либо глобально, либо для вашей среды разработки только через файл конфигурации system.yaml
:
Например, вы можете легко выгрузить переменную или объект Twig:
и просмотрите результаты на панели отладки:
Можно одновременно выводить несколько команд дампа, но их можно запутать. Добавьте статический текст следующим образом:
Для отображения переменных до того, как страница будет возвращена Grav, или в случае, если обновление страницы не происходит, например, при использовании AJAX, есть другая альтернатива. Используя одну строку Javascript, можно отобразить любую переменную в консоли разработчика вашего браузера, например:
Затем проверьте значение в консоли браузера:
На нашей новой странице отображения ошибок представлена подробная информация, трассировки и даже соответствующие блоки кода. Это помогает быстрее выявлять, выявлять и устранять критические ошибки. По умолчанию в Grav 1.0+ они отключены по умолчанию, поэтому вам нужно включить их, чтобы воспользоваться этой полезной обработкой ошибок для разработки:
Для производственных сред вы можете отключить страницу подробных ошибок с помощью чего-то более тонкого, настроив параметры ошибок в файле user/config/system.yaml
и полагаясь на то, что ошибки регистрируются в файле:
Возможность регистрации информации часто бывает полезной, и, опять же, Grav предоставляет нам простую и мощную функцию регистрации. Используйте один из следующих синтаксисов:
$this->grav['log']->info('My informational message');
+$this->grav['log']->notice('My notice message');
+$this->grav['log']->debug('My debug message');
+$this->grav['log']->warning('My warning message');
+$this->grav['log']->error('My error message');
+$this->grav['log']->critical('My critical message');
+$this->grav['log']->alert('My alert message');
+$this->grav['log']->emergency('Emergency, emergency, there is an emergency here!');
+
Всё ваше сообщение будет добавлено в файл /logs/grav.log
.
Grav теперь имеет возможность расширять мощные возможности конфигурации для различных сред, чтобы поддерживать различные конфигурации для сценариев разработки, постановки и производства.
Среды до Grav 1.6 хранились в папке user/
. Grav 1.7 перемещает среду в user/env/
, чтобы упростить обслуживание среды. Настоятельно рекомендуется переместить все среды в это новое место на существующих сайтах.
Это означает, что вы можете внести столько изменений конфигурации в среду, сколько необходимо. Хорошим примером этого является Панель отладки. По умолчанию новая панель отладки отключена в основном файле system/config/system.yaml
, а также в файле переопределения пользователя:
Если вы хотите включить её, можно сделать это через файл user/config/system.yaml
, однако лучшим решением может быть enabled для вашей среды разработки при доступе через localhost, но disabled на вашем рабочем сервере.
Этого можно легко добиться, переопределив этот параметр в файле:
где localhost
- это имя хоста среды (это хост, который вы вводите в браузере, например, http://localhost/your-site
), а ваш файл конфигурации содержит:
Точно так же вы можете включить конвейерную обработку ресурсов CSS, Link, JS и JS-модулей (объединение + минификация) только для вашего рабочего сайта (user/env/www.mysite.com/config/system.yaml
):
Если к вашему производственному серверу можно получить доступ через http://www.mysite.com
, вы также можете указать конфигурацию, специфичную для этого производственного сайта, с помощью файла, расположенного по адресу user/env/www.mysite.com/config/system.yaml
.
Конечно, вы не ограничены изменениями в system.yaml
, вы можете фактически переопределить любую настройку Grav вsite.yaml
или даже в любой конфигурации плагина!
Если вы используете Планировщик, помните об этом, используя среду localhost
и, следовательно, её конфигурацию.
Переопределение YAML-файла конфигурации плагина — это просто тот же процесс, что и переопределение обычного файла. Если стандартный файл конфигурации находится в:
Затем вы можете переопределить это с помощью параметра, который отменяет только определённые параметры, которые вы хотите использовать для локального тестирования:
С конфигурацией:
mailer:
+ engine: smtp
+ smtp:
+ server: smtp.mailtrap.io
+ port: 2525
+ encryption: none
+ user: '9a320798e65135'
+ password: 'a13e6e27bc7205'
+
Вы можете переопределить темы примерно таким же образом:
Может быть переопределено для любой среды, скажем, на каком-то производственном сайте (http://www.mysite.com
):
Начиная с Grav 1.7, можно настроить среду, используя конфигурацию сервера. В этом сценарии использования вы устанавливаете переменные среды с сервера или из сценария, который запускается до Grav, чтобы выбрать среду, которая будет использоваться.
Самый простой способ установить среду - использовать GRAV_ENVIRONMENT
. Значение GRAV_ENVIRONMENT
должно быть действительным именем сервера с доменом или без него.
В следующем примере для локального хоста выбирается среда разработки (development
):
Начиная с Grav 1.7, вы также можете изменить расположение локаций. Есть две возможности: либо вы настраиваете общее расположение для всех сред, либо определяете их одну за другой.
Если по какой-то причине вас не устраивает расположение по умолчанию user/env
для вашей среды, его можно изменить, используя переменную окружения GRAV_ENVIRONMENTS_PATH
.
Значение GRAV_ENVIRONMENTS_PATH
должно быть существующим путем в GRAV_ROOT
. Не используйте завершающую косую черту.
В следующем примере все среды будут расположены в user/sites/GRAV_ENVIRONMENT
, где GRAV_ENVIRONMENT
либо автоматически определяется, либо устанавливается вручную в конфигурации сервера:
Иногда может быть полезно иметь настраиваемое местоположение для вашей среды
Значение GRAV_ENVIRONMENT_PATH
должно быть существующим путем в GRAV_ROOT
. Не используйте завершающую косую черту.
В следующем примере только текущая среда будет расположена в user/development
:
Обратите внимание, что GRAV_ENVIRONMENT_PATH
отделен от GRAV_ENVIRONMENT
, поэтому вы также можете захотеть установить имя среды, если вы не хотите, чтобы оно автоматически совпадало с текущим именем домена.
Среды можно настраивать гораздо больше, чем описано на этой странице.
Для получения дополнительной информации перейдите на следующую страницу: Настройка мультисайта.
Настройка содержит общие настройки для Flex-каталога.
Эти параметры обычно используются для изменения поведения каталога, установки значений по умолчанию для объектов или изменения визуализации макетов.
Настройки разные в каждом каталоге, этот документ содержит только общие настройки, которые можно найти в каждом каталоге.
Вверху страницы вы найдете административные элементы управления.
Параметр | Описание |
---|---|
Enable Index Caching | Кэширование индекса ускоряет поиск за счёт создания временных индексов поиска для запросов. |
Index Cache Lifetime (seconds) | Время жизни для кэширования индекса в секундах. |
Enable Object Caching | Кэширование объектов ускоряет загрузку данных и изображений объекта. |
Object Cache Lifetime (seconds) | Время жизни для кэширования объектов в секундах. |
Enable Render Caching | Кэширование рендеринга ускоряет отрисовку контента за счёт кэширования результирующего HTML. |
Render Cache Lifetime (seconds) | Срок службы кэширования рендеринга в секундах. |
Если визуализированный HTML-код имеет динамическое содержимое, кеш визуализации можно отключить в шаблоне Twig с помощью {% do block.disableCache() %}
.
При использовании панели администрирования в Grav 1.7 вы уже задействуете Flex-объекты. Самыми лучшими примерами являются учётные записи и страницы.
По умолчанию управление Flex невидимо для пользователя. Чтобы увидеть каталог, он должен быть включен. Включенные каталоги могут отображаться либо в меню навигации, внутри пункта меню Flex-объекты или даже внутри других плагинов.
Плагин Flex-объекты должен быть включен для того, чтобы использовать любые пользовательские каталоги.
Для включения настраиваемого Flex-каталога вам нужно перейти в Плагины > Flex Objects.
Нас интересует параметр Directories в настройках плагина, который перечисляет все обнаруженные Flex-каталоги. Просто выберите интересующие вас каталоги и убедитесь, что переключатель установлен в положение Включено
.
Нажмите Сохранить и каталог должен появиться после загрузки страницы.
См. Введение для получения полного пошагового руководства о том, как создать страницу для вашего каталога.
По умолчанию пункт меню Flex-объекты содержит почти все Flex-каталоги, которые были включены на вашем сайте.
Некоторые каталоги Flex отображаются в другом месте. Например, Учётные записи и Страницы.
В верхней части страницы вы найдете административные элементы управления.
Когда вы выберете каталог, вы попадете в область Список контента.
В Списке контента вы можете просматривать объекты, использовать Поиск и изменять Порядок. Кроме того, каждый объект имеет Действия, в частности Редактирование и Удаление. Вы также можете добавлять новые объекты с помощью кнопки Добавить в верхней части любой страницы. Рядом с ним также находится кнопка Настройка для изменения настроек всего каталога.
Область Редактор контента позволяет редактировать объект и Сохранять изменения.
Область Настройка позволяет редактировать параметры, изменяющие поведение всего каталога. Обычно кэширование входит в число этих параметров.
В этом разделе описано, как быстро включить существующий Каталог и как отобразить его в админке Grav. В наших примерах мы используем каталог Контакты, который поставляется в комплекте с плагином Flex Objects в демонстрационных целях.
Чтобы включить настраиваемый Flex-каталог, вам необходимо перейти в Плагины > Flex Objects.
Нас интересует параметр конфигурации Directories (Каталоги), в котором перечислены все обнаруженные Каталоги Flex. Найдите каталоги, которые вы хотите включить, и убедитесь, что опция Enabled (Включено) отмечена.
Для этой демонстрации давайте включим директорию Контакты и нажмем Сохранить вверху.
После перезагрузки страницы вы должны увидеть новый пункт в меню админки, под названием Контакты.
В нашем примере мы предполагаем, что вы скопировали образец набора данных для Каталога контактов:
$ cp user/plugins/flex-objects/data/flex-objects/contacts.json user/data/flex-objects/contacts.json
+
Перейдите в раздел Страницы и добавьте новую страницу. Введите следующие значения:
Flex-Objects
Flex-objects
После этого вы можете нажать кнопку Продолжить.
В Редакторе контента войдите в каталог и добавьте контент:
Contacts
Убедитесь, что ввели всё правильно, затем нажмите Сохранить.
Если вы не укажете Flex-каталог
, на странице будут перечислены все каталоги вместо отображения записей из одного каталога.
Перейдите на созданную вами страницу. Вы увидите следующую страницу, содержащую Контакты:
В случае, если вы не выбрали какой-либо каталог, вместо этого вы увидите следующее:
Редактор контента — мощное представление в объектах Flex, которое позволяет создавать и обновлять тип контента.
Редактор может выглядеть по-разному с различными элементами управления, вкладками и полями форм, поскольку все они специфичны для типа каталога, который вы редактируете.
В верхней части страницы вы найдете административные элементы управления.
По умолчанию есть три кнопки: Назад, Сохранить и Удалить. Элементы управления могут также включать в себя другие действия, такие как Предварительный просмотр, Экспорт и т. д...
Форма обычно организована по вкладкам и разделам, чтобы облегчить редактирование содержимого.
Список контента обычно содержит разбитый на страницы список вашего контента, но некоторые каталоги, типа Страниц, могут иметь очень индивидуальный внешний вид.
Здесь вы можете создавать, редактировать и удалять свой контент. На странице также есть мощные инструменты для Поиска и Сортировки элементов.
Вверху страницы вы найдете административные элементы управления. Элементы управления могут отличаться в зависимости от типа Flex, но вот список некоторых из наиболее распространенных:
Базовая структура чертежа Flex содержит title
,description
и type
, описывающие тип, и три раздела: config
, blueprints
и form
, описывающие различные аспекты типа каталога.
Основная структура contacts.yaml
:
title: Contacts
+description: Simple contact directory with tags.
+type: flex-objects # do not change
+
+# Flex Configuration
+config: {}
+
+# Flex Directory Forms
+blueprints: {}
+
+# Flex Object Form
+form: {}
+
Чтобы создать свой собственный каталог, вам нужно начать с присвоения имени вашему type
(имя файла) и заполненияtitle
и description
.
После создания файла и заполнения основной информации следующим шагом будет либо копирование существующей формы, либо добавление некоторых полей в файл.
Мы предполагаем, что вы уже знаете, как создавать свои собственные формы и чертежи.
Лучше не использовать простой формат списка для описания полей, как указано в секции Создание простой формы. Также не передавайте в этот файл раздел формы process
, он не будет использоваться Flex.
В нашем примере с контактами раздел формы выглядит так:
# Flex Object Form
+form:
+ validation: loose
+
+ fields:
+ published:
+ type: toggle
+ label: Published
+ highlight: 1
+ default: 1
+ options:
+ 1: PLUGIN_ADMIN.YES
+ 0: PLUGIN_ADMIN.NO
+ validate:
+ type: bool
+ required: true
+
+ last_name:
+ type: text
+ label: Last Name
+ validate:
+ required: true
+
+ first_name:
+ type: text
+ label: First Name
+ validate:
+ required: true
+
+ email:
+ type: email
+ label: Email Address
+ validate:
+ required: true
+
+ website:
+ type: url
+ label: Website URL
+
+ tags:
+ type: selectize
+ size: large
+ label: Tags
+ classes: fancy
+ validate:
+ type: commalist
+
Форма выглядит одинаково независимо от того, была ли она взята со страницы или из файла конфигурации, плагина или чертежа темы. Это основной план для каждого объекта в вашем каталоге, и он должен содержать все поля, определённые в объекте. Подумайте об этом как о форме, отображаемой администратору.
Будьте осторожны при изменении чертежа для существующего типа Flex. Убедитесь, что объекты, которые вы уже сохранили, совместимы с новой версией чертежа — это означает, что вы должны иметь возможность как сохранять, так и отображать старые объекты.
Мы ещё не закончили. Есть ещё две вещи, которые необходимо сделать, чтобы каталог заработал: нам нужно настроить уровень хранения данных и определить поля для отображения в представлении «Список администраторов». Мы можем сделать и то, и другое в секции config
.
Раздел конфигурации — самая сложная часть чертежа Flex, хотя большая часть его предназначена только для настройки. Он содержит разделы data
, admin
и site
.
# Flex Configuration
+config:
+
+ # Data Settings
+ data: {}
+
+ # Admin Settings
+ admin: {}
+
+ # Site Settings
+ site: {}
+
Минимальная конфигурация выглядит примерно так:
# Flex Configuration
+config:
+
+ # Data Settings
+ data:
+ storage: user-data://flex-objects/contacts.json
+
+ # Admin Settings
+ admin:
+ # List view
+ list:
+ # List of fields to display
+ fields:
+ last_name:
+ link: edit # Edit link
+ first_name:
+ link: edit # Edit link
+ email:
+ website:
+
В конфигурации есть два обязательных раздела: config.data.storage
и config.admin.list.fields
. Последний определяет поля, отображаемые в представлении списка администраторов. С другой стороны, хранилище данных определяет, как данные будут храниться.
Flex-каталог легко настраиваемый. Вы можете использовать свои классы object
, collection
и index
для добавления собственного поведения. Кроме того, вы можете настроить уровень хранилища (storage
) в соответствии с вашими потребностями. Справочник также имеет стандартные функции «упорядочивания» (ordering
) и «поиска» (search
).
config:
+ data:
+ # Flex Object Class
+ object: CLASSNAME
+ # Flex Collection Class
+ collection: CLASSNAME
+ # Flex Index Class
+ index: CLASSNAME
+ # Storage Options
+ storage: {}
+ # Ordering Options
+ ordering: {}
+ # Search Options
+ search: {}
+
Объект, коллекция и индекс принимают имена классов. Если они не указаны, Grav будет использовать следующую конфигурацию по умолчанию:
config:
+ data:
+ object: 'Grav\Common\Flex\Types\Generic\GenericObject'
+ collection: 'Grav\Common\Flex\Types\Generic\GenericCollection'
+ index: 'Grav\Common\Flex\Types\Generic\GenericIndex'
+
Эти классы вместе будут определять поведение вашего типа. Если вы хотите настроить свой собственный тип, это можно сделать, расширив эти классы и передав здесь свои собственные классы.
Одна из наиболее важных частей - определить, где и как хранятся данные:
config:
+ data:
+ storage:
+ class: 'Grav\Framework\Flex\Storage\SimpleStorage'
+ options:
+ formatter:
+ class: 'Grav\Framework\File\Formatter\JsonFormatter'
+ folder: user-data://flex-objects/contacts.json
+
Выше частный случай, который также можно записать в краткой форме:
Grav 1.7 предоставляет 3 различных стратегии хранения, хотя вы можете легко создать свою собственную:
Название | Класс | Описание |
---|---|---|
Simple Storage | Grav\Framework\Flex\Storage\SimpleStorage | Все объекты хранятся в одном файле. Не поддерживает медиа. |
File Storage | Grav\Framework\Flex\Storage\FileStorage | Объекты хранятся в отдельных файлах в одной папке. |
Folder Storage | Grav\Framework\Flex\Storage\FolderStorage | Каждый объект хранится в отдельной папке. |
Кроме того, вы можете указать формат файла с options.formatter.class
:
Название | Класс | Описание |
---|---|---|
JSON | Grav\Framework\File\Formatter\JsonFormatter | Использовать формат файла JSON. |
YAML | Grav\Framework\File\Formatter\YamlFormatter | Использовать формат файла YAML. |
Markdown | Grav\Framework\File\Formatter\MarkdownFormatter | Использовать формат файла Grav Markdown с обложкой YAML. |
Serialize | Grav\Framework\File\Formatter\SerializeFormatter | Использовать сериализатор PHP. Быстро, но не читается человеком. |
INI | Grav\Framework\File\Formatter\IniFormatter | Использовать формат файла INI. Не рекомендуется. |
CSV | Grav\Framework\File\Formatter\CsvFormatter | Использовать формат файла CSV. Не рекомендуется. |
Параметры конфигурации (со значениями по умолчанию) для средств форматирования по умолчанию можно найти ниже во вкладках:
# JSON
+formatter:
+class: 'Grav\Framework\File\Formatter\JsonFormatter'
+options:
+ file_extension: '.json'
+ encode_options: '' # See https://www.php.net/manual/en/function.json-encode.php (separate options with space)
+ decode_assoc: true # Decode objects as arrays
+ decode_depth: 512 # Decode up to 512 levels
+ decode_options: '' # See https://www.php.net/manual/en/function.json-decode.php (separate options with space)
+
# YAML
+formatter:
+class: 'Grav\Framework\File\Formatter\YamlFormatter'
+options:
+ file_extension: '.yaml'
+ inline: 5 # Save with up to 4 expanded levels
+ indent: 2 # Indent with 2 spaces
+ native: true # Use native YAML decoder if available
+ compat: true # If YAML cannot be decoded, use compatibility mode (SLOW)
+
# Markdown
+formatter:
+class: 'Grav\Framework\File\Formatter\MarkdownFormatter'
+options:
+ file_extension: '.md'
+ header: 'header' # Header variable eg. header.title
+ body: 'markdown' # Body variable
+ raw: 'frontmatter' # RAW YAML variable
+ yaml:
+ inline: 20 # YAML options, see YAML formatter from above
+
Вы также можете установить порядок по умолчанию, который определяется парами key: ASC|DESC
:
Наконец, вы можете добавить поля поиска, которые просматриваются при вызове collection.search()
:
config:
+ data:
+ search:
+ # Fields to be searched
+ fields:
+ - last_name
+ - first_name
+ - email
+ # Search Options
+ options:
+ - contains: 1 # If field contains the search string, assign weight 1 to the object
+
Fields содержат список полей для поиска.
Возможные варианты поиска:
Название | Класс | Описание |
---|---|---|
case_sensitive | true или false | Если true, все проверки чувствительны к регистру, по умолчанию false |
same_as | 0 ... 1 | Значение поля должно совпадать со строкой поиска |
starts_with | 0 ... 1 | Значение поля должно начинаться со строки поиска |
ends_with | 0 ... 1 | Значение поля должно заканчиваться строкой поиска |
contains | 0 ... 1 | Значение поля должно содержать строку поиска |
Функция поиска возвращает 0, если поле не совпадает, и вес от 0 до 1, Если есть совпадение. Вес используется для упорядочения результатов поиска. Объект, который получает самое высокое ядро, имеет лучшее совпадение, чем объект с более низким баллом.
В настоящее время поиск не поддерживает наличие различных весов или стратегий для каждого поля.
Раздел Admin содержит различные параметры конфигурации для настройки администрирования каталога. Он содержит несколько основных разделов: router
, actions
, permissions
, menu
, template
и views
.
config:
+ # Admin Settings
+ admin:
+ # Admin router
+ router: {}
+ # Allowed admin actions
+ actions: {}
+ # Permissions
+ permissions: {}
+ # Admin menu
+ menu: {}
+ # Admin template type
+ template: pages
+ # Admin views
+ views: {}
+
Дополнительный раздел router
можно использовать для настройки маршрутов администрирования Flex-каталога. Маршрутизация поддерживает базовый путь, настраиваемые маршруты для каждого действия, а также перенаправление для обработки, например, обратной совместимости. Все пути относятся к базовому URL-адресу администратора.
config:
+ admin:
+ # Admin router
+ router:
+ path: '/contacts' # Custom path to the directory
+ actions:
+ configure: # Action name
+ path: '/contacts/configure' # New path to the action.
+ redirects: # List of redirects (from: to)
+ '/flex-objects/contacts': '/contacts'
+
Иногда вы хотите ограничить администрирование только отображением записей или, например, разрешить редактировать только существующие. Для этого actions
вы можете настроить разрешенные операции CRUD, чтобы они лучше соответствовали вашим потребностям.
config:
+ admin:
+ # Allowed admin actions (for all users, including super user)
+ actions:
+ list: true # Needs to be true (may change in the future)
+ create: true # Set to false to disable creating new objects
+ read: true # Set to false to disable link to edit / details of the objects
+ update: false # Set to false to disable saving existing objects
+ delete: false # Set to false to disable deleting objects
+
Приведенный выше пример предотвратит сохранение существующих объектов и их удаление для каждого пользователя, включая суперадминистратора.
Раздел разрешений позволяет вам добавлять новые правила разрешений для Grav. Эти правила появятся в администраторе пользователя/группы. Вы можете создать столько правил разрешений, сколько захотите, но вам нужно добавить свою собственную логику или правила авторизации в этот файл, чтобы использовать их.
config:
+ admin:
+ # Permissions
+ permissions:
+ # Primary permissions (used for the objects)
+ admin.contacts:
+ type: crudl # Create, Read, Update, Delete, List
+ label: Contacts Directory
+ # Secondary permissions (you need to assign these to a view, otherwise these will not be used)
+ admin.configuration.contacts:
+ type: default # Simple permission
+ label: Contacts Configuration
+
Если вы не хотите отображать свой каталог в администрировании Flex Objects
, один из вариантов — отобразить пункт меню в основной навигации. Вы можете сделать это в секции menu
.
config:
+ admin:
+ # Admin Menu
+ menu:
+ list:
+ hidden: false # If true, hide the menu item.
+ route: '/contacts' # Alias to `config.admin.router.path` if router path is not set.
+ title: Контакты
+ icon: fa-address-card-o
+ authorize: ['admin.contacts.list', 'admin.super'] # Authorization needed to access the menu item.
+ priority: 2 # Priority -10 .. 10 (highest goes up)
+
В приведенном выше примере создается пункт меню Контакты, указывающий на /admin/contacts
.
Когда вы создаете свои собственные каталоги Flex, вам иногда может потребоваться использовать одни и те же шаблоны для всех ваших пользовательских каталогов. Вы можете сделать это с помощью template
:
Flex Admin имеет несколько представлений для объектов. По умолчанию поддерживаются следующие представления: list
, edit
, configure
и необязательные preview
и export
. Также возможно добавить свои собственные представления.
config:
+ admin:
+ views:
+ # List view
+ list: {}
+ # Edit view
+ edit: {}
+ # Configure view
+ configure: {}
+ # Preview
+ preview: {}
+ # Data Export
+ export: {}
+
Первое представление, которое вам понадобится — это то, в котором перечислены все ваши объекты. По умолчанию представление list
использует VueTable и AJAX для разбивки объектов на страницы. Ему нужен список «полей» (fields
) для отображения, а также «параметры» (options
), чтобы определить, сколько элементов отображается одновременно, а также поле по умолчанию, используемое для упорядочивания.
config:
+ admin:
+ views:
+ # List view
+ list:
+ icon: fa-address-card-o
+ title: Site Contacts
+ fields: {} # See below
+ options:
+ per_page: 20 # Default number of items per page
+ order:
+ by: last_name # Default field used for ordering
+ dir: asc # Default ordering direction
+
Icon и Title используются для настройки значка и заголовка страницы со списком. Title также поддерживает использование шаблона Twig в следующем формате:
Fields содержит поля, которые вы хотите отобразить в списке каталогов. У каждого поля есть ключ, который представляет собой имя поля. Значение можно не указывать или оно может содержать следующие параметры конфигурации:
| Название | Значение | Пример | Описание | |------|-------|-------------| | width | integer
| 8 | Ширина поля в пикселях | | alias | string
| 'header.published' | Имя используемого поля формы. VueTable не любит точки в именах, поэтому установите псевдоним для вложенных переменных. | | field | array
| | Переопределение поля формы. Написано так же, как и любое поле формы, но без ключа. | | link | string
| 'edit' | Добавляет ссылку для редактирования в текст. | | search | boolean
| true | Делает поле доступным для поиска в списке администрирования. | | sort | array
| field: 'first_name' | Вы можете указать другое значение, если вы используете другое имя поля при запросе данных на стороне сервера, например first_name. | | title_class | string
| 'center' | Классы CSS, используемые в заголовках. | | data_class | string
| 'left' | Классы CSS, используемые в столбцах данных. |
Режим редактирования имеет те же основные параметры конфигурации, что и режим просмотра списка:
config:
+ admin:
+ views:
+ # Edit view
+ edit:
+ icon: fa-address-card-o
+ title:
+ template: '{{ object.last_name ?? ''Last'' }}, {{ object.first_name ?? ''First Name'' }}'
+
Можно добавлять параметры конфигурации каталога в широком диапазоне, которые затем могут быть использованы в файлах шаблонов.
config:
+ admin:
+ views:
+ # Configure view
+ configure:
+ hidden: false # Configuration button can be hidden, for example if you have custom tab to replace it, like in Accounts.
+ authorize: 'admin.configuration.contacts' # Optional custom authorize rule for this view.
+ file: 'config://flex/contacts.yaml' # Optional file where the configuration is saved.
+
+ icon: fa-cog
+ title:
+ template: "{{ directory.title }} {{ 'PLUGIN_ADMIN.CONFIGURATION'|tu }}"
+
Flex также поддерживает предварительный просмотр, хотя сейчас он работает путем отрисовки страницы из внешнего интерфейса, которая может быть определена в файле blueprint.
# Preview View
+ preview:
+ enabled: true
+ route:
+ template: '/contacts' # Twig template to create URL. In this case we use the list view
+
+ icon: fa-address-card-o
+ title:
+ template: "{{ object.form.getValue('title') ?? object.title ?? key }}"
+
Все объекты могут быть экспортированы в один файл. Вот пример конфигурации, как экспортировать данные в файл YAML:
# Data Export
+ export:
+ enabled: true
+ method: 'jsonSerialize'
+ formatter:
+ class: 'Grav\Framework\File\Formatter\YamlFormatter'
+ filename: 'contacts'
+
config:
+ # Site Settings
+ site:
+ templates:
+ collection:
+ # Lookup for the template layout files for collections of objects
+ paths:
+ - 'flex/{TYPE}/collection/{LAYOUT}{EXT}'
+ object:
+ # Lookup for the template layout files for objects
+ paths:
+ - 'flex/{TYPE}/object/{LAYOUT}{EXT}'
+ defaults:
+ # Default template variable {TYPE}; overridden by filename of this blueprint if template folder exists
+ type: contacts
+ # Default template variable {LAYOUT}; can be overridden in render calls (usually Twig in templates)
+ layout: default
+
Настройки шаблона позволяют настроить пути поиска шаблона и установить тип по умолчанию и имя макета во внешнем интерфейсе.
Раздел чертежи определяет общие параметры конфигурации для всего каталога. Эти параметры позволяют настроить общий каталог в соответствии с потребностями сайта, не требуя ручного редактирования файлов.
blueprints:
+ # Blueprint for configure view.
+ configure:
+ # We are inside TABS field.
+ fields:
+ # Add our own tab
+ compatibility:
+ type: tab
+ title: Compatibility
+ fields:
+ # Fields should be prefixed with object, collection etc..
+ object.compat.events:
+ type: toggle
+ toggleable: true
+ label: Admin event compatibility
+ help: Enables onAdminSave and onAdminAfterSave events for plugins
+ highlight: 1
+ default: 1
+ options:
+ 1: PLUGIN_ADMIN.ENABLED
+ 0: PLUGIN_ADMIN.DISABLED
+ validate:
+ type: bool
+
Эти параметры конфигурации могут быть изменены в секции Настройка Администрирования Flex-каталога.
В настоящее время единственные используемые параметры конфигурации находятся внутри раздела кэша. Для ваших пользовательских настроек вам нужно добавить логику, чтобы использовать их самостоятельно.
Для многих сайтов основная причина использования каталогов Flex заключается в том, чтобы иметь возможность определять свои собственные пользовательские типы данных, которые не являются ни простыми, ни достаточно маленькими, чтобы вписаться в конфигурацию, ни подходящими для представления в виде отдельных страниц.
Каталоги Flex решают эту проблему за вас. Поскольку типы Flex используют общие принципы проектирования как для конфигурации, так и для страниц, очень легко преобразовать существующую конфигурацию и страницы для использования Flex. У вас также могут быть существующие формы на сайте, которыми вы хотите управлять из панели администрирования, или, возможно, вы хотите отобразить выбранные комментарии на своем сайте. Эти формы также могут быть преобразованы для использования Flex.
Основой Flex-типа является его чертеж. Чертеж определял как форму, так и поля объекта. Он также имеет некоторую дополнительную конфигурацию, которая может использоваться для настройки каталога и его объектов, где он отображается в панели администратора и ACL.
Объекты Flex это новая концепция в Grav 1.7, который добавляет поддержку пользовательских типов данных, которые могут быть легко встроены в ваш сайт. Поддержка настраиваемых типов и возможности администрирования обеспечивается плагином Flex Objects, требующийся для панели админки. Этот плагин также обрабатывает создание объектов в интерфейсе на случай, если вам нужно, чтобы пользователи могли отправлять новые объекты или вносить в них изменения.
Базовые функции Grav, такие как учётные записи, группы пользователей и страницы уже были преобразованы в Flex-объекты, хотя они используются только в админ-панели.
Flex-каталоги в данной документации не имеют ничего общего с плагином Flex Directories. На самом деле старый плагин был заменен этой функцией вместе с плагином Flex Objects.
Flex представляет собой набор каталогов одного типа. Grav имеет свои собственные встроенные типы, такие как учётные записи пользователей и страницы. Плагины и темы также могут определять свои собственные типы и регистрировать их в Grav. С помощью плагина Flex Objects вы также можете создавать свои собственные пользовательские типы и каталоги.
Flex это контейнер для Flex-каталогов.
Это дает единую точку доступа для всех данных на сайте, учитывая, что данные находятся внутри каталога Flex. This makes all the objects available to every page and plugin in your site.
Даже если учётные записи пользователей Flex или страницы Flex не включены, вы все равно можете получить доступ к их версиям Flex как в интерфейсе, так и в панели администратора.
Тип Flex это чертеж для вашего Flex-каталога.
Он определяет всё, что необходимо для отображения и изменения содержимого: структуру данных, поля форм, разрешения, файлы шаблонов и даже уровень хранения.
Flex-каталог хранит коллекцию Flex-объектов одного Flex-типа.
Каждый каталог содержит коллекцию объектов с дополнительной поддержкой индексов для ускорения запросов к хранилищу.
Коллекция Flex это структура, которая содержит Flex-объекты.
Коллекция обычно содержит только те объекты, которые необходимы для отображения страницы или выполнения данного действия. Она предоставляет полезные инструменты для дальнейшей фильтрации или манипулирования данными, а также методы визуализации всей коллекции.
Объект Flex является единичным экземпляром некоего Flex-типа.
Объект представляет собой единую сущность. Объект предоставляет доступ к своим свойствам, включая любые связанные данные, такие как Медиа. Объект также знает, как визуализировать себя или какую форму использовать для редактирования своего содержимого. Такие действия, как создание, обновление и удаление объектов, поддерживаются самим объектом.
Индекс Flex используется для быстрого выполнения запросов к Flex-каталогу.
Содержит метаданные для объектов Flex, но не сами объекты.
Хранилище Flex является слоем хранения для Flex-объектов.
Это может быть один файл, набор файлов в одной папке или набор папок. Flex также поддерживает пользовательские хранилища, такие как хранилища баз данных.
Форма Flex интегрируется в плагин Form и позволяет создавать или редактировать Flex-объекты.
Flex поддерживает несколько видов, которые позволяют изменять различные части объекта.
Администрирование Flex реализуется плагином Flex Objects.
Он добавляет новый раздел в плагине админки, позволяющий администраторам сайта управлять объектами Flex. Каждый Flex-каталог поставляется со списком ACL типа CRUD, который можно использовать для ограничения доступа к различным областям админки и действий в них для определённых пользователей.
Впереди еще много работы. Вот текущие ограничения при рассмотрении вопроса об использовании объектов Flex:
Коллекция Flex — это упорядоченная карта объектов, которую также можно использовать как список.
Коллекция предоставляет несколько полезных методов, которые можно использовать для визуализации вывода, выборки объектов, фильтрации и сортировки и так далее.
Коллекция Flex расширяет Коллекции Doctrine.
render( [layout], [context] ): Block
Визуализирует коллекцию.
Параметры:
string
)array
)Возвращает:
object
) HTML-класс блока, содержащего выводВ twig есть тег {% render %}
, который следует использовать вместо прямого вызова метода. Это позволит активам JS/CSS из коллекции работать правильно.
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\ContentBlock\HtmlBlock;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+$page = 2;
+$limit = 10;
+$start = ($page-1)*$limit;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->limit($start, $limit);
+
+ /** @var HtmlBlock $block */
+ $block = $collection->render('cards', ['background' =>'gray', 'color' => 'white']);
+
+}
+
Все эти методы возвращают измененную копию коллекции. Исходная коллекция остается без изменений.
sort( orderings ): Collection
Отсортируйте коллекцию по списку пар свойство: направление
(property: direction
).
Параметры:
property: direction
, где направление либо ASC
, либо DESC
(array
)Возвращает:
object
) Новый отсортированный экземпляр коллекцииПорядок сортировки по умолчанию может быть установлен для внешнего интерфейса в чертежах Flex-типа.
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->sort(['last_name' => 'ASC', 'first_name' => 'ASC']);
+ // Collection has now be sorted by last name, first name...
+
+}
+
limit( start, limit ): Collection
Вернуть подмножество коллекции, начиная с start
и включая только limit
объектов.
Параметры:
int
)int
)Возвращает:
object
) Новый отфильтрованный экземпляр коллекции<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+$start = 0;
+$limit = 6;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->limit($start, $limit);
+ // Collection contains only the objects in the current page...
+
+}
+
filterBy( filters ): Collection
Фильтрация коллекции по списку пар свойство: значение
(property: value
).
Параметры:
property: value
, которые используются для фильтрации коллекции (array
)Возвращает:
object
) Новый отфильтрованный экземпляр коллекцииФильтрацию по умолчанию можно установить для внешнего интерфейса в чертежах Flex-типа.
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+$start = 0;
+$limit = 6;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->filterBy(['published' => true]);
+ // Collection contains only published objects...
+
+}
+
reverse(): Collection
Поменять порядок объектов в коллекции на обратный.
Возвращает:
object
) Новый перевернутый экземпляр коллекцииЕсли вы используете sort()
, рекомендуется изменить порядок в нем, поскольку это экономит дополнительный шаг.
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+$start = 0;
+$limit = 6;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->reverse();
+ // Collection is now in reverse ordering...
+
+}
+
shuffle(): Collection
Перемешать объекты в случайном порядке.
Возвращает:
object
) Новый случайно упорядоченный экземпляр коллекции<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->shuffle()->limit(0,6);
+ // Collection contains 6 random contacts...
+
+}
+
select( keys ): Collection
Выбрать объекты (по их ключам) из коллекции.
Параметры:
array
)Возвращает:
object
) Новый экземпляр коллекции{% set contacts = grav.get('flex').collection('contacts') %}
+{% set selected = ['gizwsvkyo5xtms2s', 'gjmva53uoncdo4sb', 'mfzwwtcugv5hkocd', 'k5nfctkeoftwi4zu'] %}
+
+{% set contacts = contacts.select(selected) %}
+
+<div>Displaying 4 selected contacts:</div>
+{% render contacts layout: 'cards' %}
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+$selected = ['gizwsvkyo5xtms2s', 'gjmva53uoncdo4sb', 'mfzwwtcugv5hkocd', 'k5nfctkeoftwi4zu'];
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->select($selected);
+ // Collection now contains the 4 selected contacts...
+
+}
+
unselect( keys ): Collection
Удалять предметы (по их ключам) из коллекции.
Параметры:
array
)Возвращает:
object
) Новый экземпляр коллекции{% set contacts = grav.get('flex').collection('contacts') %}
+{% set ignore = ['gizwsvkyo5xtms2s', 'gjmva53uoncdo4sb', 'mfzwwtcugv5hkocd', 'k5nfctkeoftwi4zu'] %}
+
+{% set contacts = contacts.unselect(ignore) %}
+
+<div>Displaying all but 4 ignored contacts:</div>
+{% render contacts layout: 'cards' %}
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+$ignore = ['gizwsvkyo5xtms2s', 'gjmva53uoncdo4sb', 'mfzwwtcugv5hkocd', 'k5nfctkeoftwi4zu'];
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->unselect($ignore);
+ // Collection now contains all but 4 ignored contacts...
+
+}
+
search( string, [properties], [options] ): Collection
Поиск строки в коллекции.
Параметры:
string
)null
(или не указано), используйте значения по умолчанию (array
или null
)array
)bool
bool
bool
bool
Возвращает:
object
) Новый отфильтрованный экземпляр коллекции<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->search('Jack', ['first_name', 'last_name', 'email'], ['contains' => true]);
+ // Collection now contains all search results...
+
+}
+
copy(): Collection
Создать копию из коллекции, клонировав все объекты в коллекции.
Возвращает:
object
) Новый экземпляр коллекции, теперь с клонированными объектамиЕсли вы изменяете объекты в своей коллекции, вы всегда должны использовать копии!
{% set contacts = grav.get('flex').collection('contacts') %}
+
+{% set contacts = contacts.shuffle().limit(0, 10) %}
+{% set fakes = contacts.copy() %}
+
+{% do fakes.setProperty('first_name', 'JACK') %}
+
+<h2>Fake cards</h2>
+{% render fakes layout: 'cards' %}
+
+<h2>Original cards</h2>
+{% render contacts layout: 'cards' %}
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ $collection = $collection->search('Jack', ['first_name', 'last_name', 'email'], ['contains' => true]);
+ // Collection now contains all search results...
+
+}
+
Коллекции можно перебирать.
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var FlexObjectInterface $object */
+ foreach ($collection as $object) {
+ // Do something with the object...
+ }
+
+}
+
first(): Object | false
Устанавливает итератор на первый объект в коллекции и возвращает этот объект.
Возвращает:
object
) Первый объектfalse
Никаких предметов в коллекции нет<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var FlexObjectInterface|false $object */
+ $object = $collection->first();
+ if ($object) {
+ // Do something with the object...
+ }
+
+}
+
last(): Object | false
Устанавливает итератор на последний объект в коллекции и возвращает этот объект.
Возвращает:
object
) Последний объектfalse
Никаких предметов в коллекции нет<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var FlexObjectInterface|false $object */
+ $object = $collection->last();
+ if ($object) {
+ // Do something with the object...
+ }
+
+}
+
next(): object | false
Перемещает позицию итератора к следующему объекту и возвращает этот элемент.
Возвращает:
object
) Следующий объектfalse
Больше никаких элементов в коллекции<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var FlexObjectInterface|false $object */
+ while ($object = $collection->next()) {
+ // Do something with the object...
+ }
+
+}
+
current(): object | false
Возвращает объект коллекции в текущей позиции итератора.
Возвращает:
object
) Текущий объектfalse
Больше никаких элементов в коллекции<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+ while ($collection->next()) {
+
+ /** @var FlexObjectInterface|false $object */
+ $object = $collection->current();
+ // Do something with the object...
+
+ }
+}
+
key(): key | null
Возвращает ключ объекта в текущей позиции итератора.
Возвращает:
string
) Ключ объектаnull
Больше никаких элементов в коллекции<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+ while ($collection->next()) {
+
+ $key = $collection->key();
+ // Do something with the key...
+
+ }
+}
+
Коллекции доступны так же, как ассоциативные массивы или карты.
Если объекта с данным ключом нет в коллекции, возвращается null
.
{% set contacts = grav.get('flex').collection('contacts') %}
+
+{% set contact = contacts['ki2ts4cbivggmtlj']
+
+{# Do something #}
+{% if contact %}
+{# Got Bruce Day #}
+Email for {{ contact.first_name|e }} {{ contact.last_name|e }} is {{ contact.email|e }}
+{% else %}
+Oops, contact has been removed!
+{% endif %}
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var FlexObjectInterface|null $object */
+ $object = $collection['ki2ts4cbivggmtlj'];
+ if ($object) {
+ // Object exists, do something with it...
+ }
+
+}
+
get( key ): Object | null
Получает объект с указанным ключом.
Параметры:
string
)Возвращает:
object
)null
Объект с данным ключом отсутствует в коллекцииАльтернатива — Доступ к массиву
{% set contacts = grav.get('flex').collection('contacts') %}
+
+{% set contact = contacts.get('ki2ts4cbivggmtlj')
+
+{# Do something #}
+{% if contact %}
+{# Got Bruce Day #}
+Email for {{ contact.first_name|e }} {{ contact.last_name|e }} is {{ contact.email|e }}
+{% else %}
+Oops, contact has been removed!
+{% endif %}
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var FlexObjectInterface|null $object */
+ $object = $collection->get('ki2ts4cbivggmtlj');
+ if ($object) {
+ // Object exists, do something with it...
+ }
+
+}
+
getKeys(): array
Получает все ключи коллекции.
Возвращает:
array
Список ключей<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var string[] $keys */
+ $keys = $collection->getKeys();
+ $keysList = implode(', ', $keys);
+
+}
+
GetObjectKeys(): array
Псевдоним метода getKeys()
.
Возвращает:
array
Список ключейgetValues(): array
Получает все объекты коллекции.
Преобразует коллекцию в массив. Ключи не сохраняются.
Возвращает:
array
)<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var FlexObjectInterface[] $objects */
+ $objects = $collection->getValues();
+ foreach ($objects as $pos => $object) {
+ // Do something with the object and its position...
+ }
+
+}
+
toArray(): array
Получает собственное представление коллекции в виде массива PHP.
То же, что и getValues()
, но с сохранением ключей.
Возвращает:
array
Список пар key: Object
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var array<string, FlexObjectInterface> $objects */
+ $objects = $collection->toArray();
+ foreach ($objects as $key => $object) {
+ // Do something with the object and its key...
+ }
+
+}
+
slice( offset, length ): array
Извлекает из коллекции length
элементов, начиная с позиции offset
.
Параметры:
int
)int
)Возвращает:
array
Список пар key: Object
Этот метод можно использовать для нумерации страниц.
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+
+ /** @var array<string, FlexObjectInterface> $objects */
+ $objects = $collection->slice(10, 5);
+
+ // Do something with the object and its key...
+
+}
+
chunk( size ): array
Разбить коллекцию на части с максимальной вместимостью size
объектов в каждой.
Параметры:
int
)Возвращает:
array
Двумерный список пар key: Object
Этот метод можно использовать для разделения содержимого на строки и столбцы.
{% set contacts = grav.get('flex').collection('contacts') %}
+
+{% set columns = contacts.limit(0, 10).chunk(5) %}
+
+<div>Displaying two columns of 5 emails each:</div>
+<div class="columns">
+{% for column,list in columns %}
+ <div class="column">
+ {% for object in list %}
+ <div>{{ object.email|e }}</div>
+ {% endfor %}
+ </div>
+{% endfor %}
+</div>
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = Grav::instance()->get('flex')->getCollection('contacts');
+if ($collection) {
+ /** @var array $columns */
+ $columns = $collection->limit(0, 10)->chunk(5);
+
+ /** @var
+ int $column
+ array<string, FlexObjectInterface> $objects
+ */
+ foreach ($columns as $column => $objects) {
+ // Do something with the objects...
+ }
+}
+
group( property ): array
Сгруппировать объекты в коллекции по свойству и вернуть их в виде связанного массива.
Параметры:
string
)Возвращает:
array
Двумерный список пар key: Object
, где значение свойства является ключом первого уровня{% set contacts = grav.get('flex').collection('contacts') %}
+
+{% set by_name = contacts.sort({last_name: 'ASC', first_name: 'ASC'}).group('last_name') %}
+
+<div>Displaying contacts grouped by last name:</div>
+<div>
+{% for last_name,list in by_name %}
+ {{ last_name|e }}:
+ <ul>
+ {% for object in list %}
+ <li>{{ object.first_name|e }}</li>
+ {% endfor %}
+ </ul>
+{% endfor %}
+</div>
+
```php <?php
use Grav\Common\Grav; use Grav\Framework\Flex\Interfaces\FlexCollectionInterface; use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
/ @var FlexCollectionInterface|null $collection */ $collection = Grav::instance()->get('flex')->getCollection('contacts'); if ($collection) { / @var array $byName */ $byName = $collection->group('last_name');
/** @var
+ string $lastName
+ array<string, FlexObjectInterface> $objects
+*/
+foreach ($byName as $lastName => $objects) {
+ // Do something with the objects...
+}
+
}
```
add( Object )
Добавляет объект в конец коллекции.
Параметры:
object
)remove( key ): Object | null
Удаляет элемент с указанным индексом из коллекции.
Параметры:
object
)Возвращает:
object
) или null
, если объекта не существуетremoveElement( Object ): bool
Удаляет указанный объект из коллекции, если он найден.
Параметры:
object
)Возвращает:
true
если объект был в коллекции, false
если нетclear()
Очищает коллекцию, удаляя все элементы.
containsKey( key ): bool
Проверяет, содержит ли коллекция объект с указанным ключом.
Параметры:
string
)Возвращает:
true
если объект находится в коллекции, false
если нетcontains( object ): bool
Проверяет, содержится ли элемент в коллекции.
Параметры:
object
)Возвращает:
true
если объект находится в коллекции, false
если нетindexOf( object ): string | false
Возвращает индекс/ключ данного объекта.
Параметры:
object
)Возвращает:
string
индекс/ключ объекта, false
если объект не был найденisEmpty(): bool
Проверяет, пуста ли коллекция (не содержит объектов).
Возвращает:
true
если коллекция пуста, false
в противном случаеcount(): int
Возвращает:
int
Количество объектов в коллекцииhasProperty( property ): array
Возвращает список пар key: boolean
независимо от того, имеет ли объект с ключом определенное свойство или нет.
Параметры:
string
)Возвращает:
array
пар key: bool
, где key
— ключ объекта, а bool
либо true
, либо false
.getProperty( property, default ): array
Возвращает список key: value
для каждого объекта.
Параметры:
string
)Возвращает:
array
пар key: value
, где key
— ключ объекта, а value
— значение свойства.setProperty( property, value ): Collection
Установить новое значение свойства для каждого объекта в коллекции.
Параметры:
string
)mixed
)Возвращает:
object
) Коллекция для цепочки вызовов методов.Этот метод изменяет экземпляры объектов, общие для всех коллекций, если это не предусмотрено, пожалуйста, скопируйте коллекцию перед использованием этого метода.
defProperty( property, default ): Collection
Определить значение по умолчанию для свойства для каждого объекта в коллекции.
Параметры:
string
)mixed
)Возвращает:
object
) Коллекция для цепочки вызовов методов.Этот метод изменяет экземпляры объектов, общие для всех коллекций, если это не предусмотрено, пожалуйста, скопируйте коллекцию перед использованием этого метода.
unsetProperty( property ): Collection
Удалить значение свойства для каждого объекта в коллекции.
Параметры:
string
)Возвращает:
object
) Коллекция для объединения вызовов методов.Этот метод изменяет экземпляры объектов, общие для всех коллекций, если это не предусмотрено, пожалуйста, скопируйте коллекцию перед использованием этого метода.
call( method, arguments): array
Вызывает метод для каждого объекта в коллекции. Возвращает результаты каждого вызова.
Параметры:
string
)array
)Возвращает:
key: result
(array
)Если метод изменяет объект, пожалуйста, скопируйте коллекцию перед использованием этого метода.
getTimestamps(): array
Возвращает список пар key: timestamp
для каждого объекта.
Возвращает:
key: timestamp
, где timestamp — целое число (array
)getStorageKeys(): array
Возвращает список пар key: storage_key
для каждого объекта.
Возвращает:
key: storage_key
(array
)getFlexKeys(): array
Возвращает список пар key: flex_key
для каждого объекта.
Возвращает:
key: flex_key
(array
)withKeyField( field ): Collection
Return new collection with a different key.
Параметры:
string
)Возвращает:
object
) Коллекция, проиндексированная новым ключом.exists( Closure ): bool
Проверяет существование объекта, удовлетворяющего заданному предикату.
Параметры:
Возвращает:
bool
true
, если ваша функция обратного вызова возвращает true
для всех объектов.forAll( Closure ): bool
Проверяет, выполняется ли данный предикат для всех объектов этой коллекции.
Параметры:
Возвращает:
bool
true
, если ваша функция обратного вызова возвращает true
для всех объектов.filter( Closure ): Collection
Возвращает все объекты этой коллекции, удовлетворяющие предикату.
Порядок элементов сохраняется.
Параметры:
Возвращает:
object
) Новая коллекция со всеми объектами, для которых функция обратного вызова возвращает true
.map( Closure ): Collection
Применяет данную функцию к каждому объекту в коллекции и возвращает новую коллекцию с объектами, возвращаемыми функцией.
Параметры:
Возвращает:
object
) Новая коллекция с объектами, возвращаемыми функцией обратного вызова.collectionGroup( property ): Collection[]
Сгруппируйте объекты в коллекции по полю и верните их как связанный массив коллекций.
Параметры:
string
) Свойство, используемое для группировки объектов.Возвращает:
array
Несколько коллекций в массиве, ключом является значение свойства.matching( Criteria ): Collection
Выбирает все объекты, соответствующие выражению, и возвращает новую коллекцию, содержащую эти объекты.
Параметры:
Возвращает:
object
) Новая коллекция с объектами, соответствующими критериям.См. документацию Doctrine о Конструкторе выражений и ** Выражениях**.
orderBy( array ): Collection
Изменить порядок коллекции по списку пар свойство/значение.
Параметры:
array
Возвращает:
object
) Новая коллекция с новым порядком.partition( Closure ): array
Разбивает эту коллекцию на две коллекции в соответствии с предикатом.
Ключи сохраняются в полученных коллекциях.
Параметры:
true
или false
.Возвращает:
array
Секционированные объекты [[a, b], [c, d, e]]
getTitle(): string
Получить название каталога
Возвращает:
string
Заголовок<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface;
+
+/** @var FlexDirectoryInterface|null $directory */
+$directory = Grav::instance()->get('flex')->getDirectory('contacts');
+if ($directory) {
+
+ /** @var string $title */
+ $title = $directory->getTitle();
+
+}
+
getDescription(): string
Получить описание каталога
Возвращает:
string
Описание<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface;
+
+/** @var FlexDirectoryInterface|null $directory */
+$directory = Grav::instance()->get('flex')->getDirectory('contacts');
+if ($directory) {
+
+ /** @var string $title */
+ $description = $directory->getDescription();
+
+}
+
getObject( id ): Object | null
Получить объект или null
, если объект не был найден.
Параметры:
string
)Возвращает:
object
)null
Объект не найден{% set directory = grav.get('flex').directory('contacts') %}
+
+{% set contact = directory.object('ki2ts4cbivggmtlj') %}
+
+{# Do something #}
+{% if contact %}
+{# Got Bruce Day #}
+Email for {{ contact.first_name|e }} {{ contact.last_name|e }} is {{ contact.email|e }}
+{% else %}
+Oops, contact has been removed!
+{% endif %}
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexDirectoryInterface|null $directory */
+$directory = Grav::instance()->get('flex')->getDirectory('contacts');
+if ($directory) {
+
+ /** @var FlexObjectInterface|null $object */
+ $object = $directory->getObject('ki2ts4cbivggmtlj');
+ if ($object) {
+ // Object exists, do something with it...
+ }
+
+}
+
Проверьте, что вы можете сделать с Объектом Flex
getCollection(): Collection
Получить коллекцию или null
, если коллекция не была найдена.
Возвращает:
object
){% set directory = grav.get('flex').directory('contacts') %}
+
+{% set contacts = directory.collection() %}
+
+{# Do something #}
+<h2>Ten first contacts:</h2>
+<ul>
+{% for contact in contacts.filterBy({published: true}).limit(0, 10) %}
+ <li>{{ contact.first_name|e }} {{ contact.last_name|e }}</li>
+{% endfor %}
+</ul>
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+
+/** @var FlexDirectoryInterface|null $directory */
+$directory = Grav::instance()->get('flex')->getDirectory('contacts');
+if ($directory) {
+
+ /** @var FlexCollectionInterface $collection */
+ $collection = $directory->getCollection();
+
+ // Do something with the collection...
+
+}
+
Проверьте, что вы можете сделать с Коллекцией Flex
Полный список методов можно найти в разделе Настройка объектов Flex.
count(): int
Подсчёт количества каталогов, зарегистрированных во Flex.
Возвращает: - int
Количество Каталогов
getDirectories( [names] ): array
Получить список каталогов.
Параметры: - names Необязательно: список имен каталогов (array
)
Возвращает: - array
список Каталогов
Если список имен не был предоставлен, метод возвращает все каталоги, зарегистрированные во Flex.
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexInterface;
+use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface;
+
+/** @var FlexInterface $flex */
+$flex = Grav::instance()->get('flex');
+
+/** @var FlexDirectoryInterface[] $directories */
+$directories = $flex->getDirectories();
+// = ['contacts' => FlexDirectory, ...]
+
+/** @var FlexDirectoryInterface[] $directories */
+$listedDirectories = $flex->getDirectories(['contacts', 'phonebook']);
+// = ['contacts' => FlexDirectory]
+
+/** @var array<FlexDirectoryInterface|null> $directories */
+$listedDirectoriesWithMissing = $flex->getDirectories(['contacts', 'phonebook'], true);
+// = ['contacts' => FlexDirectory, 'phonebook' => null]
+
Вы можете убедиться, что возвращаете только те каталоги, которые хотите.
hasDirectory( name ): bool
: Проверить, существует ли каталог.
Параметры: - name Имя каталога (string
)
Возвращает: - bool
true
, если найден, иначе false
getDirectory( name ): Directory | null
Получить каталог, возвращает null
, если он не был найден.
Параметры: - name Имя каталога (string
)
Возвращает: - Каталог (object
) - null
Каталог не найден
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexInterface;
+use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface;
+
+/** @var FlexInterface $flex */
+$flex = Grav::instance()->get('flex');
+
+/** @var FlexDirectoryInterface|null $directory */
+$directory = $flex->getDirectory('contacts');
+if ($directory) {
+ // Directory exists, do something with it...
+}
+
Проверьте, что вы можете сделать с каталогом Flex
getObject( id, directory ): Object | null
Получить объект, возвращает null
, если он не был найден.
Параметры: - id ID объекта (string
) - directory Имя каталога (string
)
Возвращает: - Объект (object
) - null
Объект не найден
{% set flex = grav.get('flex') %}
+
+{% set contact = flex.object('ki2ts4cbivggmtlj', 'contacts') %}
+
+{# Do something #}
+{% if contact %}
+{# Got Bruce Day #}
+{{ contact.first_name|e }} {{ contact.last_name|e }} has a website: {{ contact.website|e }}
+{% else %}
+Oops, contact has been removed!
+{% endif %}
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexInterface;
+use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
+
+/** @var FlexInterface $flex */
+$flex = Grav::instance()->get('flex');
+
+/** @var FlexObjectInterface|null $object */
+$object = $flex->getObject('ki2ts4cbivggmtlj', 'contacts');
+if ($object) {
+ // Object exists, do something with it...
+}
+
Проверьте, что вы можете сделать с объектом Flex
getCollection( directory ): Collection | null
Получить коллекцию, возвращает null
, если она не найдена.
Параметры: - directory
Имя каталога (string
)
Возвращает: - Коллекция (object
) - null
Каталог не найден
{% set flex = grav.get('flex') %}
+
+{% set contacts = flex.collection('contacts') %}
+
+{# Do something #}
+<h2>Ten random contacts:</h2>
+<ul>
+{% for contact in contacts.filterBy({published: true}).shuffle().limit(0, 10) %}
+ <li>{{ contact.first_name|e }} {{ contact.last_name|e }}</li>
+{% endfor %}
+</ul>
+
<?php
+
+use Grav\Common\Grav;
+use Grav\Framework\Flex\Interfaces\FlexCollectionInterface;
+use Grav\Framework\Flex\Interfaces\FlexInterface;
+
+/** @var FlexInterface $flex */
+$flex = Grav::instance()->get('flex');
+
+/** @var FlexCollectionInterface|null $collection */
+$collection = $flex->getCollection('contacts');
+if ($collection) {
+ // Collection exists, do something with it...
+}
+
Проверьте, что вы можете сделать с коллекцией Flex
Объекты Flex предназначены для того, чтобы быть простыми в использовании. Отображение коллекций и групп на ваших страницах в основном можно реализовать с помощью шаблонов Twig.
Чтобы включить и отобразить каталог Flex, пожалуйста, прочтите Включение каталога
flex-objects
⚓︎Отображение нескольких каталогов на странице directories/flex-objects.md
:
В качестве альтернативы вы можете передать отдельные параметры для каждого каталога:
title: Directories
+flex:
+ layout: default
+ directories:
+ contacts:
+ collection:
+ title: '{{ directory.title }}'
+ layout: default
+ object:
+ layout: list-default
+ object:
+ title: 'Contact: {{ object.first_name }} {{ object.last_name }}'
+ layout: default
+ services:
+---
+# Directories
+
Отображение одного каталога на странице contacts/flex-objects.md
:
title: Contacts
+flex:
+ directory: contacts
+ collection:
+ title: '{{ directory.title }}'
+ layout: default
+ object:
+ layout: list-default
+ object:
+ title: 'Contact: {{ object.first_name }} {{ object.last_name }}'
+ layout: default
+---
+# Contacts
+
Отображение одного объекта на странице my-contact/flex-objects.md
:
title: Contact
+flex:
+ directory: contacts
+ id: ki2ts4cbivggmtlj
+ object:
+ title: 'Contact: {{ object.first_name }} {{ object.last_name }}'
+ layout: default
+---
+# Contacts
+
По умолчанию тип страницы flex-objects
принимает два параметра URL-адреса: directory и id. Они используются для навигации по каталогам. Пример url-адресов выглядит следующим образом:
https://www.domain.com/directories/directory:contacts/id:ki2ts4cbivggmtlj
+
+https://www.domain.com/contacts/id:ki2ts4cbivggmtlj
+
Вы можете передать свои собственные параметры внутри flex
и использовать их в своей коллекции и файлах шаблонов объектов.
И Коллекции, и Объекты поддерживают рендеринг своего вывода в HTML. Вывод можно настроить с помощью двух параметров: макета и контекста. Макет позволяет вам настраивать внешний вид, например, у вас может быть список карточек, а затем более подробный вывод для деталей. Контекст позволяет передавать переменные, которые будут использоваться в файлах шаблонов.
{% render collection layout: 'custom' with { context_variable: true } %}
+
+{% render object layout: 'custom' with { context_variable: true } %}
+
Смотрите более подробную документацию: Визуализация коллекции и визуализация объекта.
Шаблоны Flex находятся в папке templates/flex
:
У каждого типа есть две папки: одна для коллекции рендеринга, а другая — для объекта рендеринга. Файлы внутри — это макеты, названные по имени файла. В нашем примере у нас есть макет default
как для коллекции, так и для объекта.
Шаблон коллекции flex/contacts/collection/default.html.twig
отвечает за рендеринг всех объектов в коллекции. Визуализированный вывод по умолчанию кэшируется. Ключ кэша определяется коллекцией и контекстом, передаваемым методу render()
.
Если контекст содержит нескалярные значения, кэширование будет отключено. Постарайтесь делать контекст как можно более простым!
Вот пример для Flex-типа «Контакты»:
<div id="flex-objects">
+ <div class="text-center">
+ <input class="form-input search" type="text" placeholder="Search by name, email, etc" />
+ <button class="button button-primary sort asc" data-sort="name">
+ Sort by Name
+ </button>
+ </div>
+
+ <ul class="list">
+ {% for object in collection.filterBy({ published: true }) %}
+ <li>
+ {% render object layout: layout with { options: options } %}
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+
+<script>
+ var options = {
+ valueNames: [ 'name', 'email', 'website', 'entry-extra' ]
+ };
+ var flexList = new List('flex-objects', options);
+</script>
+
Если визуализированный HTML-код имеет динамическое содержимое, кэш визуализации можно отключить в шаблоне Twig с помощью {% do block.disableCache() %}
.
Шаблон объекта flex/contacts/object/default.html.twig
отвечает за рендеринг одного объекта. Визуализированный вывод по умолчанию кэшируется. Ключ кеширования определяется объектом и контекстом, передаваемым методу render()
.
Если контекст содержит нескалярные значения, кэширование будет отключено. Постарайтесь делать контекст как можно более простым!
Вот пример для Flex-типа «Контакты»:
<div class="entry-details">
+ {% if object.website %}
+ <a href="{{ object.website|e }}"><span class="name">{{ object.last_name|e }}, {{ object.first_name|e }}</span></a>
+ {% else %}
+ <span class="name">{{ object.last_name|e }}, {{ object.first_name|e }}</span>
+ {% endif %}
+ {% if object.email %}
+ <p><a href="mailto:{{ object.email|e }}" class="email">{{ object.email|e }}</a></p>
+ {% endif %}
+</div>
+<div class="entry-extra">
+ {% for tag in object.tags %}
+ <span>{{ tag|e }}</span>
+ {% endfor %}
+</div>
+
Если визуализированный HTML-код имеет динамическое содержимое, кэш визуализации можно отключить в шаблоне Twig с помощью {% do block.disableCache() %}
.
Используя настраиваемые макеты, вы можете создавать бесконечное количество различных представлений как для своих коллекций, так и для объектов.
Вы можете создавать свои собственные макеты, просто добавляя новый файл рядом с default.html.twig
. Базовое имя файла совпадает с именем вашего макета.
В макетах коллекций рекомендуется вызывать {% render object layout: 'xxx' %}
вместо вывода переменных объекта непосредственно в шаблон коллекции.
render( [layout], [context] ): Block
Визуализировать объект.
Параметры:
string
)array
)Возвращает:
object
) Класс HtmlBlock, содержащий выходные данныеВ twig есть тег {% render %}
, который следует использовать вместо прямого вызова метода. Это позволит JS/CSS активам объекта работать должным образом.
```php <?php
use Grav\Common\Grav; use Grav\Framework\ContentBlock\HtmlBlock; use Grav\Framework\Flex\Interfaces\FlexObjectInterface;
/* @var FlexObjectInterface|null $collection / $object = Grav::instance()->get('flex')->getObject('gizwsvkyo5xtms2s', 'contacts'); if ($object) {
/** @var HtmlBlock $block */
+$block = $object->render('details', ['my_variable' => true]);
+
}
```
getKey(): string
Получить ключ объекта.
Возвращает:
string
Ключ объектаhasKey(): bool
Возвращает true
, если ключ объекта был установлен.
Возвращает:
true
если у объекта есть ключ, false
в противном случаеgetFlexType(): string
Получить тип объекта.
Возвращает:
string
Имя каталога Flex, в который входит объектhasProperty( property ): bool
Возвращает true
, если свойство объекта было определено и имеет значение (не null).
Параметры:
string
)Возвращает:
true
если свойство имеет значение, false
в противном случае.getProperty( property, default ): mixed
Возвращает значение свойства объекта.
Параметры:
string
)Возвращает:
mixed
Значение свойстваnull
если свойство не определено или не имеет значенияsetProperty( property, value ): Object
Установить новое значение для свойства объекта.
Параметры:
string
)mixed
)Возвращает:
object
) Объект для связывания вызовов методовЭтот метод изменяет экземпляр объекта, совместно используемый всеми коллекциями. Если это не предусмотрено, «клонируйте» (clone
) объект перед использованием этого метода.
defProperty( property, default ): Object
Задать значение по умолчанию для свойства объекта.
Параметры:
string
)mixed
)Возвращает:
object
) Объект для связывания вызовов методовЭтот метод изменяет экземпляр объекта, совместно используемый всеми коллекциями. Если это не предусмотрено, «клонируйте» (clone
) объект перед использованием этого метода.
unsetProperty( property ): Object
Удалить значение свойства объекта.
Параметры:
string
)Возвращает:
object
) Объект для связывания вызовов методовЭтот метод изменяет экземпляр объекта, совместно используемый всеми коллекциями. Если это не предусмотрено, «клонируйте» (clone
) объект перед использованием этого метода.
isAuthorized( action, [scope], [user] ): bool | null
Проверить, авторизован ли пользователь для действия.
Параметры:
string
)create
, read
, update
, delete
, list
string
)admin
, либо site
object
)Возвращает:
true
Разрешить действиеfalse
Запретить действиеnull
Не установлен (действует как Запретить)Есть два значения deny: denied (false), not set (null). Это позволяет объединить несколько правил в цепочку, если предыдущие правила не совпали.
getFlexDirectory(): Directory
Возвращает:
object
)getTimestamp(): int
Получить метку времени последнего изменения для объекта.
Возвращает:
int
Метка времени (в UNIX-формате).search(string, [properties], [options] ): float
Поиск строки из объекта, возвращает вес от 0 до 1.
Параметры:
string
)array
или null
)array
)bool
bool
bool
bool
Возвращает:
float
Вес поиска от 0 до 1, используется для упорядочивания результатов.0
Объект не соответствует поискуЕсли вы переопределите эту функцию, убедитесь, что вы возвращаете значение в диапазоне 0...1!
getFlexKey(): string
Получить уникальный ключ для объекта.
Возвращает:
string
Ключ Flex объектаКлючи Flex можно использовать, не зная, к какому каталогу принадлежит объект.
getStorageKey(): string
Получить уникальный ключ хранилища (в каталоге), который используется для определения имени файла или идентификатора базы данных.
Возвращает:
string
Ключ хранилища объектаexists(): bool
Возвращает истину, если объект существует в хранилище.
Возвращает:
true
Объект существует в хранилищеfalse
Объект не был сохраненupdate( data, files ): Object
Обновляет объект в памяти.
Параметры:
array
) Вложенные массивы свойств с их значениямиarray
) Массив объектов Psr\Http\Message\UploadedFileInterface
Возвращает:
object
) Объект для связывания вызовов методовПосле вызова этого метода необходимо сохранить объект.
create( [key] ): Object
Создать новый объект в хранилище.
Параметры:
string
) Дополнительный ключВозвращает:
object
) Сохраненный объектcreateCopy( [key] ): Object
Создать новый объект из текущего и сохранить его в хранилище.
Параметры:
string
) Дополнительный ключВозвращает:
object
) Сохраненный объектsave(): Object
Сохранить объект в хранилище.
Возвращает:
object
) Сохраненный объектdelete(): Object
Удалить объект из хранилища.
Возвращает:
object
) Удаленный объектgetBlueprint( [name] ): Blueprint
Возвращает чертеж объекта.
Параметры:
string
) Необязательное имя для чертежаВозвращает:
object
)getForm( [name], [options] ): Form
Возвращает экземпляр формы для объекта.
Параметры:
string
) Необязательное имя для формыarray
) Необязательные параметры формыВозвращает:
object
)getDefaultValue( name, [separator] ): mixed
Возвращает значение по умолчанию, подходящее для использования в форме для данного свойства.
Параметры:
string
) Имя свойстваstring
) Необязательный символ-разделитель для вложенных свойств, по умолчанию .
(точка)Возвращает:
mixed
Значение свойства по умолчаниюgetDefaultValues(): array
Возвращает значения по умолчанию, подходящие для использования в форме для данного свойства.
Возвращает:
array
Все значения по умолчаниюgetFormValue( name, [default], [separator] ): mixed
Возвращает необработанное значение, подходящее для использования в форме для данного свойства.
Параметры:
string
) Имя свойстваmixed
) Необязательное значение поля по умолчанию, null
если не заданоstring
) Необязательный символ-разделитель для вложенных свойств, по умолчанию .
(точка)Возвращает:
mixed
Значение поля формыtriggerEvent( name, [Event] ): Object
Запустить событие по вашему выбору.
Параметры:
string
) Название событияobject
) Необязательный класс событияВозвращает:
object
) Объект для связывания вызовов методовЭто руководство было протестировано для Grav v1.2.0 и всех более поздних версий.
Обновление Grav непосредственно до последней версии работает, но не полностью поддерживается и, скорее всего, приведет к поломке вашего сайта!
Самый простой способ обновить старые версии Grav — создать копию вашего сайта на сервере Linux/Unix, который поддерживает PHP 7.3 и SSH для доступа к командам CLI. Это руководство также работает с подсистемой Linux для Windows 10, но если она не установлена, вам, возможно, придется загрузить и переименовать пакеты обновлений вручную.
PHP 7.3 был выбран потому, что это единственная версия PHP, которая может использоваться для всех версий Grav. Вы также можете использовать PHP 7.1 или 7.2, но это позволит вам обновить Grav только до версии 1.6.31. На этом этапе вам нужно будет переключиться на PHP 7.3 или 7.4, прежде чем продолжить процесс обновления. PHP 8 следует использовать только после обновления до Grav 1.7 или более поздней версии.
Это руководство включает инструкции по обновлению Grav и наиболее часто используемые плагины: Problems, Error, Form, Email, Login и Admin. Для всех остальных плагинов убедитесь, что они все еще поддерживаются и поддерживают как Grav 1.6, так и последнюю версию Grav. На момент написания этого руководства почти все активно поддерживаемые плагины должны входить в эту категорию. Самые безопасные плагины — это те, которые были обновлены после выпуска Grav 1.7.0 (18.01.2021) или были подтверждены для работы в Grav 1.7.
Ваша тема и любые настраиваемые или неподдерживаемые плагины потребуют дополнительной работы. Любой пользовательский код следует проверить, чтобы убедиться, что он по-прежнему работает с текущими версиями Grav и PHP. То же самое верно и для файлов Markdown, YAML и Twig, поскольку в последних версиях библиотек есть исправления, которые выявляют ошибки, что обычно означает, что анализ поврежденных файлов завершится неудачно. Новые версии Grav предоставляют инструменты для проверки этих файлов, но проверки не выявляют всех проблем, поэтому также необходимо некоторое тестирование.
Контрольный список (с помощью консоли и Grav CLI):
bin/gpm version grav
php -v
, версия должна быть не ниже PHP 7.3.6В этой части предполагается, что вы уже сделали копию своего сайта и команды интерфейса командной строки работают. Пользователям Windows, у которых не установлена подсистема Linux, необходимо вручную загрузить файлы и переименовать их.
Выполните следующие команды в корневой папке вашего сайта Grav (опустите параметр -y
в команде GPM, если вы используете Grav 1.2 или ниже):
wget -q https://getgrav.org/download/core/grav-update/1.6.31 -O tmp/grav-update-v1.6.31.zip
+
+bin/gpm direct-install -y tmp/grav-update-v1.6.31.zip
+
Grav также можно обновить вручную. Удалите следующие папки: assets bin system vendor webserver-configs
и скопируйте/перезапишите все файлы из zip-файла обновления Grav. Обратите внимание, что файлы в zip-файле находятся внутри директории grav-update
.
Далее нам нужно обновить базовые плагины.
wget -q https://getgrav.org/download/plugins/problems/2.0.3 -O tmp/grav-plugin-problems-v2.0.3.zip
+wget -q https://getgrav.org/download/plugins/error/1.7.1 -O tmp/grav-plugin-error-v1.7.1.zip
+wget -q https://getgrav.org/download/plugins/form/4.3.0 -O tmp/grav-plugin-form-v4.3.0.zip
+wget -q https://getgrav.org/download/plugins/email/3.1.0 -O tmp/grav-plugin-email-v3.1.0.zip
+wget -q https://getgrav.org/download/plugins/login/3.3.8 -O tmp/grav-plugin-login-v3.3.8.zip
+wget -q https://getgrav.org/download/plugins/admin/1.9.19 -O tmp/grav-plugin-admin-v1.9.19.zip
+
+
+bin/gpm direct-install -y tmp/grav-plugin-problems-v2.0.3.zip
+bin/gpm direct-install -y tmp/grav-plugin-error-v1.7.1.zip
+bin/gpm direct-install -y tmp/grav-plugin-form-v4.3.0.zip
+bin/gpm direct-install -y tmp/grav-plugin-email-v3.1.0.zip
+bin/gpm direct-install -y tmp/grav-plugin-login-v3.3.8.zip
+bin/gpm direct-install -y tmp/grav-plugin-admin-v1.9.19.zip
+
В качестве альтернативы плагины можно установить вручную, просто удалив все файлы в директории user/plugins/pluginnname
и скопировав туда обновленные файлы из архива. Обратите внимание, что файлы в zip-файле находятся внутри папки с полуслучайным именем (требующим переименования).
Выполните следующие команды CLI одну за другой и следуйте их инструкциям:
Вы также можете обновить другие плагины один за другим до последней версии, но, пожалуйста, делайте это только в том случае, если последняя версия плагина поддерживает Grav 1.6. Остальные плагины должны быть отключены, если вы не уверены, что они будут работать. Они могут быть повторно включены позже, когда вы будете тестировать сайт.
Если у вас нет сломанных плагинов, то панель администрирования и сайт должны быть полностью работоспособны на данный момент.
Избегайте дальнейшего обновления Grav или плагина админки до того, как прочитаете статью Обновление до Grav 1.7. Вы можете в конечном итоге сломать как свой сайт, так и админку.
Grav 1.6 - самое крупное обновление с момента первого выпуска Grav. Оно вводит несколько новых функций, улучшений, исправлений ошибок и предоставляет множество архитектурных изменений, которые прокладывают путь к Grav 2.0.
Для большинства людей переход на Grav 1.6 должен быть простым обновлением без каких-либо проблем. Но, как и при любом другом обновлении, рекомендуется сделать резервную копию сайта и протестировать обновление в тестовой среде перед обновлением действующего сайта.
Независимо от того, являетесь ли вы разработчиком или администратором своего сайта, на вашем тестовом сайте должна быть включена панель отладки. Это связано с тем, что на панели отладки есть несколько полезных инструментов, которые помогут вам лучше подготовить ваш сайт для работы в более поздних версиях Grav.
Для получения дополнительной информации о том, как включить эту функцию, см. раздел Отладка и ведение журнала в документации.
Для наших целей мы ищем вкладку Deprecated на панели отладки, которая позволяет выявлять устаревшие проблемы и исправлять или сообщать о них перед обновлением до более поздних версий Grav. Устранение проблем, обнаруженных на вкладке Deprecated, поможет вам ускорить работу вашего сайта и сэкономить ваше время, когда придет время для будущих обновлений.
Эта вкладка Deprecated отображается, только если на странице обнаружены устаревшие вызовы.
Чтобы убедиться, что вы поймали все проблемы, вам следует либо очистить кэш, либо запустить Grav с отключенным кэшированием, чтобы максимизировать вероятность обнаружения всех ошибок. Даже выполнив эти шаги, вы можете заметить, что некоторые ошибки YAML/Twig появляются только после очистки кэша.
Вкладка Deprecated содержит список обнаруженных устаревших функций. Каждая проблема интерактивна и открывает сообщение об устаревании, которое содержит краткое объяснение проблемы, а также трассировку, которая позволяет вам найти и исправить код. Справа вы можете увидеть тип устаревшей ошибки, а в нижнем правом углу вы можете отфильтровать отображаемые типы, щелкнув значки.
Когда вы открываете сообщение об устаревании, содержание может сначала показаться ошеломляющим. Но в большинстве случаев вы можете игнорировать большую часть содержимого и просто прочитать несколько первых строк: сообщение, файл и строку (если они есть).
Есть несколько типов проблем с устареванием:
yaml
: файл YAML или Markdown использует устаревший синтаксис YAML.twig
: файл Twig содержит устаревший синтаксис Twig или возникла другая проблема, связанная с Twig.grav
: что-то вызывает устаревший метод Grav или использует устаревшее свойство.vendor
: что-то использует устаревший код сторонней библиотеки.unknown
: неизвестное устаревшее сообщение.В Grav 1.6 YAML имеет более строгий синтаксический анализ с запасным вариантом для обратной совместимости.
Grav 1.6 использует синтаксический анализатор YAML Symfony 4.2, который следует стандартной спецификации YAML гораздо точнее, чем предыдущий парсер из Symfony 3.4. Это означает, что файлы YAML, которые раньше работали нормально, могут вызывать ошибки, связанные с недопустимым YAML. Однако, если файл не загружается с помощью новой версии парсера 4.2, Grav по умолчанию все равно будет использовать более старую версию парсера 3.4, чтобы ваш сайт продолжал работать. Однако это снизит производительность сайта, и вам следует выявить и исправить проблемы, чтобы обеспечить оптимальную производительность.
Этот резервный механизм обратной совместимости будет удален в Grav 2.0.
Grav 1.6.7 и все более поздние версии имеют новую команду CLI для обнаружения проблем синтаксического анализа YAML, пожалуйста, запустите bin/grav yamllinter
, чтобы найти и исправить любые ошибки синтаксического анализа YAML на вашем сайте. Эту команду рекомендуется запускать сразу после обновления до Grav 1.6 или более поздней версии.
Admin 1.9.3 и все более поздние версии имеют YAML Linter, интегрированный в Сервис > Отчёты, если вы предпочитаете использовать его вместо команды CLI.
@
, \``,
|,
%и
>в начале строки без кавычек: используйте
data-options@: []вместо
@data-options: []`.:
для ключей: используйте key: value
вместо key:value
.null
, true
, false
, 2.0
в ключах; ключи могут быть либо целыми числами, либо строками.null
, true
, false
, 2
и 2.0
в значениях, если они должны быть строками.\
.Панель отладки может использоваться для обнаружения любого устаревшего YAML. Просто откройте панель отладки и посмотрите вкладку Deprecated. Если вкладку не удается найти, значит, проблем не обнаружено.
Вы можете отфильтровать любые проблемы с YAML, посмотрев на значки в правом нижнем углу панели отладки. Просто отфильтруйте, чтобы отображать только проблемы YAML, нажав другие кнопки, чтобы отключить их.
Ошибки YAML требуют, чтобы вы очистили кэш, ошибки будут обнаружены только при декодировании файлов YAML.
По умолчанию в Grav 1.6 включен режим совместимости с YAML. Это позволит старым сайтам продолжать работать после обновления, но это не идеально для использования на новых сайтах или если вы уже исправили и протестировали свой сайт на предмет всех ошибок синтаксического анализа YAML.
Вы можете изменить этот параметр в user/config/system.yaml
:
Мы рекомендуем пока не изменять эту настройку на существующих сайтах, а лучше создать тестовые сайты с режимом совместимости false. Также любой новый сайт, созданный с помощью Grav 1.6 или более поздней версии, должен иметь отключенный режим совместимости во время разработки, поскольку он позволяет вам сэкономить много времени, когда пришло время перейти на Grav 2.0.
Вам следует обновить свою тему до версии, в которой добавлена поддержка отложенных блоков ресурсов, чтобы обеспечить полную поддержку Grav 1.6. В качестве альтернативы, если у вас есть настраиваемая измененная тема или вы разработали свою собственную, вам следует обновить её самостоятельно, чтобы убедиться, что она продолжает работать с новыми функциями и более поздними версиями Grav и его плагинов, следуя руководству в Важные обновления темы сообщение в блоге.
Grav 2.0 будет использовать Twig 2 вместо Twig 1, который в настоящее время используется в выпусках Grav 1.x. Есть несколько устаревших функций, которые были удалены в Twig 2, поэтому вы должны убедиться, что вы выявили и исправили все эти проблемы, прежде чем обновляться до Grav 2.0 в будущем.
Панель отладки можно использовать для обнаружения любых устаревших проблем с Twig. Просто откройте панель отладки и перейдите на вкладку Deprecated.
|replace ()
будет работать только со связанным массивом в качестве параметра: { "I like this and that."|replace({'this': 'foo', 'that': 'bar'}) }}
.sameas()
теперь следует записать как same as()
.Дополнительная информация о том, что является устаревшим можно найти здесь.
Grav был довольно защищен от уязвимостей, за исключением XSS-атак, которые могут быть инициированы без особых усилий для любого кода, который не может должным образом избежать ненадежного ввода от пользователя. Twig - это простой способ писать файлы шаблонов, но в то же время слишком легко забыть, что большинство переменных, которые используются в файлах шаблонов, не очищаются перед использованием. Даже если они отфильтрованы и безопасны, они могут содержать специальные символы, которые следует экранировать, чтобы код HTML стал действительным.
Например, у вас может быть такой шаблон Twig:
По умолчанию в Grav отключено автоматическое экранирование Twig для простоты и ясности шаблонов, но, к сожалению, это было плохое решение, потому что никто, включая нас, не забывает всегда экранировать переменные, которые либо могут содержать специальные символы, либо исходят из ненадежный источник. Что ещё хуже, обычно неизвестно, является ли переменная HTML-безопасной или нет. Чтобы убедиться, что сайт защищен от большинства уязвимостей XSS, вы должны включить автоматическое экранирование в своей конфигурации. К сожалению, темы и плагины, использующие шаблоны Twig, обычно не работают с включенной настройкой, а шаблоны, написанные без явного экранирования, скорее всего, уязвимы для вредоносного контента.
В приведенном выше примере, поскольку автоматическое экранирование отключено, вывод будет отображаться как чистый HTML, и появится всплывающее окно с предупреждением «привет, там!». Однако этого следует избегать с помощью escape-фильтра Twig |e
(или |e ('html')
:
Поскольку большинство людей склонны забывать экранировать переменные в Twig, и поскольку использование |e
повсюду может затруднить чтение файлов шаблонов, в user/config/system.yaml
есть новый параметр:
Этот параметр принудительно включает «автоматическое экранирование» во всех файлах шаблонов Twig и отключает старую настройку для его включения и выключения. Побочным эффектом этой настройки является то, что ваш сайт, скорее всего, будет содержать несколько экранированных фрагментов контента, которые вам нужно будет исправить, используя фильтр |raw
для всего контента, который должен содержать только HTML и HTML. Многие шаблоны и плагины ещё не были обновлены для работы с принудительным экранированием, поэтому, пожалуйста, сообщайте о любых ошибках в них, чтобы их можно было своевременно исправить.
Переход к использованию автоматического экранирования будет непростым. Во время перехода все файлы шаблонов должны содержать фильтры |e
и |raw
для каждой переменной, чтобы убедиться, что файл шаблона безопасен для использования в обоих режимах, или вы можете заключить весь код шаблона в теги {% autoescape %}
Twig.
См. Руководство по Twig для получения дополнительной информации.
Grav 1.7 представляет несколько новых функций, улучшений, исправлений ошибок и предоставляет множество архитектурных изменений, которые прокладывают путь к Grav 2.0. Вот несколько основных моментов:
webp
, ленивая загрузка и многое другое.{% cache %}
и улучшение производительности, особенно в админке.Для большинства людей Grav 1.7 должно быть простым обновлением без каких-либо проблем, но, как и любое обновление, рекомендуется сделать резервную копию вашего сайта и протестировать обновление в тестовой среде перед обновлением вашего действующего сайта.
Такое поведение является результатом нового значения по умолчанию auto-escaping, которое истинно в Grav 1.7. Это усиление безопасности, и если вы обновляетесь с версии до 1.7, мы автоматически включаем параметр Совместимость с Twig в конфигурации системы, чтобы ваш старый код Twig продолжал работать. Если вы вручную обновляете сайт до 1.7 или обновляете каким-либо способом, который не проходит через процесс самостоятельного обновления GPM, вам следует установить этот параметр самостоятельно.
Ознакомьтесь с секцией Twig этого руководства для получения полной информации...
Поскольку мы обновились до более новой версии фреймворка Symfony, синтаксический анализатор YAML стал строже, чем в версиях до 1.7.Чтобы справиться с этим, мы включили старую версию парсера, которая доступна при включении параметра Совместимость с Yaml. Это выполняется автоматически, если вы обновляетесь до Grav 1.7 через GPM, но если вы выполняли обновление вручную, вам нужно будет установить это значение самостоятельно.
Ознакомьтесь с секцией YAML этого руководства для получения полной информации...
Если в вашей админке где-нибудь отображаются непереведенные строки, скорее всего, это связано с тем, что вы ранее отключили функцию переводов. Это было ошибкой в предыдущих версиях Grav и отключение его, на самом деле не отключало переводы во всей админке, как это было задумано. Это исправлено в Grav 1.7, и этот параметр выполняет то, для чего он предназначен, показывает коды перевода в верхнем регистре, а не сами переведенные строки.
Обратитесь к секции Устранение возникших проблем на этой странице.
Чтобы должным образом решить эту проблему, пользовательские плагины должны быть обновлены для поддержки страниц Grav и страниц Flex с использованием PageInterface
, а также должны быть явными Pages при необходимости.
Ознакомьтесь с секцией Страницы и секцией Админка этого руководства для получения полной информации...
Также были обнаружены некоторые специфические проблемы с плагинами. Обратитесь к секции Устранение возникших проблем на этой странице.
blueprints/pages/
, то используются стандартные расположения чертежей, как и в плагинах. К сожалению, некоторые старые темы могут иметь смесь файлов в blueprints/
и blueprints/pages
, что нарушает определение и приводит либо к отсутствию полей в админке при редактировании страниц, либо к фатальной ошибке: Loop detected while extending blueprint file
.При возникновении любой из этих ошибок обратитесь к секции Устранение возникших проблем.
Grav 1.7 требует PHP 7.3.6 или выше. Рекомендуемая версия — PHP 7.4.
Парсер Grav 1.7 YAML более строг, и ваш сайт может сломаться, если у вас есть синтаксические ошибки в ваших файлах конфигурации или заголовках страниц. Однако, если вы обновляете свой существующий сайт с помощью bin/gpm
или плагина админки
, процесс обновления сохраняет большую часть сломанного синтаксиса YAML.
Чтобы вернуться к старому поведению, вам необходимо убедиться, что у вас есть следующие настройки в user/config/system.yaml
:
или в админке в разделе Настройка → Дополнительно -> Совместимость с YAML
Руководство по обновлению Grav 1.6 имеет специальную секцию Парсинг YAML, чтобы помочь вам решить эти проблемы.
По умолчанию Grav 1.7 использует синтаксический анализатор YAML Symfony 4.4, который более точно соответствует стандартной спецификации YAML, чем более старые версии Grav. Это означает, что файлы YAML, которые раньше работали нормально, могут вызывать ошибки, связанные с недопустимым YAML. Тем не менее, Grav по умолчанию все равно будет использовать более старую версию парсера 3.4, чтобы ваш сайт продолжал работать.
Вам нужно запустить команду CLI bin/grav yamllinter
или перейти в раздел Админка > Сервис > Отчёты до и после обновления и исправления всех предупреждений и ошибок, связанных с YAML.
Grav 1.7 по умолчанию включает автоэкранирование Twig. Однако, если вы обновляете существующий сайт с помощью bin/gpm
или плагина админки
, процесс обновления сохраняет существующие настройки автоматического выхода.
Чтобы вернуться к старому поведению, вам необходимо убедиться, что у вас есть следующие настройки в user/config/system.yaml
:
или в админке в разделе Настройка → Дополнительно -> Совместимость с TWIG
И, пожалуйста, не забудьте очистить кэш после этого!
Руководство по обновлению Grav 1.6 имеет специальную секцию Twig. Обязательно с ней ознакомьтесь!
Шаблонизатор Twig обновлен до версии 1.43, но также поддерживает Twig 2.13. Чтобы поддерживать эту новую версию Twig, вам необходимо обновить любой старый синтаксис в ваших шаблонах Twig. Руководство по обновлению Grav 1.6 поможет вам в этом.
Дополнительные изменения в шаблонах:
{% cache %}
, устраняющий необходимость в расширении twigcache
.array_diff()
template_from_string()
svg_image()
чтобы упростить включение исходного кода SVG в Twigurl()
, принимающая третий параметр (true
) чтобы вернуться URL-адрес несуществующего файла, вместо того, чтобы возвращать false
|array
для работы с итераторами и объектами с методом toArray()
authorize()
чтобы лучше работать с вложенными параметрами правил|yaml_serialize
: добавлена поддержка объектов JsonSerializable
и других объектов, подобных массивамexternal.html.twig
, default.html.twig
и modular.html.twig
{% script 'file.js' at 'bottom' %}
вместо сломанного in 'bottom'
Grav 1.7 изменяет поведение строгой проверки. Однако, если вы обновляете существующий сайт с помощью bin/gpm
или плагина админки
, процесс обновления сохраняет существующее поведение в строгом режиме.
Улучшения строгого режима: Внутри форм объявление validation: strict
было не таким строгим, как мы надеялись, из-за ошибки. Строгий режим должен предотвращать отправку форм любых дополнительных полей, и это было исправлено в Grav 1.7. К сожалению, многие старые формы объявлены строгими, даже если в них есть дополнительные данные.
Чтобы вернуться к старому поведению, вам необходимо убедиться, что у вас есть следующие настройки вuser/config/system.yaml
:
Обнаружение инъекции XSS теперь по умолчанию включено во всех формах интерфейса. См. документацию о том, как отключить или настроить проверки для каждой формы и поля.
По этой причине мы добавили новую опцию конфигурации system.strict_mode.blueprint_compat: true
для сохранения старого поведения validation: strict
. Рекомендуется отключить этот параметр для повышения безопасности сайта, но перед этим выполните поиск по всем своим формам, если вы использовали функцию validation: strict
. Если да, удалите строку или проверьте, работает ли форма.
Этот резервный механизм обратной совместимости будет удален в Grav 2.0.
Grav 1.7 перемещает настройки окружения в папку user://env
. Старое местоположение по-прежнему работает, но лучше переместить среду в одно местоположение, в будущем функции могут полагаться на него.
Grav 1.7 также добавляет поддержку конфигурации среды на основе сервера и серверной многосайтовой конфигурации. Эта функция пригодится, если вы хотите использовать, например, контейнеры докеров и хотите сделать их независимыми от домена, который вы используете. Или если вы не хотите хранить секреты в конфигурации, а хранить их в настройках вашего сервера.
Кроме того, файл setup.php теперь может находиться либо в GRAV_ROOT/setup.php
, либо в GRAV_ROOT/GRAV_USER_PATH/setup.php
. Второе расположение упрощает использование сред с репозиториями git, содержащими только папку пользователя.
В админке теперь есть новое управление учётными записями, использующее Flex-пользователей:
Функция Flex-пользователей ещё не используется во внешнем интерфейсе вашего сайта.
Существующее администрирование страниц было значительно улучшено с Flex-страницами:
НАРУШЕНИЕ ОБРАТНОЙ СОВМЕСТИМОСТИ
Мы исправили ошибку 404 страницы, когда вы переходите на не маршрутизируемую страницу с маршрутизируемыми, видимыми дочерними страницами под ней. Теперь вы перенаправляетесь на первую маршрутизируемую, видимую дочернюю страницу. Это, вероятно, то, что вы хотели в первую очередь.
Функция Flex-страниц ещё не используется во внешнем интерфейсе вашего сайта.
Grav 1.7 изменил поведение того, как работают многоязычные резервные копии для страниц.
Ранее, если страница не существовала с запрошенным языком, старая реализация искала следующий Поддерживаемый язык. Это означало, что непереведенная страница всегда отображалась, но страница могла использовать какой-то неизвестный читателю язык.
Новое поведение — возврат только к языку сайта по умолчанию. Это поведение по умолчанию можно изменить, установив резервные языки для каждого языка с помощью параметра конфигурации system.languages.content_fallback
.
Если страница не существует ни на одном из резервных языков, вместо нее будет отображаться 404 Not Found.
НАРУШЕНИЕ ОБРАТНОЙ СОВМЕСТИМОСТИ
Пожалуйста, добавьте правильные резервные языки для содержимого страницы в system.yaml
или в админке: Настройка > Система > Языки > Резервный язык содержимого.
В Grav 1.7 значительно улучшена обработка мультимедиа. Некоторые основные моменты:
webp
loading=lazy
для изображений. Может быть установлена в system.images.defaults
или как параметр в Markdown: ?loading=lazy
noprocess
) определённых элементов только в фрагментах ссылок/изображений, например http://foo.com/page?id=foo&target=_blank&noprocess=id
Некоторые основные моменты:
--env
и --lang
, чтобы установить окружение и используемый язык соответственно (-e
больше не работает).bin/grav server
для легкого запуска встроенных веб-серверов Symfony или PHP.Scheduler
и более полезная информация из интерфейса командной строки.-r <job-id>
для команды CLI планировщика для принудительного запуска задания.bin/grav yamllinter
, добавлена опция поиска проблем с линтингом YAML на всем сайте или в пользовательской папке.Добавлен новый параметр конфигурации для сохранения языка по умолчанию в файлах .md
, если он установлен в false
: * system.yaml: languages.include_default_lang_file_extension
: true|false * Админка: Настройка > Система > Языки > Include default language in file extension
Добавлен новый параметр конфигурации, позволяющий устанавливать резервные языки содержимого индивидуально для каждого языка: * system.yaml: languages.content_fallback
: См. Конфигурацию языков * Админка: Настройка > Система > Языки > Content Language Fallback
Добавлена новая опция конфигурации для выбора между debugbar и clockwork * system.yaml: debugger.provider
: clockwork|debugbar * Админка: Настройка > Система > Отладчик > Debugger Provider
Добавлена новая опция конфигурации для скрытия потенциально конфиденциальной информации * system.yaml: debugger.censored
: false|true * Админка: Настройка > Система > Отладчик > Censor Sensitive Data
Добавлен новый параметр конфигурации для сохранения старого поведения validation: strict
* system.yaml: strict_mode.blueprint_compat
: true|false * Админка: Настройка > Система > Дополнительно > Blueprint Compatibility
Добавлена поддержка конфигурации системы для заголовков HTTP_X_FORWARDED (хост отключен по умолчанию) * system.yaml: http_x_forwarded.protocol
: true|false * Админка: Настройка > Система > Дополнительно > HTTP_X_FORWARDED_PROTO Enabled * system.yaml: http_x_forwarded.host
: true|false * Админка: Настройка > Система > Дополнительно > HTTP_X_FORWARDED_HOST Enabled * system.yaml: http_x_forwarded.port
: true|false * Админка: Настройка > Система > Дополнительно > HTTP_X_FORWARDED_PORT Enabled * system.yaml: http_x_forwarded.ip
: true|false * Админка: Настройка > Система > Дополнительно > HTTP_X_FORWARDED IP Enabled
Добавлен новый параметр конфигурации security.sanitize_svg для удаления потенциально опасного кода из файлов SVG. * security.yaml: sanitize_svg
: true|false * Admin: Configuration > Security > Sanitize SVG
bin/composer.phar
до 2.0.2
, самой новой и быстройПожалуйста, добавьте файл composer.json
в свой плагин и запустите composer update --no-dev
(и не забывайте обновлять его):
{
+ "name": "getgrav/grav-plugin-example",
+ "type": "grav-plugin",
+ "description": "Example plugin for Grav CMS",
+ "keywords": ["example", "plugin"],
+ "homepage": "https://github.com/getgrav/grav-plugin-example",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "...",
+ "email": "...",
+ "homepage": "...",
+ "role": "Developer"
+ }
+ ],
+ "support": {
+ "issues": "https://github.com/getgrav/grav-plugin-example/issues",
+ "docs": "https://github.com/getgrav/grav-plugin-example/blob/master/README.md"
+ },
+ "require": {
+ "php": ">=7.1.3"
+ },
+ "autoload": {
+ "psr-4": {
+ "Grav\\Plugin\\Example\\": "classes/",
+ "Grav\\Plugin\\Console\\": "cli/"
+ },
+ "classmap": [
+ "example.php"
+ ]
+ },
+ "config": {
+ "platform": {
+ "php": "7.1.3"
+ }
+ }
+}
+
См. Composer schema
Пожалуйста, используйте автозагрузку вместо require
в коде:
<?php
+
+/**
+ * @return array
+ */
+public static function getSubscribedEvents(): array
+{
+ return [
+ 'onPluginsInitialized' => [
+ // This is only required in Grav 1.6. Grav 1.7 automatically calls $plugin->autolaod() method.
+ ['autoload', 100000],
+ ]
+ ];
+}
+
+/**
+ * Composer autoload.
+ *
+ * @return \Composer\Autoload\ClassLoader
+ */
+public function autoload(): \Composer\Autoload\ClassLoader
+{
+ return require __DIR__ . '/vendor/autoload.php';
+}
+
Плагины и темы: $plugin->autoload()
и $theme->autoload()
вызываются автоматически при инициализации объекта
require
или include
для загрузки классовblueprints.yaml
)⚓︎Убедитесь, что вы обновили свои зависимости. Я рекомендую установить Grav либо на 1.6, либо на 1.7 и обновить ваш код/vendor до PHP 7.1
Добавлены themes
для кэшированных чертежей и конфигурации Grav 1.7.8 добавляет поддержку для определения любого чертежа в вашей теме. Переместите все файлы и папки из blueprints/
в blueprints/pages/
, чтобы сохранить совместимость с вашей темой. Также не забудьте обновить минимальную зависимость Grav на >=1.7.8
.
Session::refreshrateId()
для правильного предотвращения проблем с фиксацией сеансаuser.authorize()
теперь требует, чтобы пользователь был авторизован (прошел проверку 2FA), если правило не содержит login
в своем имени.Добавлена поддержка более продвинутого ACL (CRUD)
НАРУШЕНИЕ ОБРАТНОЙ СОВМЕСТИМОСТИ у user.authorize()
и Flex object.isAuthorized()
теперь есть два состояния отказа: false
и null
.
Убедитесь, что у вас нет строгой проверки на ложность: $user->authorize($action) === false
(PHP) или user.authorize(action) is same as(false)
(Twig).
Для отрицательных проверок вы должны использовать !user->authorize($action)
(PHP) или not user.authorize(action)
(Twig).
Изменение было сделано, чтобы разрешить строгие правила отказа путем объединения действий, если предыдущие не совпадают: user.authorize(action1) ?? user.authorize(action2) ?? user.authorize(action3)
.
Обратите внимание, что функция Twig authorize()
по-прежнему сохраняет прежнее поведение!
external.html.twig
, default.html.twig
и modular.html.twig
Flex-страницы
по умолчанию (можно отключить в плагине Flex-Objects
)Flex Pages
Flex Pages
Pages::dispatch()
вместо Pages::find()
Pages::getCollection()
Перемещена логика collection()
и evaluate()
из класса Page
в класс Pages
УСТАРЕЛО $page->modular()
в пользу $page->isModule()
PageCollectionInterface::nonModular()
в пользу PageCollectionInterface::pages()
УСТАРЕЛО PageCollectionInterface::modular()
в пользу PageCollectionInterface::modules()
НАРУШЕНИЕ ОБРАТНОЙ СОВМЕСТИМОСТИ Исправлено возвращение null
методами Page::modular()
и Page::modularTwig()
для папок и других неинициализированных страниц. Не должно влиять на ваш код, если вы не проверяли его на false
или null
.
\Grav\Common\Page\Interfaces\PageInterface
вместо \Grav\Common\Page\Page
в сигнатурах методовFlex-страницы
по умолчанию, коллекция будет вести себя немного по-другому$page->topParent()
может возвращать саму страницу вместо null$page->header()
может возвращать объект \Grav\Common\Page\Header
вместо stdClass
, вам нужно обрабатывать оба (Flex против обычного)MediaTrait:: freeMedia()
для свободных носителей (и памяти)Media
с помощью PSR-7Getters
, доступ через $media->$filename
больше не работает, используйте $media[$filename]
!Excerpts::processLinkHtml()
Flex-пользователей
в интерфейсе (пока не рекомендуется использовать)Flex-пользователей
по умолчанию (можно отключить в плагине Flex-Objects
)Flex-пользователи
: подчинение чертежам и разрешение использовать Flex только в админкеFlex-пользователи
: ACL пользователя и группы теперь поддерживает запрет разрешенийUserInterface::authorize()
при возврате null
имеет то же значение, что и false
, если доступ запрещен из-за отсутствия правила соответствия\Grav\Common\User\Group
в пользу $grav['user_groups']
, который содержит коллекцию Flex UserGroup\Grav\Common\User\Interfaces\UserInterface
вместо \Grav\Common\User\User
в сигнатурах методовFramework
напрямую, лучше использовать или расширять классы под пространством имен Grav\Common\Flex\Types\Generic
$grav['flex']
для доступа ко всем зарегистрированным каталогам FlexFlexRegisterEvent
, который срабатывает при первом обращении к $grav['flex']
hasFlexFeature()
для проверки, реализует ли FlexObject
или FlexCollection
заданную функциюgetFlexFeatures()
для возврата всех функций, которые реализует FlexObject
или FlexCollection
FlexObject::refresh()
для проверки, что объект обновленFlexStorage::getMetaData()
для получения обновленной метаинформации объекта для перечисленных ключейFlexDirectoryInterface
same_as
для объектов Flex$page->header()
объекта Flex Pages
возвращает объект \Grav\Common\Page\Header
, прежний класс Page
по-прежнему возвращает stdClass
PageCollectionInterface::nonModular()
в PageCollectionInterface::pages()
, прежний метод объявлен устаревшимPageCollectionInterface::modular()
в PageCollectionInterface::modules()
, прежний метод объявлен устаревшимFlexDirectory::getObject()
теперь можно вызывать без каких-либо параметров для создания нового объектаFlexDirectory::update()
и FlexDirectory::remove()
Grav\Common\Flex
FlexStorageInterface::getStoragePath()
и getMediaPath()
теперь могут возвращать null
FlexStorageInterface::getMetaData()
edit_list.html.twig
в поле формы, чтобы настроить внешний вид в представлении спискаRoute
Language::getPageExtensions()
, чтобы получить полный список поддерживаемых расширений языка страницLanguage::getFallbackPageExtensions()
для возврата к языку по умолчанию, вместо переключения на все языкиuser/env
Serializable
теперь являются завершёнными (final
) и не могут быть отменены.flatten_array
, чтобы формировать проверку поляsecurity@: or: [admin.super, admin.pages]
в чертежах (поддержка вложенного режима И/ИЛИ)validate: value_type: bool|int|float|string|trim
в array
для фильтрации всех значений внутри массиваЕсли в ваших плагинах есть папка с чертежами, инициализировать её в этом случае будет слишком поздно. Вместо этого сделайте это:
Symfony EventDispatcher
напрямую вместо обертки rockettheme/toolbox
.$grav->dispatchEvent()
для событий PSR-14PluginsLoadedEvent
, которое срабатывает после того, как плагины были загружены, но ещё не инициализированыSessionStartEvent
, которое срабатывает при запуске сеансаFlexRegisterEvent
, которое срабатывает при первом доступе к $grav['flex']
PermissionsRegisterEvent
, которое срабатывает при первом доступе к $grav['permissions']
onAfterCacheClear
Проверьте событие onAdminTwigTemplatePaths
, так не должно быть:
3.5.1
Utils::functionExists()
: Совместимость с PHP 8 function_exists()
Utils::isAssoc()
и Utils::isNegative()
Utils::simpleTemplate()
для очень простого создания шаблонов переменныхUtils::fullPath()
для получения полного пути к файлу, потоку и т. д.CSVFormatter::decode()
Security::sanitizeSVG()
$grav->close()
, чтобы правильно завершать запрос ответомFolder::countChildren()
, чтобы определить, есть ли в папке дочерние папкиFile
Route::getBase()
Route
неизменными. Это означает, что вам нужно сделать: {% set route = route.withExtension('.html') %}
(для всех методов withX
) для хранения обновленных версий.Content-Encoding
в Apache, когда сжатие контента отключеноUri::getAllHeaders()
JsonFormatter
в виде строки$this->setLanguage($langCode);
прежде чем делать что-либо ещё, если вы хотите установить язык (или использовать по умолчанию)$this->initializeGrav();
Уже вызван, если до этого была введена команда bin/plugin
$this->initializePlugins();
Это инициализирует grav, плагины (до onPluginsInitialized
)$this->initializeThemes();
Это инициализирует grav, плагины и тему$this->initializePages();
Это инициализирует grav, плагины, тему и все необходимое для страниц.bin/grav yamllinter
, чтобы найти любые ошибки синтаксического анализа YAML на вашем сайте (включая ваши плагины и темы).Добавлена опция редактор контента
в проект учётной записи пользователя
НАРУШЕНИЕ ОБРАТНОЙ СОВМЕСТИМОСТИ админка больше не будет инициализировать frontend-страницы, это было сделано для того, чтобы значительно ускорить работу плагина админки.
Пожалуйста, вызывайте $grav['admin']->enablePages()
или {% do admin.enablePages() %}
если вам нужно получить доступ к интерфейсным страницам. Этот вызов можно безопасно делать несколько раз.
Если вы используете Flex-страницы
, используйте каталог Flex вместо них, это сделает ваш код намного быстрее.
Админка теперь использует Flex для редактирования учетных записей
и страниц
. Если ваш плагин подключается к любому из них, пожалуйста, убедитесь, что они все ещё работают.
Кэширование админки включено по умолчанию, убедитесь, что ваш плагин очищает кэш при необходимости. Пожалуйста, избегайте очистки всего кэша!
init()
, классы без него в будущем перестанут работать.ОШИБКА: Шаблон flex-objects.html.twig для страницы не найден
⚓︎Если вы получаете эту ошибку после обновления до Grav 1.7, это может быть связано с плагином content-edit
. Если отключить этот плагин, ошибка должна исчезнуть сама собой. См. описание проблемы #3169
Если ваша админка выглядит так:
Исправление очень простое и может быть сделано даже при неполном переводе. Просто перейдите к PLUGIN_ADMIN.CONFIGURATION
, а потом в PLUGIN_ADMIN.LANGUAGES
, измените параметр PLUGIN_ADMIN.LANGUAGE_TRANLATIONS
на PLUGIN_ADMIN.YES
:
Если вы не видите свои пользовательские поля при редактировании страницы, ваша тема использует два противоречивых места для чертежей страниц.
Если тема была создана не вами, пожалуйста, сообщите об ошибке автору темы.
Чтобы исправить ошибку, вам необходимо переместить все файлы и папки вашей темы из blueprints/
в blueprints/pages/
(требуется Grav 1.7.8+). В противном случае, если тема должна поддерживать более старые версии Grav, сделайте наоборот.
Самым простым исправлением ошибки цикла является перемещение файлов в нужное место, см. вышеуказанный вопрос.
В качестве альтернативы вы можете исправить проблему, изменив чертеж неработающей страницы с этого блока:
где [NAME]
— имя файла (без расширения) самого чертежа, на этот блок
Сообщалось, что после обновления до последней версии Grav 1.7 и Admin 1.10 некоторые страницы администратора выглядят сломанными и не полностью стилизованными. Это может быть связано с плагином imagecreate
. Недостаточно отключить этот плагин, вы должны полностью удалить его, после чего ошибка должна исчезнуть сама собой. См. описание проблемы #2035
Хотя мы рекомендуем решить любые проблемы, которые могут возникнуть у вас, чтобы гарантировать, что Grav 1.7 и будущие обновления будут лёгким обновлением, будут сценарии, в которых у вас есть настраиваемые функции плагина или нет ресурсов разработчика под рукой, и вам просто нужно вернуться к Grav 1.6 быстро.
Если у вас есть доступ к сайту через интерфейс командной строки, это можно сделать, выполнив следующие команды из корня вашего сайта Grav 1.7:
wget -q https://getgrav.org/download/core/grav-update/1.6.31 -O tmp/grav-update-v1.6.31.zip
+wget -q https://getgrav.org/download/plugins/admin/1.9.19 -O tmp/grav-plugin-admin-v1.9.19.zip
+unzip tmp/grav-update-v1.6.31.zip -d tmp
+unzip tmp/grav-plugin-admin-v1.9.19.zip -d tmp
+cp -rf tmp/getgrav-grav-plugin-admin-5d86394/* user/plugins/admin/
+cp -rf tmp/grav-update/* ./
+
По сути, здесь выполняется прямая установка последней версии Grav 1.6 и Admin 1.9 поверх вашей текущей установки. Папку user/
это не затрагивает, поэтому ваш контент и плагины не пострадают.
Для тех, у кого нет доступа к CLI, скачайте файлы grav-update-v1.6.31.zip и grav-plugin-admin-1.9.19.zip. Разархивируйте файлы в свою файловую систему. Затем используйте свой любимый FTP/SFTP-клиент, чтобы скопировать все файлы Grav в ваш WEBROOT
и файлы админки в WEBROOT/user/plugins/admin
.
Если вы хотите разрабатывать с помощью Grav, вы получите более сложную настройку, чем та, которая требуется для обычного пользователя Grav. Это включает практически любой тип разработки, например: Grav Core, Grav Plugins, Grav Skeletons или даже Grav Themes.
Во-первых, давайте разберем различные типы развития:
Когда мы говорим о Grav Core, мы фактически говорим о вещах в папке system
. Эта папка контролирует все, что касается Grav, и на самом деле является самой сутью рабочего процесса и жизненного цикла Grav.
Grav намеренно сосредоточен на эффективной работе со страницами. Для управления страницами и расширенной функциональности часто лучше всего создать плагин. Мы настоятельно рекомендуем нашему сообществу вносить исправления и даже предлагать разработку соответствующих функций в ядре Grav.
Сначала установите зависимости для разработки, запустив composer install из корня Grav.
Затем вы можете запустить тесты:
Это запустит полный набор существующих тестов, которые всегда должны успешно выполняться на любом сайте.
Вы также можете запустить один файл модульного теста, например
Альтернативный метод вызова этих тестов:
./vendor/bin/codecept run
+./vendor/bin/codecept run tests/unit/Grav/Common/Markdown/ParsedownTest::testAttributeLinks
+
Большая часть усилий по разработке, вероятно, будет иметь форму плагина Grav. Поскольку в Grav имеется множество перехватчиков событий, очень легко обеспечить расширенные и специфические функции с помощью создания подключаемого модуля. Мы уже разработали множество плагинов, которые работают по-разному, используя множество различных событий, чтобы продемонстрировать мощь этой функциональности.
Есть много преимуществ от предоставления функциональности в плагинах, но есть несколько ключевых преимуществ:
Хороший плагин Grav требует определённых файлов для правильной работы, чтобы попасть в репозиторий Grav и отображаться в плагине админки. Убедитесь, что ваш плагин содержит все эти файлы:
Grav Skeleton — это универсальный образец сайта. Они включают Grav Core, необходимые плагины, а также соответствующие страницы для контента и тему для объединения всего этого.
Grav был разработан, чтобы максимально упростить процесс создания сайта. По этой причине все, что вам нужно для сайта, может содержаться в папке user
. Каждый из имеющихся в настоящее время каркасов - это просто папка user
на GitHub, которую мы упаковываем с различными зависимостями (необходимые плагины и тема) в пакет, который можно просто распаковать, чтобы предоставить рабочий пример.
Эти каркасы являются основой, на которой вы можете быстро и эффективно развивать свой сайт. Вы не привязаны к определенному набору функций. Он так же гибок, как и любая другая установка Grav.
Хороший каркас Grav требует определённых файлов для правильной работы, чтобы попасть в репозиторий Grav и отображаться в плагине админки. Убедитесь, что ваш каркас содержит все эти файлы:
Из-за тесной связи со страницами и темами Grav тема Grav является неотъемлемой и очень важной частью сайта Grav. Под этим мы подразумеваем, что каждая страница Grav ссылается на шаблон в теме, поэтому ваша тема должна предоставлять соответствующие шаблоны Twig, которые используют ваши страницы.
Движок шаблонов Twig - очень мощная система, и поскольку Grav действительно не накладывает никаких ограничений, вы можете создавать любой дизайн, какой захотите. Это одна из замечательных особенностей Grav, которая отличает Grav от традиционной CMS, имеющей слабую связь между контентом и дизайном.
Хорошая тема Grav требует определённых файлов для правильной работы, чтобы попасть в репозиторий Grav и отображаться в плагине админки. Убедитесь, что ваша тема содержит все эти файлы:
С выпуском Grav 0.9.18 вы теперь можете предоставлять демонстрационный контент как часть плагина или пакета темы. Это означает, что всё, что находится в папке с именем _demo/
, будет скопировано в папку user/
как часть процедуры установки. Это означает, что вы можете предоставить страницы, конфигурацию или что-нибудь ещё, что находится в папке user/
. Пользователю предлагается сделать это, и это совершенно необязательно.
Обратите внимание, что демонстрационный контент не копируется, если ваш плагин или тема установлены через плагин Admin
.
Когда вы создали новую тему или плагин и хотели бы, чтобы они были добавлены в репозиторий Grav, вам необходимо выполнить несколько стандартных действий:
LICENSE
, содержащий MIT-совместимую лицензию. Пример здесьREADME.md
с описанием функций и инструкциями по его установке и настройке. Пример здесьblueprints.yaml
со всеми обязательными полями. Пример здесьCHANGELOG.md
в правильном формате. Пример здесьУбедитесь, что ваше именование каждого тега согласовано. GPM использует эту информацию, чтобы определить, новее ли ваш плагин/тема, чем последний. Мы рекомендуем использовать Семантические номера версий для тегов. Например. 1.2.4
. Согласованность для всех тегов имеет первостепенное значение!
Сайт GetGrav.org использует собственный формат журнала изменений, который написан с использованием стандартного Markdown, но с ним можно работать с помощью простого CSS и отображается в привлекательном формате. Чтобы гарантировать, что ваши журналы изменений могут быть проанализированы и отформатированы должным образом, используйте следующий синтаксис:
# vX.Y.Z
+## 01/01/2015
+
+1. [](#new)
+ * Добавленная фича
+ * Другая добавленная фича
+2. [](#improved)
+ * Сделанное улучшение
+ * Другое сделанное улучшение
+3. [](#bugfix)
+ * Реализованное исправление
+ * Другое реализованное исправление
+
+...повторять сколько нужно раз...
+
Каждый раздел #new, #improved, #bugfix
необязателен, просто включите нужные разделы.
В датах можно использовать американский m/d/y
формат даты или европейский формат d-m-y
. Также убедитесь, что между заголовками (версия и дата) и списками (#new, #improved, #bugfix) есть пустая строка.
Как и в наши дни, GitHub станет вашим лучшим другом, когда дело доходит до разработки для Grav. Мы создали несколько инструментов, чтобы максимально упростить это, но есть некоторые шаблоны разработки, которым вы должны следовать, чтобы упростить процесс.
Клонируйте все репозитории, с которыми вы планируете работать, в одну папку Projects
или Development
на вашем компьютере. Это позволит нашим инструментам находить нужные репозитории.
Мы используем модель ветвления GitFlow для всей нашей разработки Grav. Основная концепция методологии GitFlow заключается в том, что разработка происходит в ветке develop
, но новые функции и функции создаются в отдельных ветвях feature
, которые по завершении объединяются в develop
. Релизы объединяют develop
в master
, и вы можете применять ветки hotfix
по мере необходимости в процессе выпуска. Большинство современных клиентов Git поддерживают это. Однако мы рекомендуем Atlassian SourceTree, поскольку он бесплатный, кроссплатформенный и простой в использовании.
Grav также имеет некоторые зависимости (продиктованные файлом .dependencies
), которые включают плагины Error и Problems, а также тему Antimatter. Вы можете следовать этим инструкциям, чтобы клонировать эти частички на свой компьютер.
Если вы хотите внести дополнения или изменения в какой-либо из репозиториев getgrav
, вам нужно будет создать форк соответствующего репозитория, а затем клонировать URL-адрес вашей вилки, а не напрямую репозиторий getgrav
. В приведенном ниже примере используются только прямые репозитории getgrav
.
cd
+mkdir Projects
+cd Projects
+mkdir Grav
+cd Grav
+git clone https://github.com/getgrav/grav.git
+git clone https://github.com/getgrav/grav-plugin-error.git
+git clone https://github.com/getgrav/grav-plugin-problems.git
+git clone https://github.com/getgrav/grav-theme-antimatter.git
+
Это клонирует все 4 репозитория в вашу папку ~/Projects/Grav
.
Как правило, обычная процедура настройки тестового сайта для Grav заключается в использовании команды bin/grav new-project
. Это верно для разработки, за исключением одного важного отличия. Поскольку мы хотим иметь возможность разрабатывать из вашего веб-корня, но чтобы в вашем клонированном коде отображались какие-либо изменения, нам необходимо символически связать соответствующие части. Мы делаем это, передавая флаг -s
команде bin/grav new-project
.
Требуется один дополнительный шаг. Вы должны указать команде, где она может найти ваши репозитории. Итак, выполните следующие действия, чтобы создать файл конфигурации в новой папке .grav/
, которую вам нужно будет создать в корне вашего домашнего каталога:
В этом файле: укажите, где расположены соответствующие файлы:
Убедитесь, что вы сохранили этот файл и что он доступен для чтения. Теперь вы можете создать свой символически связанный сайт, где ~/www
- это ваш корневой веб-сайт, а ~/www/grav
- это место, где будет создан ваш новый сайт для тестирования Grav:
Вы должны увидеть что-то вроде этого:
rhukster@gibblets:~/Projects/Grav/grav(develop○) » bin/grav new-project -s ~/www/grav
+
+Creating Directories
+ /cache
+ /logs
+ /images
+ /assets
+ /user/accounts
+ /user/config
+ /user/pages
+ /user/data
+ /user/plugins
+ /user/themes
+
+Resetting Symbolic Links
+ /index.php -> /Users/rhuk/www/grav/index.php
+ /composer.json -> /Users/rhuk/www/grav/composer.json
+ /bin -> /Users/rhuk/www/grav/bin
+ /system -> /Users/rhuk/www/grav/system
+
+Pages Initializing
+ /Users/rhuk/Projects/Grav/grav/user/pages -> Created
+
+File Initializing
+ /.dependencies -> Created
+ /.htaccess -> Created
+ /user/config/site.yaml -> Created
+ /user/config/system.yaml -> Created
+
+Permissions Initializing
+ bin/grav permissions reset to 755
+
+read local config from /Users/rhuk/.grav/config
+
+Symlinking Bits
+===============
+
+SUCCESS symlinked grav-plugin-problems -> user/plugins/problems
+
+SUCCESS symlinked grav-plugin-error -> user/plugins/error
+
+SUCCESS symlinked grav-theme-antimatter -> user/themes/antimatter
+
Как видите, было создано несколько каталогов по умолчанию, а также была создана исходная папка pages
. После того, как база была настроена, другие зависимости символически связываются.
Вы должны указать в своем браузере http://localhost/grav
и увидеть только что созданный тестовый сайт. Теперь любые изменения, внесенные вами в папку ~/www/grav
, будут готовы к фиксации и отправке в ваши клонированные репозитории.
Люди уходят, а пользовательский контент, такой как плагины и темы, может быть заброшен. Если вы хотите взять на себя обслуживание существующей темы или плагина, вы должны следовать этому протоколу:
[change-resource] Take over plugin/theme
См. ЧаВо по админке, чтобы узнать, как управлять пользователями
По умолчанию Grav не предоставляет никаких групп. Вам нужно их определить.
Группы определены в файле user/config/groups.yaml
. Если этот файл ещё не существует, создайте его.
Вот пример определения группы пользователей:
registered:
+ icon: users
+ readableName: 'Registered Users'
+ description: 'The group of registered users'
+ access:
+ site:
+ login: true
+paid:
+ readableName: 'Paid Members'
+ description: 'The group of paid members'
+ icon: money
+ access:
+ site:
+ login: true
+ paid: true
+administrators:
+ groupname: administrators
+ readableName: Administrators
+ description: 'The group of administrators'
+ icon: child
+ access:
+ admin:
+ login: true
+ site:
+ login: true
+
Здесь мы определяем 3 группы.
Каждого пользователя можно назначить в группу.
Просто добавьте
в файл yaml пользователя в папке user/accounts
.
Вы можете добавить несколько групп:
Вы также можете редактировать информацию о группе пользователя с помощью подключаемого модуля администратора.
Пользователи, назначенные группе, наследуют разрешения группы. Например, вы можете определить группу с разрешением site.paid
, добавив:
к определению группы в user/config/groups.yaml
.
Когда пользователь попадает в эту группу, он наследует разрешение site.paid: true
.
Когда пользователь принадлежит к нескольким группам, достаточно, чтобы группа предоставила разрешение, и оно будет добавлено к разрешениям пользователя.
Вы, как обычно, можете точно настроить разрешения на уровне пользователя. С помощью групп вы можете определить глобальное разрешение и запретить его на уровне пользователя, добавив
в файл user.yaml
.
См. ЧаВо по админке, чтобы узнать больше о доступных уровнях доступа
В Grav есть поддержка нескольких сайтов. Однако плагин админки по-прежнему нуждается в обновлении для полной поддержки многосайтовых конфигураций. Мы продолжим работать над этим в следующих выпусках Grav.
Многосайтовая установка позволяет вам создавать и управлять сетью из нескольких веб-сайтов, работающих на одной установке.
Grav имеет встроенную поддержку нескольких сайтов. В отличие от автоматической конфигурации среды, которая позволяет вам определять пользовательские среды для поддержки различных конфигураций и сценариев, многосайтовая настройка дает вам возможность изменять способ и откуда Grav загружает все свои файлы.
Полная мультисайтовая настройка дает вам возможность изменить способ, как и откуда Grav загружает все свои файлы.
Самое главное, что вам понадобится для работы в многосайтовой сети Grav — это хороший хостинг веб-сайтов. Если вы не планируете создавать много сайтов и не ожидаете большого количества посетителей, то вы можете обойтись виртуальным хостингом. Однако из-за природы мультисайтов вам, вероятно, понадобится VPS или выделенный сервер по мере роста ваших сайтов.
Перед тем, как начать, вы должны убедиться, что ваш веб-сервер поддерживает работу нескольких веб-сайтов, т. е. у вас есть доступ к корневому каталогу Grav.
Это важно, поскольку обслуживание нескольких веб-сайтов из одной и той же установки основано на файле setup.php
, расположенном в вашем корне Grav.
После создания setup.php
вызывается каждый раз, когда пользователь запрашивает страницу. Чтобы обслуживать несколько веб-сайтов из одной установки, этот сценарий (грубо говоря) должен сообщать Grav, где находятся файлы (для конфигураций, тем, плагинов, страниц и т. д.) Для определенного дочернего сайта.
Приведенные ниже фрагменты настраивают вашу установку Grav таким образом, чтобы запрос вроде
илибудет использовать каталог user/env
в качестве базового пути для «user» вместо каталога user
.
Если вы выбираете подкаталоги или URL-адреса на основе пути для дочерних сайтов, то единственное, что вам нужно, это создать каталог для каждого дочернего сайта в каталоге user/env
, содержащий как минимум необходимые папки config
, pages
, plugins
и themes
.
Если вы выберете субдомены для структурирования сети своего веб-сайта, вам придется настроить (подстановочные) субдомены на своем сервере в дополнение к настройке ваших дочерних сайтов в каталоге user/env
.
В любом случае, решите, какая установка вам больше подходит.
Для дочерних сайтов, доступных через поддомены, скопируйте файл setup_subdomain.php
, в противном случае для дочерних сайтов, доступных через подкаталоги, файл setup_subdirectory.php
в ваш setup.php
.
Файл setup.php
должен быть помещен в корневую папку Grav, ту же папку, где вы можете найти index.php
, README.md
и другие файлы Grav.
<?php
+/**
+ * Multisite setup for subsites accessible via sub-domains.
+ *
+ * DO NOT EDIT UNLESS YOU KNOW WHAT YOU ARE DOING!
+ */
+
+use Grav\Common\Utils;
+
+// Get subsite name from sub-domain
+$environment = isset($_SERVER['HTTP_HOST'])
+ ? $_SERVER['HTTP_HOST']
+ : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost');
+// Remove port from HTTP_HOST generated $environment
+$environment = strtolower(Utils::substrToString($environment, ':'));
+$folder = "env/{$environment}";
+
+if ($environment === 'localhost' || !is_dir(ROOT_DIR . "user/{$folder}")) {
+ return [];
+}
+
+return [
+ 'environment' => $environment,
+ 'streams' => [
+ 'schemes' => [
+ 'user' => [
+ 'type' => 'ReadOnlyStream',
+ 'prefixes' => [
+ '' => ["user/{$folder}"],
+ ]
+ ]
+ ]
+ ]
+];
+
setup_subdirectory.php:
<?php
+/**
+ * Multisite setup for sub-directories or path based
+ * URLs for subsites.
+ *
+ * DO NOT EDIT UNLESS YOU KNOW WHAT YOU ARE DOING!
+ */
+
+use Grav\Common\Filesystem\Folder;
+
+// Get relative path from Grav root.
+$path = isset($_SERVER['PATH_INFO'])
+ ? $_SERVER['PATH_INFO']
+ : Folder::getRelativePath($_SERVER['REQUEST_URI'], ROOT_DIR);
+
+// Extract name of subsite from path
+$name = Folder::shift($path);
+$folder = "env/{$name}";
+$prefix = "/{$name}";
+
+if (!$name || !is_dir(ROOT_DIR . "user/{$folder}")) {
+ return [];
+}
+
+// Prefix all pages with the name of the subsite
+$container['pages']->base($prefix);
+
+return [
+ 'environment' => $name,
+ 'streams' => [
+ 'schemes' => [
+ 'user' => [
+ 'type' => 'ReadOnlyStream',
+ 'prefixes' => [
+ '' => ["user/{$folder}"],
+ ]
+ ]
+ ]
+ ]
+];
+
При использовании подкаталогов для переключения языковых контекстов вам может потребоваться загружать различные конфигурации в зависимости от языка. Вы можете поместить свои языковые конфигурации в config/<lang-context>/site.yaml
, используя пример для setup_subdir_config_switch.php
ниже. Таким образом yoursite.com/de-AT/index.html
будет загружать config/de-AT/site.yaml
, yoursite.com/de-CH/index.html
будет загружать config/de-CH/site.yaml
и так далее.
setup_subdir_config_switch.php:
<?php
+/**
+ * Switch config based on the language context subdir
+ *
+ * DO NOT EDIT UNLESS YOU KNOW WHAT YOU ARE DOING!
+ */
+
+use Grav\Common\Filesystem\Folder;
+
+$languageContexts = [
+ 'de-AT',
+ 'de-CH',
+ 'de-DE',
+];
+
+// Get relative path from Grav root.
+$path = isset($_SERVER['PATH_INFO'])
+ ? $_SERVER['PATH_INFO']
+ : Folder::getRelativePath($_SERVER['REQUEST_URI'], ROOT_DIR);
+
+// Extract name of subdir from path
+$name = Folder::shift($path);
+
+if (in_array($name, $languageContexts)) {
+ return [
+ 'streams' => [
+ 'schemes' => [
+ 'config' => [
+ 'type' => 'ReadOnlyStream',
+ 'prefixes' => [
+ '' => [
+ 'environment://config',
+ 'user://config/' . $name,
+ 'user://config',
+ 'system/config',
+ ],
+ ],
+ ],
+ ],
+ ],
+ ];
+}
+
+return [];
+
Если вам необходимо управлять плагинами и темами ваших подсайтов с помощью GPM, храните user/themes
и user/plugins
, чтобы GPM получал и обновлял их в одном месте. Затем создайте символические ссылки на user/env/my.site.com/themes
или user/env/my.site.com/plugins
. Затем настройте отдельные yaml-конфигурации user/env/my.site.com/config/plugins
для каждого подсайта.
После создания setup.php
получите доступ к двум важным переменным: (i) $container
, который является ещё не инициализированным должным образом экземпляр Grav и (ii) $self
, который является экземпляром класса ConfigServiceProvider.
Внутри этого скрипта вы можете делать что угодно, но имейте в виду, что файл setup.php
вызывается каждый раз, когда пользователь запрашивает страницу. Это означает, что критические для памяти или требующие много времени операции инициализации приводят к замедлению работы всей системы, и поэтому их следует избегать.
В конце концов, setup.php
должен возвращать ассоциативный массив с необязательным именем среды environment и коллекцией потоков streams (подробнее и о том, как правильно их настроить, см. раздел Потоки):
<?php
+
+return [
+ 'environment' => '<name>', // Название окружения
+ 'streams' => [
+ 'schemes' => [
+ '<stream_name>' => [ // Название потока
+ 'type' => 'ReadOnlyStream', // Объект потока, например: 'ReadOnlyStream' или 'Stream'
+ 'prefixes' => [
+ '<prefix>' => [
+ '<path1>',
+ '<path2>',
+ '<etc>'
+ ]
+ ],
+ 'paths' => [ // Пути (не обязательно)
+ '<paths1>',
+ '<paths2>',
+ '<etc>'
+ ]
+ ]
+ ]
+ ]
+]
+
Имейте в виду, что на этом очень раннем этапе у вас нет доступа к конфигурации или экземпляру URI, и поэтому любой вызов неинициализированного класса может закончиться зависанием системы, неожиданными ошибками или (полной) потерей данных.
Grav использует URI-подобные потоки для определения всех путей к файлам в Grav. Использование потоков позволяет очень легко настроить пути поиска для любого файла.
По умолчанию потоки были настроены следующим образом:
user://
- папка пользователя, например user/
page://
- папка страниц, например user://pages/
image://
- папка изображений, например user://images/
, system://images/
account://
- папка учётных записей, например user://accounts/
environment://
- текущее местоположение нескольких сайтов.asset://
- папка скомпилированных активов JS/CSS, например assets/
blueprints://
- папка чертежей, например environment://blueprints/
, user://blueprints/
, system://blueprints/
config://
- папка конфигураций, например environment://config/
, user://config/
, system://config/
plugins://
- папка плагинов, например user://plugins/
themes://
- папка тем, например user://themes/
theme://
- папка текущей темы, например themes://antimatter/
languages://
- папка языков, например environment://languages/
, user://languages/
, system://languages/
user-data://
- папка данных, например user/data/
system://
- папка файлов движка, например system/
cache://
- папка кэша, например cache/
, images/
log://
- папка логов, например logs/
backup://
- папка резервных копий, например backups/
tmp://
- папка временных файлов, например tmp/
При настройке нескольких сайтов некоторые из этих параметров по умолчанию могут быть не теми, которые вам нужны. Grav обеспечивает простой способ, чтобы настроить потоки от конфигурации среды, используя config/streams.yaml
. Кроме того, вы можете создавать и использовать свои собственные потоки, когда это необходимо.
Сопоставление физических каталогов с логическим устройством может быть выполнено путем настройки префиксов. Вот пример, где мы отделяем страницы, изображения, учетные записи, данные, кэш и журналы от остальных сайтов, но заставляем все остальное искать в местоположении по умолчанию:
user/env/domain.com/config/streams.yaml
:
schemes:
+ account:
+ type: ReadOnlyStream
+ prefixes:
+ '': ['environment://accounts']
+ page:
+ type: ReadOnlyStream
+ prefixes:
+ '': ['environment://user']
+ image:
+ type: Stream
+ prefixes:
+ '': ['environment://images', 'system://images/']
+ 'user-data':
+ type: Stream
+ prefixes:
+ '': ['environment://data']
+ cache:
+ type: Stream
+ prefixes:
+ '': ['cache/domain.com']
+ images: ['images/domain.com']
+ log:
+ type: Stream
+ prefixes:
+ '': ['logs/domain.com']
+
In Grav streams are objects, mapping a set of physical directories of the system to a logical device. They are classified via their type
attribute. For read-only streams that's the ReadOnlyStream
type and for read-writeable streams that's the Stream
type.
For example, if you use image://mountain.jpg
stream, Grav looks up environment://images
(user/env/domain.com/images
) and system://images
(system/images
). This means that streams can be used to define other streams.
Prefixes allows you to combine several physical paths into one logical stream. If you look carefully at cache
stream definition, it is a bit different. In this case cache://
resolves to cache
, but cache://images
resolves to images
.
Grav 1.7 добавляет поддержку настройки начальной среды из конфигурации вашего сервера.
Эта функция удобна, если вы хотите использовать, например, контейнеры docker и хотите сделать их независимыми от домена, который вы используете. Или если вы не хотите хранить секреты в конфигурации, но хранить их в настройках Вашего сервера.
Следующие переменные среды можно использовать для настройки путей по умолчанию, которые Grav использует для настройки среды. После инициализации потоки могут указывать на другое местоположение.
Вы можете использовать либо переменные среды, либо константы PHP, но они должны быть установлены перед запуском Grav.
Переменная | Значение по умолчанию | Описание |
---|---|---|
GRAV_SETUP_PATH | AUTO DETECT | Пользовательский путь к setup.php , включая имя файла. По умолчанию Grav просматривает файл из GRAV_ROOT/setup.php и GRAV_ROOT/GRAV_USER_PATH/setup.php . |
GRAV_USER_PATH | user | Относительный путь для потока user:// . |
GRAV_CACHE_PATH | cache | Относительный путь для потока cache:// . |
GRAV_LOG_PATH | logs | Относительный путь для потока log:// . |
GRAV_TMP_PATH | tmp | Относительный путь для потока tmp:// . |
GRAV_BACKUP_PATH | backup | Относительный путь для потока backup:// . |
Кроме того, есть переменные для настройки окружения. Лучшую документацию по ним можно найти в разделе Конфигурация среды на основе сервера.
Они также работают из файла setup.php
. Вы можете сделать их константами, используя define()
, или переменные среды с putenv()
. Константы предпочтительнее переменных среды.
Переменная | Значение по умолчанию | Описание |
---|---|---|
GRAV_ENVIRONMENT | DOMAIN NAME | Имя среды. Может использоваться, например, в контейнерах докеров для установки настраиваемой среды, которая не зависит от имени домена, например production и develop . |
GRAV_ENVIRONMENTS_PATH | user://env | Путь поиска для всех сред, если вы предпочитаете что-то вроде user://sites . Может быть потоком или относительным путем от GRAV_ROOT . |
GRAV_ENVIRONMENT_PATH | user://env/ENVIRONMENT | Иногда может быть полезно указать настраиваемое местоположение для вашей среды. |
Если вы не хотите хранить секретные учетные данные внутри конфигурации, вы также можете предоставить их, используя переменные среды с вашего сервера.
Поскольку переменные среды имеют строгие требования к именованию (они могут содержать только A-Z, a-z, 0-9 и _), необходимы некоторые уловки, чтобы заставить работать переопределения конфигурации.
Вот пример простого переопределения конфигурации с использованием формата YAML для презентации:
GRAV_CONFIG: true # If false, the configuration here will be ignored.
+GRAV_CONFIG_ALIAS__GITHUB: plugins.github # Create alias GITHUB='plugins.github' to shorten the variable names below
+GRAV_CONFIG__GITHUB__auth__method: api # Override config.plugins.github.auth.method = api
+GRAV_CONFIG__GITHUB__auth__token: xxxxxxxx # Override config.plugins.github.auth.token = xxxxxxxx
+
В приведенном выше примере __
(двойное подчеркивание) представляет вложенную переменную, которая в Twig представлена с помощью точки (.
).
Вы также можете использовать переменные среды в setup.php
. Это позволяет, например, хранить секреты вне конфигурации:
user/setup.php
:
<?php
+
+// Use following environment variables in your server configuration:
+//
+// DYNAMODB_SESSION_KEY: DynamoDb server key for the PHP session storage
+// DYNAMODB_SESSION_SECRET: DynamoDb server secret
+// DYNAMODB_SESSION_REGION: DynamoDb server region
+// GOOGLE_MAPS_KEY: Google Maps secret key
+
+return [
+ 'plugins' => [
+ // This plugin does not exist
+ 'dynamodb_session' => [
+ 'credentials' => [
+ 'key' => getenv('DYNAMODB_SESSION_KEY') ?: null,
+ 'secret' => getenv('DYNAMODB_SESSION_SECRET') ?: null
+ ],
+ 'region' => getenv('DYNAMODB_SESSION_REGION') ?: null
+ ],
+ // This plugin does not exist
+ 'google_maps' => [
+ 'key' => getenv('GOOGLE_MAPS_KEY') ?: null
+ ]
+ ]
+];
+
setup.php
используется для установки начальной конфигурации. Если плагин или ваша конфигурация позже переопределят эти настройки, исходные значения будут потеряны.
После определения переменных в setup.php
вы можете установить их на своем сервере:
<VirtualHost 127.0.0.1:80>
+ ...
+
+ SetEnv GRAV_SETUP_PATH user/setup.php
+ SetEnv GRAV_ENVIRONMENT production
+ SetEnv DYNAMODB_SESSION_KEY JBGARDQ06UNJV00DL0R9
+ SetEnv DYNAMODB_SESSION_SECRET CVjwH+QkfnPhKgVvJvrG24s0ABi343cJ7WTPxvb7
+ SetEnv DYNAMODB_SESSION_REGION us-east-1
+ SetEnv GOOGLE_MAPS_KEY XWIozB2R2GmYInTqZ6jnKuUrdELounUb4BIxYmp
+</VirtualHost>
+
location / {
+ ...
+
+ fastcgi_param GRAV_SETUP_PATH user/setup.php;
+ fastcgi_param GRAV_ENVIRONMENT production;
+ fastcgi_param DYNAMODB_SESSION_KEY JBGARDQ06UNJV00DL0R9;
+ fastcgi_param DYNAMODB_SESSION_SECRET CVjwH+QkfnPhKgVvJvrG24s0ABi343cJ7WTPxvb7;
+ fastcgi_param DYNAMODB_SESSION_REGION us-east-1;
+ fastcgi_param GOOGLE_MAPS_KEY XWIozB2R2GmYInTqZ6jnKuUrdELounUb4BIxYmp;
+}
+
location / {
+ ...
+
+ env[GRAV_SETUP_PATH] = user/setup.php
+ env[GRAV_ENVIRONMENT] = production
+ env[DYNAMODB_SESSION_KEY] = JBGARDQ06UNJV00DL0R9
+ env[DYNAMODB_SESSION_SECRET] = CVjwH+QkfnPhKgVvJvrG24s0ABi343cJ7WTPxvb7
+ env[GDYNAMODB_SESSION_REGION] = us-east-1
+ env[GGOOGLE_MAPS_KEY] = XWIozB2R2GmYInTqZ6jnKuUrdELounUb4BIxYmp
+}
+
web:
+environment:
+ - GRAV_SETUP_PATH=user/setup.php
+ - GRAV_ENVIRONMENT=production
+ - DYNAMODB_SESSION_KEY=JBGARDQ06UNJV00DL0R9
+ - DYNAMODB_SESSION_SECRET=CVjwH+QkfnPhKgVvJvrG24s0ABi343cJ7WTPxvb7
+ - DYNAMODB_SESSION_REGION=us-east-1
+ - GOOGLE_MAPS_KEY=XWIozB2R2GmYInTqZ6jnKuUrdELounUb4BIxYmp
+
<?php
+putenv('GRAV_SETUP_PATH', 'user/setup.php');
+putenv('GRAV_ENVIRONMENT', 'production');
+putenv('DYNAMODB_SESSION_KEY', 'JBGARDQ06UNJV00DL0R9');
+putenv('DYNAMODB_SESSION_SECRET', 'CVjwH+QkfnPhKgVvJvrG24s0ABi343cJ7WTPxvb7');
+putenv('DYNAMODB_SESSION_REGION', 'us-east-1');
+putenv('GOOGLE_MAPS_KEY', 'XWIozB2R2GmYInTqZ6jnKuUrdELounUb4BIxYmp');
+
В этом примере сервер также будет использовать среду production
, хранящуюся в папке user/env/production
.
Одна из основных характеристик, которые делают Grav настолько привлекательным — это её скорость. Это всегда было ключевым моментом в конструкции Grav, и в первую очередь это связано с кэшированием, но включает несколько других компонентов.
Getgrav.org работает на одном выделенном сервере с четырехъядерными процессорами, 16 ГБ памяти и твердотельными накопителями объёмом 6 ГБ. Мы также запускаем PHP 7.4 с Zend opcache и пользовательским кэшем APCu. На веб-серверах работает несколько других веб-сайтов, но не так много, как в среде общего хостинга.
Кэширование - это неотъемлемая функция Grav, которая заложена с самого начала. Механизм кэширования, который использует Grav, является основной причиной того, что Grav работает так быстро. Тем не менее, необходимо учитывать некоторые факторы.
Grav использует хорошо зарекомендовавшую себя библиотеку Doctrine Cache. Это означает, что Grav поддерживает любой механизм кэширования, поддерживаемый Doctrine Cache:
cache/
По умолчанию Grav предварительно настроен на использование параметра «auto». Сначала идет попытка обнаружения APC, затем WinCache, затем XCache и, наконец, File. Вы, конечно, можете явно настроить кэш в вашем файле user/config/system.yaml
, что может немного ускорить работу.
На самом деле в Grav существует 5 типов кэширования:
Кэширование конфигурации YAML не настраивается и всегда будет компилировать и кэшировать конфигурацию в папку /cache
. Кэширование изображений также всегда включено и сохраняет обработанные изображения в папке /images
.
Кэширование ядра Grav имеет следующие параметры конфигурации, настроенные в вашем файле user/config/system.yaml
:
cache:
+ enabled: true # Установите значение `true`, чтобы включить кэширование
+ check:
+ method: file # Метод проверки обновлений на страницах: file|folder|hash|none
+ driver: auto # Один из: auto|file|apc|xcache|memcache|wincache|redis
+ prefix: 'g' # Строка префикса кэша (предотвращает конфликты)
+
Как видите, параметры задокументированы в самом файле конфигурации. Во время разработки иногда бывает полезно отключить кэширование, чтобы всегда иметь последние правки страниц.
По умолчанию Grav использует метод проверки файлов для кэширования. Это означает, что каждый раз, когда вы запрашиваете URL Grav, Grav использует оптимизированную маршрутизацию для прохождения всех файлов в папке user/pages
, чтобы определить, изменилось ли что-нибудь.
Проверка кэша папок будет немного быстрее, чем проверка файлов, но не будет работать надежно во всех средах. Вам нужно будет проверить, улавливает ли Grav изменения страниц на вашем сервере при использовании опции folder
.
Проверка хеширования (hash
) использует алгоритм быстрого хеширования для всех файлов в каждой папке страницы. В некоторых ситуациях это может быть быстрее, чем проверка файлов, и в нем учитываются все файлы в папке.
Если автоматическое повторное кэширование измененных страниц не критично для вас (или если ваш сайт довольно большой), то установка этого значения на none
ещё больше ускорит производственную среду. Вам просто нужно будет вручную очистить кэш после внесения изменений. Это предназначено для параметра Production-only.
Удаление страницы не очищает кэш, так как очистка кэша основана на метках времени изменения папок.
Вы можете легко принудительно очистить кэш, просто сохранив файл конфигурации.
Есть некоторые дополнительные параметры конфигурации, которые требуются, если вы подключаетесь к серверу memcache через параметр драйвера memcache. Эти параметры должны находиться в группе cache:
в вашем user/config/system.yaml
:
Подобно memcache, memcached имеет некоторые дополнительные параметры конфигурации, которые требуются, если вы подключаетесь к серверу memcached через параметр драйвера memcached. Эти параметры должны находиться в группе cache:
в вашем user/config/system.yaml
:
Есть некоторые дополнительные параметры конфигурации, которые необходимы, если вы подключаетесь к серверу redis через параметр драйвера redis
. Эти параметры должны находиться в группе cache:
в вашем user/config/system.yaml
:
В качестве альтернативы вы можете использовать соединение через сокет:
Если ваш сервер Redis имеет пароль или секретный ключ, вы также можете установить его в этой конфигурации:
Вам также понадобится php-redis, установленный в вашей системе.
Механизм создания шаблонов Twig использует свою собственную файловую систему кэширования, и с ней связано несколько параметров.
twig:
+ cache: false # Установите значение `true`, чтобы включить кэширование Twig
+ debug: true # Включить отладку Twig
+ auto_reload: true # Обновлять кэш при изменениях
+ autoescape: false # Экранирование переменных Twig
+
Для небольшого увеличения производительности вы можете отключить расширение debug
, а также отключить auto_reload
, которое выполняет функцию, аналогичную cache: check: method: none
, так как оно не будет искать изменения в файлах .html.twig
для запуска обновления кэш.
По большей части, события всё ещё запускаются даже при включенном кэшировании. Это справедливо для всех событий, за исключением onPageContentRaw
, onPageProcessed
, onPageContentProcessed
, onTwigPageVariables
и onFolderProcessed
. Эти события запускаются при рекурсии всех страниц и папок и запускаются на каждой найденной странице или папке. Как следует из их названия, они запускаются только во время обработки, а не после кэширования страницы.
Когда несколько плагинов прослушивают одни и те же перехватчики событий (подробности см. на странице Плагины > Перехватчики событий), различные обработчики выполняются в порядке «приоритета». Приоритет — это просто число. Чем выше число, тем раньше будет выполнен обработчик.
В редких случаях пользователям может потребоваться настроить приоритеты определённых обработчиков. Это можно сделать, не касаясь исходного кода плагина.
Сначала определите, какие обработчики нужно настроить и как. Это сложная задача, требующая, чтобы вы могли читать файл .php
плагина. Обычно перехватчики событий, функции обработчиков и приоритеты по умолчанию можно найти в функции плагина onPluginsInitialized()
.
Затем создайте файл user/config/sizes.yaml
. Данные должны быть структурированы следующим образом:
Так, например, предположим, что у вас есть плагин под названием essential
, который прослушивает событиеonPageInitialized
, вызывая функцию handlePage
с приоритетом 0. Предположим, вы обнаруживаете, что вам нужен этот приоритет, равный 100
. чтобы убедиться, что он запускается перед другим плагином. Вы должны добавить в свой файл user/config/sizes.yaml
следующее:
Планировщик Grav — это новая функция, которая была добавлена в Grav 1.6, которая позволяет запускать задания на периодической основе. Базовая обработка зависит от серверного планировщика cron, но после добавления одной записи в службу cron все задания и определённые расписания могут быть настроены через Grav.
Одним из основных преимуществ использования планировщика для обработки задач является то, что они могут выполняться без какого-либо взаимодействия с пользователем и независимо от внешнего интерфейса. Такие задачи, как периодическая очистка кэша, резервное копирование, синхронизация, поисковое индексирование и т. д., являются основными кандидатами на выполнение запланированных заданий.
Первым шагом на пути к настройке планировщика и его готовности к выполнению задач является добавление команды bin/grav scheduler
в службу cron. Самый простой подход - использовать саму команду CLI для вывода соответствующей команды для запуска для установки:
$ bin/grav scheduler -i
+
+Install Scheduler
+=================
+
+ [ERROR] You still need to set up Grav's Scheduler in your crontab
+
+ ! [NOTE] To install, run the following command from your terminal:
+
+ (crontab -l; echo "* * * * * cd /Users/andym/grav;/usr/local/bin/php bin/grav scheduler 1>> /dev/null 2>&1") | crontab -
+
В системе Mac отображается полная требуемая команда, поэтому всё, что вам нужно сделать, это скопировать и вставить команду в терминал и нажать return.
Вам необходимо войти в оболочку под тем же пользователем, что и ваш веб-сервер. Это необходимо для того, чтобы пользователь, выполняющий команды schdeduler, соответствовал пользователю веб-сервера, которому необходимо взаимодействовать с этими файлами. Если вы устанавливаете запись crontab с другим пользователем (например, root
), любые созданные файлы будут создаваться от имени этого пользователя root
, а не пользователя webserver
, что может привести к проблемам.
(crontab -l; echo "* * * * * cd /Users/andym/grav;/usr/local/bin/php bin/grav scheduler 1>> /dev/null 2>&1") | crontab -
+
Вы не получите ответа, но и ошибок получить не должны. После этого можно убедиться, что всё в порядке, повторно запустив команду bin/grav scheduler -i
:
bin/grav scheduler -i
+
+Install Scheduler
+=================
+
+ [OK] All Ready! You have already set up Grav's Scheduler in your crontab
+
Вы также можете получить необходимую команду из плагина админки, просто перейдя в Инструменты → Планировщик.
Для планирования работы частота контролируется гибким форматом.
* * * * * *
+| | | | | |
+| | | | | +-- Year (диапазон: 1900-3000)
+| | | | +---- Day of the Week (диапазон: 1-7, 1 — понедельник)
+| | | +------ Month of the Year (диапазон: 1-12)
+| | +-------- Day of the Month (диапазон: 1-31)
+| +---------- Hour (диапазон: 0-23)
++------------ Minute (диапазон: 0-59)
+
Некоторые примеры:
0 * * * *
запускать один раз в час (каждый час на нулевой минуте) 0 0 * * *
запускать один раз в день (каждый день в полночь и в нулевую минуту) 0 0 1 * *
запускать один раз в месяц (первого числа каждого месяца в полночь и в нулевую минуту) 0 0 1 1 *
запускать один раз в год (в первый день первого месяца каждого года в полночь и в нулевую минуту)
Расширенные опции:
*/5 * * * *
запускать каждые 5 минут
Вы можете увидеть, какие задания в настоящее время доступны для Планировщика, выполнив команду bin/grav scheduler -j
:
bin/grav scheduler -j
+
+Scheduler Jobs Listing
+======================
+
+┌─────────────────────┬────────────────────────────────────┬───────────┬─────────┬──────────────────┬─────────┐
+│ Job ID │ Command │ Run At │ Status │ Last Run │ State │
+├─────────────────────┼────────────────────────────────────┼───────────┼─────────┼──────────────────┼─────────┤
+│ cache-purge │ Grav\Common\Cache::purgeJob │ * * * * * │ Success │ 2019-02-21 11:23 │ Enabled │
+│ cache-clear │ Grav\Common\Cache::clearJob │ * * * * * │ Success │ 2019-02-21 11:23 │ Enabled │
+│ default-site-backup │ Grav\Common\Backup\Backups::backup │ 0 3 * * * │ Ready │ Never │ Enabled │
+│ pages-backup │ Grav\Common\Backup\Backups::backup │ * 3 * * * │ Success │ 2018-09-20 09:55 │ Enabled │
+│ ls-job │ ls │ * * * * * │ Success │ 2019-02-21 11:23 │ Enabled │
+└─────────────────────┴────────────────────────────────────┴───────────┴─────────┴──────────────────┴─────────┘
+
+ ! [NOTE] For error details run "bin/grav scheduler -d"
+
Планировщик Grav управляется основным файлом конфигурации. Он находится в user/config/scheduler.yaml
, и для его выполнения требуется, чтобы любое задание было enabled
.
Ниже конфигурации показаны доступные задания и разрешено ли им выполнение. Просто установите для записи значение disabled
, чтобы остановить её выполнение.
status:
+ ls-job: enabled
+ cache-purge: enabled
+ cache-clear: enabled
+ default-site-backup: enabled
+ pages-backup: enabled
+
Чтобы увидеть более подробную информацию о любых потенциальных ошибках или увидеть, когда задание будет запущено в следующий раз, вы можете использовать команду /bin/grav scheduler -d
:
bin/grav scheduler -d
+
+Job Details
+===========
+
+┌─────────────────────┬──────────────────┬──────────────────┬────────┐
+│ Job ID │ Last Run │ Next Run │ Errors │
+├─────────────────────┼──────────────────┼──────────────────┼────────┤
+│ cache-purge │ 2019-02-21 11:29 │ 2019-02-21 11:31 │ None │
+│ cache-clear │ 2019-02-21 11:29 │ 2019-02-21 11:31 │ None │
+│ default-site-backup │ Never │ 2019-02-22 03:00 │ None │
+│ pages-backup │ 2018-09-20 09:55 │ 2019-02-22 03:00 │ None │
+│ ls-job │ 2019-02-21 11:29 │ 2019-02-21 11:31 │ None │
+└─────────────────────┴──────────────────┴──────────────────┴────────┘
+
Команда CLI предоставляет простой способ вручную запускать любые задания. Фактически, это то, что планировщик делает, когда он запускается периодически.
Это автоматически запустит задания, но вы также можете увидеть подробности того, что запускается, используя:
Ядро Grav обеспечивает несколько рабочих мест прямо из коробки. К ним относятся некоторые полезные задачи технического обслуживания:
cache-purge
— Эта задача полезна, если вы используете кэширование файлов Grav, поскольку оно удаляет старые файлы, срок действия которых истек. Это отличная задача для планирования, поскольку в противном случае пользователю потребовалось бы вручную очистить старые кэши. Если вы не уследите за этим, а ваше файловое пространство ограничено, у вас может закончиться место и сервер выйдет из строя.
cache-clear
— Очистка кэша — это задание, которое работает так же, как команда bin/grav clear
, которую вы выполняете вручную. Вы можете настроить, хотите ли вы использовать «стандартную» очистку кэша или вариант all
, который удаляет все файлы и папки в папке cache/
для более тщательной очистки кэша.
default-site-backup
— Задание резервного копирования по умолчанию, доступное в новой конфигурации Grav Backup. Вы можете создавать собственные конфигурации резервного копирования, и они также будут доступны для запуска в качестве запланированного задания.
В Grav Scheduler можно вручную настроить любое количество пользовательских заданий. Их можно настроить в том же файле конфигурации scheduler.yaml
, упомянутом выше. Например, указанная выше команда ls-job
может быть настроена:
custom_jobs:
+ ls-job:
+ command: ls
+ args: '-lah'
+ at: '* * * * *'
+ output: logs/cron-ls.out
+ output_mode: overwrite
+ email: user@email.com
+
Командой должен быть любой локальный сценарий, который можно запустить из командной строки/терминала. Требуются только атрибуты command
и at
.
Одна из самых мощных функций Grav Scheduler — это возможность сторонних плагинов создавать собственные задания. Прекрасный пример этого — плагин TNT Search. TNT Search — это полнофункциональная система текстового поиска, которая требует, чтобы контент был проиндексирован, прежде чем его можно будет искать. Это задание индексации может выполняться различными способами, но Grav Scheduler позволяет вам периодически переиндексировать ваш контент, вместо того, чтобы делать это вручную.
Первым делом ваш плагин должен подписаться на событие onSchedulerInitialized()
. А затем создайте метод в своем файле плагина, который может добавлять настраиваемое задание при вызове:
<?php
+
+public function onSchedulerInitialized(Event $e): void
+{
+ $config = $this->config();
+
+ if (!empty($config['scheduled_index']['enabled'])) {
+ $scheduler = $e['scheduler'];
+ $at = $config['scheduled_index']['at'] ?? '* * * * *';
+ $logs = $config['scheduled_index']['logs'] ?? '';
+ $job = $scheduler->addFunction('Grav\Plugin\TNTSearchPlugin::indexJob', [], 'tntsearch-index');
+ $job->at($at);
+ $job->output($logs);
+ $job->backlink('/plugins/tntsearch');
+ }
+}
+
Здесь вы можете увидеть, как некоторая соответствующая конфигурация планировщика получается из настроек конфигурации плагина TNTSearch, а затем создается новое Job
с статической функцией, называемой indexJob()
.
YAML означает YAML Ain't Markup Language, и он широко используется в Grav для его файлов конфигурации, чертежей, а также в настройках страницы.
YAML для конфигурации - это то же самое, что Markdown для разметки. По сути, это формат структурированных данных, удобочитаемый человеком. Он менее сложен и неуклюж, чем XML или JSON, но предоставляет аналогичные возможности. По сути, это позволяет вам предоставлять мощные настройки конфигурации без необходимости изучать более сложный тип кода, такой как CSS, JavaScript и PHP.
YAML построен с нуля, чтобы его было легко использовать. По сути, файл YAML используется для описания данных. Одним из преимуществ использования YAML является то, что информацию в одном файле YAML можно легко перевести на несколько типов языков.
По сути, данные, которые вы вводите в файл YAML, используются вместе с библиотекой для создания страниц, которые вы видите в Grav.
Есть некоторые правила, которые использует YAML, чтобы избежать проблем, связанных с двусмысленностью в отношении различных языков и программ редактирования. Эти правила позволяют интерпретировать один файл YAML согласованно, независимо от того, какое приложение и/или библиотека используются для его интерпретации.
.yaml
, если это возможно в Grav.YAML превосходно работает с сопоставлениями (хешами/словарями), последовательностями (массивами/списками) и скалярами (строками/числами). Хотя его можно использовать с большинством языков программирования, лучше всего он работает с языками, построенными на этих типах структур данных. Сюда входят: PHP, Python, Perl, JavaScript и Ruby.
Скаляры — довольно простое понятие. Это строки и числа, из которых состоят данные на странице. Скаляр может быть логическим свойством, например Yes
, целым числом (числом), например 5
, или строкой текста, например предложением или заголовком вашего веб-сайта.
Скаляры в программировании часто называют переменными. Если бы вы составляли список типов животных, они бы были названы этими животными.
Большинство скаляров не заключены в кавычки, но если вы вводите строку, в которой используются знаки препинания и другие элементы, которые можно спутать с синтаксисом YAML (тире, двоеточия и т. д.), вы можете захотеть заключить эти данные в кавычки, используя одинарные '
или двойные "
кавычки. Двойные кавычки позволяют использовать экранирование для представления символов ASCII и Unicode.
Слова true
, false
, null
, ~
и даты имеют особое значение в YAML. Пожалуйста, укажите их в кавычках, если вы не хотите использовать их в качестве логического типа, типа null или типа datetime. То же самое и с номерами версий, они должны быть заключены в кавычки, чтобы отделить их от значений с плавающей запятой.
Вот простая последовательность, которую вы можете найти в Grav. Это базовый список, в котором каждый элемент находится в отдельной строке с открывающим тире.
Эта последовательность размещает каждый элемент в списке на одном уровне. Если вы хотите создать вложенную последовательность с элементами и подпунктами, вы можете сделать это, поместив один пробел перед каждым тире в подпунктах. YAML использует пробелы, НЕ табуляцию для отступов. Вы можете увидеть пример этого ниже.
Если вы хотите вложить свои последовательности ещё глубже, вам просто нужно добавить больше уровней.
Последовательности могут быть добавлены к другим типам структур данных, таким как сопоставления или скаляры.
Сопоставление дает вам возможность перечислять ключи со значениями. Это полезно в случаях, когда вы назначаете имя или свойство конкретному элементу.
В этом примере значение pets
сопоставляется с ключом animal
. При использовании в сочетании с последовательностью вы можете увидеть, что начинаете составлять список pets
. В следующем примере тире, используемое для обозначения каждого элемента, считается отступом, делая элементы строк дочерними, а линия сопоставления pets
- родительскими.
Для получения дополнительной информации о YAML, включая подробную документацию о том, как это работает, посетите ресурсы, указанные ниже.
{"use strict";/*!
+ * escape-html
+ * Copyright(c) 2012-2013 TJ Holowaychuk
+ * Copyright(c) 2015 Andreas Lubbe
+ * Copyright(c) 2015 Tiancheng "Timothy" Gu
+ * MIT Licensed
+ */var Va=/["'&<>]/;qn.exports=za;function za(e){var t=""+e,r=Va.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i