I have a tag
field inside a structure
field. I’d like to autocomplete this field by querying all of the other pages. I’ve done this successfully many times with tags, but never from inside a structure
field.
locations:
type: structure
fields:
kiez:
type: tags
options: query
query: page.parent.childrenAndDrafts.pluck("kiez", ",", true)
max: 1
This does not work. How do I get the query to look inside the structure field?
I think you need a custom method to achieve this, pluck only works with single value fields or fields with comma etc. separated values.
I tried calling a custom site method which returns an array, but that didn’t work. like query: site.getItems
where getItems
basically is like:
$array = $this->someField()->yaml();
return A::pluck($array, ‚tags‘);
(Strange apostrophes due to me typing on iOS)
Did it much like you described here …
texnixe
December 11, 2020, 3:58pm
4
That should actually work, what is your Kirby version? And what’s in your blueprint?
Well, oddly it does now … Guess it was restarting PHP that must’ve worked
Hi there - thanks for this helpful start! I’m trying to achieve something similar but am struggling to implement.
I have a template called review
with a structured field exhibitions
. One of the yaml fields in the exhibitions structure is venue
.
I would like a custom method that plucks all the values from exhibitions()->toStructure()->venue()
of each page on the site using the review
template.
How would I implement the above with e.g., the following custom site method:
<?php
Kirby::plugin('lettau/custom-site-methods', [
'siteMethods' => [
'venues' => function () {
// custom site method goes here ?
}
]
]);
Solved like this (could be more elegant!):
<?php
Kirby::plugin('lettau/custom-site-methods', [
'siteMethods' => [
'venues' => function () {
// custom site method goes here
$site = kirby()->site();
$array = [];
$reviews = $site->find('reviews')->children()->listed()->flip();
// exhibitions yaml
foreach ($reviews as $review) {
$exhibitions = $review->exhibitions()->yaml();
$venues = A::pluck($exhibitions, 'venue');
$list = implode(', ', $venues);
array_push($array, $list);
}
$array = array_filter($array);
$array = implode(', ', $array);
$array = explode(', ', $array);
$array = array_unique($array);
sort($array);
return $array;
}
]
]);
See this thread how to collect these items into a structure instead: Difficulty merging structures into a collection - #11 by texnixe