#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 у меня есть настраиваемые поля следующего формата:
В идеале я хотел бы иметь один выпадающий список на странице 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
. Кроме того, не должен ли метод PHPlist
бытьstatic
?2. Я полагаю, вам нужно сохранить значение
.affil
в заголовке страницы, если это так, его имя поля должно бытьheader.affil
3.
$media_uri
нигде не используется.4. Я обновил приведенный выше код, чтобы отразить ваши изменения. Список был статическим, затем я удалил его для тестирования чего-то другого, но это не влияет на него. Однако вы правы, он ДОЛЖЕН быть статичным, поэтому я изменился. Предполагалось использовать $ media_uri. Требуется ли включение заголовка для каждого поля, на практике я нахожу его необходимым только для первого объявленного поля, тогда .affil работает после этого (хотя это плохая практика)? Спасибо за ваш отзыв. Я снова создам плагин, используя devtools в соответствии с документацией.
5. Да, вам нужно
GravCommonPagePage->header()
будет получить / установить весь объект заголовка (см. learn.getgrav.org/16/api#class-gravcommonpagepage ). Я думаю, вы можете пометить свой ответ как «решение»…