- Add field_redirect_page to site_sections taxonomy terms, with a custom EntityReferenceSelection plugin that filters content_page nodes by section - Redirect taxonomy term canonical URLs to the configured node (301) - Fix root page detection in MenuBlock and views to also match nodes whose field_parent_page points to a taxonomy_term (not only empty parent) - Move root taxonomy-term option to the top of the parent-page dropdown - Add breadcrumb workaround for Gavias notech theme separator rendering - Add imecc_menu_helper submodule - Translate config labels and default terms from English to Portuguese Co-Authored-By: Henrique Bauer <henrique@webcontent.com.br> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Structural Pages
Drupal 11 module that implements hierarchical editorial structure and contextual navigation for institutional sites. Designed for higher education institutions but generic enough for other institutional contexts.
Problem
In Drupal, content is added in a flat manner (non-hierarchical), and menus are traditionally used to organize content into hierarchical structures. This creates user experience problems because content editors typically do not have permission to administer menus.
Solution
The module implements two complementary structures:
- Taxonomic Structure (primary) — Organization based on the
site_sectionshierarchical taxonomy vocabulary, applied to thesection_pagecontent type. Governs breadcrumbs and URLs via Pathauto. - Parent-Child Structure (subsidiary) — Direct hierarchy between pages via
field_parent_page(Dynamic Entity Reference), applied to thecontent_pagecontent type. Supports multiple parent entity types: nodes, taxonomy terms, users, and groups.
Requirements
- Drupal 11
- Core modules:
node,taxonomy,views,field,text - Contrib modules:
- Optional:
content_translation— for multilingual taxonomy term names- Group — for group entity support (via
structural_pages_groupsubmodule)
Installation
drush en structural_pages -y
drush cr
The module automatically creates:
- Taxonomy vocabulary
site_sectionswith default hierarchical terms - Content types
section_pageandcontent_pagewith configured fields - Pathauto patterns for both content types and taxonomy terms
- A
child_pagesView (block display) - Content translations for term names (if
content_translationis enabled)
Group support
drush en structural_pages_group -y
Requires the Group module. Adds group entities as a parent type for content pages.
Configuration
Settings form: /admin/config/local-modules/structural-pages
Allows administrators to select which entity types and bundles can be used as parents for content pages. Changes automatically update the field_parent_page field configuration.
Content Types
section_page
Pages organized by site section. Each page belongs to a site_sections taxonomy term.
| Field | Type | Required | Description |
|---|---|---|---|
field_site_section |
Entity reference (taxonomy) | Yes | Site section |
body |
Formatted text | No | Page content |
content_page
Pages with hierarchical parent-child structure. The parent can be a node, taxonomy term, user, or group.
| Field | Type | Required | Description |
|---|---|---|---|
field_parent_page |
Dynamic entity reference | No | Parent entity |
field_site_section |
Entity reference (taxonomy) | Conditional | Site section (inherited or manual) |
body |
Formatted text | No | Page content |
Site section inheritance rules:
- Parent is a
taxonomy_term→ uses the term as site section - Parent is a
node→ inheritsfield_site_sectionfrom the parent node - Parent is a
userorgroup→ clearsfield_site_section(context is the entity itself) - No parent (root page) → must be filled manually
Features
Automatic breadcrumbs
Custom breadcrumb builder for section_page and content_page that traverses the parent chain:
- Taxonomy context: Home > Term Hierarchy > Parent Nodes > Current Page
- User context: Home > User Name > Parent Nodes > Current Page
- Group context: Home > Group Name > Parent Nodes > Current Page
Pathauto tokens
| Token | Description | Example |
|---|---|---|
[node:site-section-path] |
Hierarchical path from taxonomy | undergraduate/courses |
[term:hierarchy-path] |
Term path including ancestors | institutional/news |
Suggested URL pattern: [node:site-section-path]/[node:title] → /undergraduate/courses/software-engineering
Structural Pages Menu block
Dynamic menu block that renders hierarchical navigation based on content structure.
| Option | Default | Description |
|---|---|---|
| Maximum depth | 3 | Number of levels to display (1-10) |
| Show ancestor title | Yes | Display ancestor entity title as header |
| Expand active trail | Yes | Highlight the path to current page |
Child Pages View
Block display that lists child pages of the current content_page, filtered by field_parent_page.
Extensibility
The module uses an attribute-based plugin system (ParentEntityHandler) to support different parent entity types. Built-in handlers:
| Handler | Entity Type | Clears Site Section | Bundle Restrictions |
|---|---|---|---|
| TaxonomyTermHandler | taxonomy_term | No | site_sections |
| NodeHandler | node | No | content_page, section_page |
| UserHandler | user | Yes | - |
| GroupHandler* | group | Yes | - |
*Provided by the structural_pages_group submodule.
To add support for a new entity type, create a plugin in src/Plugin/ParentEntityHandler/:
#[ParentEntityHandler(
id: 'my_entity',
label: new TranslatableMarkup('My Entities'),
entity_type_id: 'my_entity',
clears_site_section: FALSE,
sort_field: 'title',
)]
class MyEntityHandler extends ParentEntityHandlerBase {
// Override methods as needed.
}
See docs/DESIGN.md for full architecture details and docs/PLUGIN_SYSTEM_PLAN.md for the plugin system design.