Skip to content

Commit

Permalink
Document the PageRef menu entry method
Browse files Browse the repository at this point in the history
  • Loading branch information
jmooring authored Nov 21, 2024
1 parent bda544c commit 59fa9f2
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 0 deletions.
120 changes: 120 additions & 0 deletions content/en/methods/menu-entry/PageRef.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
---
title: PageRef
description: Returns the `pageRef` property of the given menu entry.
categories: []
keywords: []
action:
related:
- /methods/menu-entry/URL
returnType: string
signatures: [MENUENTRY.PageRef]
toc: true
---

The use case for this method is rare.

In almost also scenarios you should use the [`URL`] method instead.

## Explanation

If you specify a `pageRef` property when [defining a menu entry] in your site configuration, Hugo looks for a matching page when rendering the entry.

If a matching page is found:

- The [`URL`] method returns the page's relative permalink
- The [`Page`] method returns the corresponding `Page` object
- The [`HasMenuCurrent`] and [`IsMenuCurrent`] methods on a `Page` object return the expected values

If a matching page is not found:

- The [`URL`] method returns the entry's `url` property if set, else an empty string
- The [`Page`] method returns nil
- The [`HasMenuCurrent`] and [`IsMenuCurrent`] methods on a `Page` object return `false`

{{% note %}}
In almost also scenarios you should use the [`URL`] method instead.

[`URL`]: /methods/menu-entry/url/
{{% /note %}}

[defining a menu entry]: /content-management/menus/#define-in-site-configuration
[`Page`]: /methods/menu-entry/page/
[`URL`]: /methods/menu-entry/url/
[`IsMenuCurrent`]: /methods/page/ismenucurrent/
[`HasMenuCurrent`]: /methods/page/hasmenucurrent/
[`RelPermalink`]: /methods/page/relpermalink/

## Example

This example is contrived.

{{% note %}}
In almost also scenarios you should use the [`URL`] method instead.

[`URL`]: /methods/menu-entry/url/
{{% /note %}}


Consider this content structure:

```text
content/
├── products.md
└── _index.md
```

And this menu definition:

{{< code-toggle file=hugo >}}
[[menus.main]]
name = 'Products'
pageRef = '/products'
weight = 10
[[menus.main]]
name = 'Services'
pageRef = '/services'
weight = 20
{{< /code-toggle >}}

With this template code:

{{< code file=layouts/partials/menu.html >}}
<ul>
{{ range .Site.Menus.main }}
<li><a href="{{ .URL }}">{{ .Name }}</a></li>
{{ end }}
</ul>
{{< /code >}}

Hugo render this HTML:

```html
<ul>
<li><a href="/products/">Products</a></li>
<li><a href="">Services</a></li>
</ul>
```

In the above note that the `href` attribute of the second `anchor` element is blank because Hugo was unable to find the "services" page.

With this template code:


{{< code file=layouts/partials/menu.html >}}
<ul>
{{ range .Site.Menus.main }}
<li><a href="{{ or .URL .PageRef }}">{{ .Name }}</a></li>
{{ end }}
</ul>
{{< /code >}}

Hugo renders this HTML:

```html
<ul>
<li><a href="/products/">Products</a></li>
<li><a href="/services">Services</a></li>
</ul>
```

In the above note that Hugo populates the `href` attribute of the second `anchor` element with the `pageRef` property as defined in the site configuration because the template code falls back to the `PageRef` method.
4 changes: 4 additions & 0 deletions content/en/methods/page/HasMenuCurrent.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,8 @@ If the `Page` object associated with the menu entry is a section, this method al

See [menu templates] for a complete example.

{{% note %}}
When using this method you must either define the menu entry in front matter, or specify a `pageRef` property when defining the menu entry in your site configuration.
{{% /note %}}

[menu templates]: /templates/menu/#example
4 changes: 4 additions & 0 deletions content/en/methods/page/IsMenuCurrent.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,8 @@ aliases: [/functions/ismenucurrent]

See [menu templates] for a complete example.

{{% note %}}
When using this method you must either define the menu entry in front matter, or specify a `pageRef` property when defining the menu entry in your site configuration.
{{% /note %}}

[menu templates]: /templates/menu/#example

0 comments on commit 59fa9f2

Please sign in to comment.