Skip to content

Commit

Permalink
Add menu params
Browse files Browse the repository at this point in the history
Fixes #7951
  • Loading branch information
davidejones authored Nov 22, 2020
1 parent e4fcb67 commit 8f5c9a7
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 0 deletions.
18 changes: 18 additions & 0 deletions docs/content/en/content-management/menus.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,24 @@ This means that `.Title` will be used unless `.LinkTitle` is present, etc. In pr

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.
Expand Down
20 changes: 20 additions & 0 deletions docs/content/en/templates/menu-templates.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,23 @@ Here's an example:
{{ 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 %}}
50 changes: 50 additions & 0 deletions hugolib/menu_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,3 +267,53 @@ menu:

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[]",
)

}
3 changes: 3 additions & 0 deletions navigation/menu.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ type MenuEntry struct {
Weight int
Parent string
Children Menu
Params maps.Params
}

func (m *MenuEntry) URL() string {
Expand Down Expand Up @@ -127,6 +128,8 @@ func (m *MenuEntry) MarshallMap(ime map[string]interface{}) {
m.Identifier = cast.ToString(v)
case "parent":
m.Parent = cast.ToString(v)
case "params":
m.Params = maps.ToStringMap(v)
}
}
}
Expand Down

1 comment on commit 8f5c9a7

@chrede88
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is awesome! Thank you @davidejones

Please sign in to comment.