Stash
ExpressionEngine 2, ExpressionEngine 3, ExpressionEngine 4, ExpressionEngine 5, ExpressionEngine 6
Back to this add-on's main page
View Other Add-ons From Mark Croxton
Dynamically populating Stash from Matrix field
General
Neal Hulme
|
Posted: 20 October 2011 05:33 AM |
|
|
|
I’m trying to mimic the NSM Transplant behaviour demonstrated by Etsur by dynamically populating a stash variable pulled from a custom field with dynamically created variables from a matrix field. I’ve got it working after playing around for a while, and getting my head around parse order again. The only limitation is that I have to do a find and replace so the user can use sensible place holders in the field contents.
Am I missing something that could make this easier? Ideally I would like to be able to use the straight tag per snippets but as you can’t use snippets in snippets it’s not a goer. Is there a way of assigning the values to a global variable type which gets parsed after the snippets? Any thoughts would be gratefully received as I would like to use Stash over NSM Transplant as it has other functionality I use, and of course it’s free which is greatly appreciated, thanks.
The model template looks something like this where {images} is a P&T Matrix field and the content field contains placeholders for the images that look like {image_1}
{embed="default/model"}
{exp:channel:entries} {images} {exp:stash:set name="image_{row_count}"} <img src="{image_file:url}" width="{image_file:width}" height="{image_file:height}" alt="{image_title}"> {/exp:stash:set} {/images} {exp:stash:set name="content" type="snippet"} {exp:low_replace find="/{image_[0-9]}/" replace="{exp:stash:get name='image_$1'}" regex="yes"}{content}{/exp:low_replace} {/exp:stash:set} {/exp:channel:entries}
The view template simply outputs the {content} variable
<!DOCTYPE html>
<html lang="en" dir="ltr" class="no-js">
<head> <meta charset="UTF-8"> <title>Page Title</title> </head>
<body> {content} </body>
</html>
|
|
|
Mark Croxton
|
Posted: 20 October 2011 10:52 AM |
# 1
|
|
Developer
|
Hi Neal
please try adding parse=“inward” to the channel entries tag, and then add parse_vars=“yes” to second stash tag.
That should do the trick, but if not there is another way to do it so let me know!
|
|
|
Neal Hulme
|
Posted: 20 October 2011 04:10 PM |
# 2
|
|
|
Hi Mark,
thanks for getting back to me although I think I am more confused now…
The code for the ‘model’ template is below with the two modifications you suggested, parse=“inward’ on the Channel Entries and parse_vars=“yes” on the second Stash tag. I have also removed the Low Replace tag as I assume this is not required. Testing this with a dummy entry that has three rows in the Matrix field {page_images} and the {page_body} field containing a string with three arbitrary placeholder strings {image_1}, {image_2} and {image_3} I simply get the string outputted through the view template. If I add the Low Replace back in which replaces /{image_([0-9])}/ with {exp:stash:get name=“image_$1”} in the {page_body} field it works and outputs the three image elements on the page.
Have I missed something? I was also a little confused as I could find no mention of the ‘parse_vars’ parameter so tried it anyway, and ‘parse_tags’, with no luck.
You also mentioned another way to do this?
{embed="views/default"}
{exp:channel:entries channel="pages" disable="categories|category_fields|member_data|pagination" dynamic="no" parse="inward" } {page_images} {exp:stash:set name="image_{row_count}"} <img src="{image_file:url}" width="{image_file:width}" height="{image_file:height}" alt="{image_caption}"> {/exp:stash:set} {/page_images} {exp:stash:set name="content" type="snippet" parse_vars="yes"}{page_body}{/exp:stash:set} {/exp:channel:entries}
|
|
|
Mark Croxton
|
Posted: 26 October 2011 09:42 AM |
# 3
|
|
Developer
|
Sorry, parse_vars is in the latest version of Stash on the dev branch. You can download it here:
https://github.com/croxton/Stash/tree/dev/third_party/stash
Getting back to your problem, this is the alternative approach:
viewModel
{embed="views/default"}
{exp:channel:entries channel="pages" disable="categories|category_fields|member_data|pagination" dynamic="no" parse="inward" } {page_images} {exp:stash:set name="image_{row_count}" type="snippet"} <img src="{image_file:url}" width="{image_file:width}" height="{image_file:height}" alt="{image_caption}"> {/exp:stash:set} {/page_images} {exp:stash:set name="content"}{page_body}{/exp:stash:set} {/exp:channel:entries}
view
<!DOCTYPE html>
<html lang="en" dir="ltr" class="no-js">
<head> <meta charset="UTF-8"> <title>Page Title</title> </head>
<body> {exp:stash:get name="content" parse_vars="yes"} </body>
</html>
|
|
|
Neal Hulme
|
Posted: 29 October 2011 07:33 AM |
# 4
|
|
|
This looks great! Should I be aware of anything if I am using the development branch or is it pretty stable?
|
|
|