Eleventy: Accessing collections inside macros

Created on 2 Mar 2019  Â·  8Comments  Â·  Source: 11ty/eleventy

I often want to access collections from inside nunjucks macros, which are walled off from the global scope. If I could create a collections shortcode, I could access them anywhere, without needing a special argument to pass collections into macros.

Is it possible to access my collections inside the .eleventy.js config, in order to create that shortcode?

education

Most helpful comment

@mirisuzanne If you want, you can give the global scope to macros when you import them, like this:
{% import "includes/macros.njk" as macro with context %}

All 8 comments

Sorry, shortcodes are the wrong approach here, since they return template literals and strings, not objects… Maybe need to rethink my approach…

@mirisuzanne If you want, you can give the global scope to macros when you import them, like this:
{% import "includes/macros.njk" as macro with context %}

Oh, that's useful to know! Though full global context comes with it's own downsides… :)

Am I right that it's not really possible to access collections in the config, to create a filter e.g. collection_name | getPosts that would be available from anywhere?

Collections are available in the config but only inside of Collection Configuration API: https://www.11ty.io/docs/collections/#advanced%3A-custom-filtering-and-sorting

Hmm, I’m not sure how safe it is to try and combine those two things together in your config file.

Can you provide a more concrete example so I can see the value of what you’re doing? Examples help me understand

I had a similar issue and @edwardhorsford with context advice solved my problem. I simply wanted to access global data inside a macro. I just learn about with context.

I have various components that include a list of tags, with linked tag pages – but the tag_list macro needs access to collections in order to get that information – unless I pass it into every component explicitly, which is my current solution.

@mirisuzanne I see what you mean. I will probably run into that as well at some point.

I'm curious if setting a variable as a workaround.

like

{% set tags post.data.tags %} 
{% import "includes/macros.njk" as macro with context %}

would tags be accessible in the macro without having to pass it in?

I'll give that a try tonight

with context should do it – just means I have to do a lot of namespace cleanup to avoid conflicts.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

zac-heisey picture zac-heisey  Â·  3Comments

kaloja picture kaloja  Â·  3Comments

zachleat picture zachleat  Â·  3Comments

nebrelbug picture nebrelbug  Â·  3Comments

zachleat picture zachleat  Â·  3Comments