Можно ли получить доступ к заголовкам с другой страницы в форме схемы элементов Grav CMS

#forms #dropdown #blueprint #grav

#формы #выпадающий список #чертеж #grav

Вопрос:

Я создаю шаблон с пользовательскими формами создания страниц. на странице B у меня в настоящее время есть текстовое поле, в котором пользователь вводит название своего учреждения, а затем раскрывающийся список, в котором они могут выбрать логотип для учреждения.

СТРАНИЦА B:

 .logo:
   type: filepicker
   folder: 'user/pages/01.home/04._affiliates/'
   label: Select a logo for the institution
   preview_images: true
   accept:
     - .svg
  

Эти логотипы находятся на другой странице, загруженной в header.media_order

Однако на странице A у меня есть настраиваемые поля следующего формата:

СТРАНИЦА A: формат настраиваемых полей

В идеале я хотел бы иметь один выпадающий список на странице B, где пользователь может выбрать учреждение header.associations на user/pages/01.home/04._affiliates/ странице (страница A) и оттуда получить доступ к названию и логотипу SVG в шаблоне twig страницы B.

SelectUnique предоставляет выпадающий список, но документации по нему практически нет, поэтому я не знаю, возможно ли получить доступ к таким данным. Возможно ли это вообще?

Ответ №1:

Я не знаю, является ли это «правильным» способом выполнения действий. Тем не менее, это было решение, которое я придумал:

Я использовал созданный пользовательский плагин, вызываемый ListInstitutes с list() помощью функции. Вот код:

РЕДАКТИРОВАТЬ: код обновлен, чтобы отразить комментарии @passerby

 <?php
namespace GravPlugin;
use GravCommonGrav;
use GravCommonPlugin;
use RocketThemeToolboxEventEvent;


class ListInstitutes extends Plugin
{
    
    public static function list()
    {
        $out_array = array();

        //get static access to Grav page instance 
        $page = Grav::instance()['page'];
    
        //get the affiliates page
        $affiliates = $page->find("/home/_affiliates");

        //get the uri prefix for associated media 
        $media_uri = "/" . str_replace("://", "/", $affiliates->getMediaUri()) . "/";
    
        //get the headers for the affiliates page
        $header = $affiliates->header();
    
        //get the associations from the headers 
        $associations = $header->associations;
    
        foreach($associations as $association){
            $out_array[$media_uri . $association["logo"]."||".$association["institution"]] = $association["institution"];
        }  
        return $out_array;
    }
}
  

Затем я создал это поле в своем проекте:

 header.affil:
    type: select
    label: Institute
    size: medium
    classes: fancy
    data-options@: 'GravPluginListInstitutes::list'
    default: ''
    options:
       '': 'Select'
  

Сделав это, я смог извлечь логотипы из заголовков на другой странице, а затем заполнить выпадающий список на новой странице. Было бы неплохо, если бы это поддерживалось так же, как filepicker, но это работает.

Комментарии:

1. Немного более «правильным» было бы следовать стандартному способу создания плагинов Grav. Смотрите Плагин devtools ( github.com/getgrav/grav-plugin-devtools ) и создайте плагин с помощью $ bin/plugin devtools newplugin . Кроме того, не должен ли метод PHP list быть static ?

2. Я полагаю, вам нужно сохранить значение .affil в заголовке страницы, если это так, его имя поля должно быть header.affil

3. $media_uri нигде не используется.

4. Я обновил приведенный выше код, чтобы отразить ваши изменения. Список был статическим, затем я удалил его для тестирования чего-то другого, но это не влияет на него. Однако вы правы, он ДОЛЖЕН быть статичным, поэтому я изменился. Предполагалось использовать $ media_uri. Требуется ли включение заголовка для каждого поля, на практике я нахожу его необходимым только для первого объявленного поля, тогда .affil работает после этого (хотя это плохая практика)? Спасибо за ваш отзыв. Я снова создам плагин, используя devtools в соответствии с документацией.

5. Да, вам нужно GravCommonPagePage->header() будет получить / установить весь объект заголовка (см. learn.getgrav.org/16/api#class-gravcommonpagepage ). Я думаю, вы можете пометить свой ответ как «решение»…