Is there a way to not have .Pages.GroupByParam
error out if param doesn’t exist in the front matter of some pages? Instead use a default value?
I think a workaround here is to use cascade
in sections frontmatter to set the default for leaf pages.
But for some reason .Pages.GroupByParam "my_param"
still errors out despite having added “my_param” to _index.md
[cascade]
my_param= "uncategorized"
I cannot reproduce the problem. Of 8 pages, only 3 have the parameter “foo” in front matter.
{{ len site.Pages }} --> 8
{{ range site.Pages.GroupByParam "foo" }}
{{ len .Pages }} --> 3
{{ end }}
No errors.
Please share your code, or better yet, a link to your project repository.
I think the OP wants to see an error if the parameter is missing
Seems like there is an error…
A default is not possible. I assume OP would like to have something like this:
{{ range site.Pages.GroupByParam "foo" }}
{{ if (eq . nil) getPage "bar" }}
// do something
This is not possible because a groupBy
internally gets rid of the things it can’t group by. That is the same in other programming languages and most probably a Golang thing…
I would have thought of the problem more of some kind of sortBy
. Because then the pages that do not have this frontmatter might get sorted first or last in the sorted page collection. But without a real sample to wrap my head around, I can’t say much about this.
I would try to replace groupBy with a sortBy solution to see what goes on with the resulting array.
Edit: on a second thought, sortBy probably throws errors if the frontmatter is missing.
Edit: on a third thought, sortBy in connection with a cascaded frontmatter should do the trick. Now I am pretty sure with a sample repo OP can be helped.
Unfortunately the repo is not public but I’ll try to share some of the code here.
I have the content structured like:
-
content
-
other
-
docs
-
doc-a
- index.md
-
doc-a
- index.md
-
_index.md
-
-
doc-a\index.md
has a parameter in its front matter: group= "special_group"
while doc-b\index.md
doesn’t have that.
Now in my layout folder I have list view that applies to docs
:
{{ define "main" }}
<div class="single-content-area guide-page">
<div class="main-content {{ if not .Params.page_options.toc }}toc-no{{ end }}">
<!-- Groups content according to the $groupBy field in front matter -->
{{ range .Pages.GroupByParam "group" }}
<h3>{{ .Key }}</h3>
<ul>
{{ range .Pages.ByWeight }}
{{ partial "thumbnail" . }}
<a href="{{.Permalink}}">{{.Title}}</a>
<p> {{.Description}} </p>
<br/>
{{ end }}
</ul>
{{ end }}
</div>
</div>
{{ end }}
This results in error:
render of "section" failed: "C: ...\theme\layouts\docs\list.html:9:23": execute of template failed: template: docs/list.html:9:23: executing "main" at <.Pages.GroupByParam>: error calling GroupByParam: there is no such a
param
FYI I only encounter this error the first time I start the server.
If I start the server with {{ range .Pages.GroupByParam "myParam" }}
given myParam
exists in all index.md
s it starts fine.
And changing to {{ range .Pages.GroupByParam "group" }}
doesn’t raise an error in hot reload.
It’s only when I start the server with {{ range .Pages.GroupByParam "group" }}
that I get the above error.
This error occurs when a given section has no matching pages.
So, presuming that doc-a/index.md
does not have draft = true
, no errors are generated when ranging through the docs/
section.
The problem is that layouts/_default/list.html
is used to range through every section. For example, if none of the pages in your other/
section have a group
parameter, this error will occur.
The cleanest way to handle this is to create a list template specific to the docs/
section.
mkdir layouts/docs
cp layouts/_default/list.html layouts/docs/
layouts/_default/list.html
{{ range .Pages }}
<a href="{{.Permalink}}">{{.Title}}</a><br>
{{ end }}
layouts/docs/list.html
{{ range .Pages.GroupByParam "group" }}
<h3>{{ .Key }}</h3>
{{ range .Pages.ByWeight }}
<a href="{{.Permalink}}">{{.Title}}</a><br>
{{ end }}
{{ end }}
Thanks @jmooring , that’s exactly what was happening.
This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.