ref: 8f5c9a747fcebb02bb99f5de272046411eb15370
parent: e4fcb672ed8bae21fd9780292b54fea3040dd877
author: David Jones <david@davidejones.com>
date: Sun Nov 22 08:09:59 EST 2020
Add menu params Fixes #7951
--- a/docs/content/en/content-management/menus.md
+++ b/docs/content/en/content-management/menus.md
@@ -113,6 +113,24 @@
In this example, the top level of the menu is defined in your [site `config` file][config]. All content entries are attached to one of these entries via the `.Parent` field.
+## Params
+
+You can also add user-defined content to menu items via the `params` field.
+
+A common use case is to define a custom param to add a css class to a specific menu item.
+
+{{< code-toggle file="config" >}}
+[[menu.main]]
+ name = "about hugo"
+ pre = "<i class='fa fa-heart'></i>"
+ weight = -110
+ identifier = "about"
+ url = "/about/"
+ [menu.main.params]
+ class = "highlight-menu-item"
+{{</ code-toggle >}}
+
+
## Render Menus
See [Menu Templates](/templates/menu-templates/) for information on how to render your site menus within your templates.
--- a/docs/content/en/templates/menu-templates.md
+++ b/docs/content/en/templates/menu-templates.md
@@ -160,3 +160,23 @@
{{ end }}
</nav>
```
+
+## Using .Params in Menus
+
+User-defined content on menu items are accessible via `.Params`.
+
+Here's an example:
+
+```
+<nav class="sidebar-nav">
+ {{ range .Site.Menus.main }}
+ <a href="{{ .URL }}" title="{{ .Title }}" class="{{ with .Params.class }}{{ . }}{{ end }}">
+ {{- .Name -}}
+ </a>
+ {{ end }}
+</nav>
+```
+
+{{% note %}}
+With Menu-level .Params they can easily exist on one menu item but not another. It's recommended to access them gracefully using the [with function](/functions/with).
+{{% /note %}}
\ No newline at end of file
--- a/hugolib/menu_test.go
+++ b/hugolib/menu_test.go
@@ -267,3 +267,53 @@
b.AssertFileContent("public/index.html", "A|Children:C|B|")
}
+
+func TestMenuParams(t *testing.T) {
+
+ b := newTestSitesBuilder(t).WithSimpleConfigFile()
+
+ b.WithTemplatesAdded("index.html", `
+Main: {{ len .Site.Menus.main }}
+{{ range .Site.Menus.main }}
+* Main|{{ .Name }}: {{ .URL }}|{{ .Params }}
+{{ end }}
+`)
+
+ b.WithContent("blog/page1.md", `
+---
+title: "P1"
+menu: main
+---
+
+`)
+
+ b.WithContent("blog/page2.md", `
+---
+title: "P2"
+menu: main
+---
+
+`)
+
+ b.WithContent("blog/page3.md", `
+---
+title: "P3"
+menu:
+ main:
+ weight: 30
+ params:
+ foo: "bar"
+ key2: "value2"
+---
+`)
+
+ b.Build(BuildCfg{})
+
+ b.AssertFileContent("public/index.html",
+ "Main: 3",
+ "Main|P3: /blog/page3/|map[foo:bar key2:value2]",
+ "Main|P1: /blog/page1/|map[]",
+ "Main|P2: /blog/page2/|map[]",
+ )
+
+}
--- a/navigation/menu.go
+++ b/navigation/menu.go
@@ -39,6 +39,7 @@
Weight int
Parent string
Children Menu
+ Params maps.Params
}
func (m *MenuEntry) URL() string {
@@ -127,6 +128,8 @@
m.Identifier = cast.ToString(v)
case "parent":
m.Parent = cast.ToString(v)
+ case "params":
+ m.Params = maps.ToStringMap(v)
}
}
}