The title, basically. I know I can pass variables to the snippet, but can I get anything out of it?
What is your use case?
The snippet finds a specific page within the $site
and uses it to generate some content. I want to export a reference to that page so I can use it outside the snippet as well.
I know that the logical thing is to find the page outside the snippet and then pass it inside as a variable. However, the page-finding logic is related to the snippet logic itself and doesn’t change based on what’s outside the snippet.
You could use global variables but I’m not so sure that’s a good idea.
Or you can outsource the page finding logic to a function, then use the same function in the template (won’t work if you need to pass parameters that are only known in the snippet).
I’d probably use a controller (or if you need the snippet in multiple controllers, a shared controller) for the logic and then pass the value to the snippet.
If the snippet is not used across different templates, I’d use a controller as suggested by Sonja. Otherwise, I’d use the new shared collection.
i solved something similar in making the snippet either echo regular logic or make it return a json string. it could be optimized in concatting all echos but i often use html mixed with php my snippets so i never did that.
mysnippet.php
$pageid = doFindPage(); // your logic
if (isset($export) && $export === true):
echo json_encode(compact($pageid)); // ['pageid' => $pageid]
else: ?>
<!-- do regular echo stuff in html -->
<?php endif;
mytemplate.php
snippet('mysnippet', $configArray); // echo regular snippet or...
// ... get pageid
$configArray = array_merge($configArray, ['export' => true]);
$snippetData = json_decode(snippet('mysnippet', $configArray, true));
$pageidFromSnippet = A::get($snippetData, 'pageid', null);