I have a structure field in site.yml, and a selection option on a page using the select-a-structure plugin.
How can I fetch the fields of the selected option in the page template?
I have a structure field in site.yml, and a selection option on a page using the select-a-structure plugin.
How can I fetch the fields of the selected option in the page template?
Should be something like
$selectedOption = $page->{$field}(); // replace $field with the name of your select field
$structureField = $site->{$nameOfStructurefield}()->structure(); // replace $nameOfStructurefield with the name of the structure field you queried in the select. field
$optionKey = 'name of the field you use in the selectfield as optionkey';
$selectedField = $structureField->findBy($optionKey, $selectedOption);
dump($selectedField)
I get an error: ‘Method name must be a string’
where?
Please post complete code indicating in which line the error occurs.
Ok, this is the structure field to add ads or banners on site.yml:
ads:
label: Ads
type: structure
entry: >
{{title}}
fields:
title:
label: Title
type: text
code:
label: Code
type: textarea
And this is the code to select them on article.yml :
ad:
label: Select Ad
type: selectastructure
structurepage: /
structurefield: ads
optionkey: title
and I need to show the code field of the selected ad on the article template.
That doesn’t answer my question: Where does the error occur? Please post your template code where the error happens indicating the line where it is thrown.
Yes, in the first line:
$adSelected = $page->{$ad}();
Well, your field is called ad
not $ad
, so
$adSelected = $page->ad();
I used variables because you didn’t provide the information of what your fields were called. Was assuming that you know how to call a page field.
Yes, it seemed strange to me, but I thought maybe it was another way to do it. I saw that my first message wasn’t clear enough and for this reason I added the rest of the code.
Now, the message doesn’t appear but I still wonder how to fetch the code field.
<?php
$adSelected = $page->ad()->value();
$structureField = $site->ads()->structure();
$optionKey = 'title';
$selectedField = $structureField->findBy($optionKey, $adSelected);
echo $selectedField;
?>
You can’t echo $selectedField
because it is an item from a structurefield, so as if you were looping through a structurefield, you have to call the separate fields within that field:
echo $selectedField->title();
echo $selectedField->code();
If unsure what you have, always do a dump to see what you got:
dump($selectedField)
will show you that it is an object you usually can’t just echo…
You can of course use a variable as a field name, but when using variables, they have to be defined in advance. And in the case of using a variable for fieldnames, the variable must contain a string.
Ok. But something is wrong because I get this error:
‘Call to a member function code() on null.’
On line:
echo $selectedField->code();
Then $selectedField doesn’t seem to contain anything, which will be the case if the entry doesn’t exist. Are you calling this within a loop? Of course, you should always check if the object exists, so
if($selectedField) {
echo $selectedField->code();
}
If I do a dump, as you suggested, I can see the fields:
Structure Object
(
[0] => Structure Object
(
[title] => Field Object
(
[page] =>
[key] => title
[value] => Amazon Banner
)
[code] => Field Object
(
[page] =>
[key] => code
[value] => Text
)
)
[1] => Structure Object
(
[title] => Field Object
(
[page] =>
[key] => title
[value] => Google Ad
)
[code] => Field Object
(
[page] =>
[key] => code
[value] => Google Ad code
)
)
)
I don’t use a loop, I use the code as appears above.
Hm, why is your field part of an array? That seems strange… Or where does the [0] key come from?
I don’t know, it’s the first time I use this plugin.
I edited the dump and you can see the full code.
Ok, your dump returns a collection of structure items, which is weird, because findBy only returns a single entry, not the complete structure field. Sure you are dumping the right element here?
I suggest you check your code again.
The solution I offered in my first post above is correct and should work as expected.
I’m dumping the structure field, as you suggested before, to check that the fields exist.
Ok, I will try again later.
Thank you
I wanted you to dump the result of the findBy query, because that didn’t seem to yield any results, hence the call on code()
didn’t work.