Adiciona campo field_show_in_menu ao content_page

Campo booleano (padrão: ativo) que controla se a página aparece no menu
de navegação. Quando desmarcado, oculta field_menu_title no formulário
via #states e exclui a página da query em getChildPages(). O campo
field_weight permanece sempre visível, pois a ordenação se aplica
independentemente da exibição no menu.

Hook update_10015 cria storage + instância, atualiza o form display e
retroativamente define o valor como 1 para páginas existentes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-24 09:55:26 -03:00
parent 83690db7e9
commit f32a27dff9
6 changed files with 121 additions and 1 deletions

View File

@@ -7,6 +7,7 @@ dependencies:
- field.field.node.content_page.field_menu_title
- field.field.node.content_page.field_parent_page
- field.field.node.content_page.field_redirect_link
- field.field.node.content_page.field_show_in_menu
- field.field.node.content_page.field_site_section
- field.field.node.content_page.field_weight
- node.type.content_page
@@ -83,9 +84,16 @@ content:
size: 60
placeholder: ''
third_party_settings: { }
field_show_in_menu:
type: boolean_checkbox
weight: 1
region: content
settings:
display_label: true
third_party_settings: { }
field_menu_title:
type: string_textfield
weight: 1
weight: 2
region: content
settings:
size: 60

View File

@@ -0,0 +1,20 @@
langcode: pt-br
status: true
dependencies:
config:
- field.storage.node.field_show_in_menu
- node.type.content_page
entity_type: node
field_name: field_show_in_menu
bundle: content_page
label: 'Exibir no menu'
description: 'Se desmarcado, a página não aparecerá no menu de navegação.'
required: false
translatable: false
default_value:
- value: 1
default_value_callback: ''
settings:
on_label: 'Sim'
off_label: 'Não'
field_type: boolean

View File

@@ -0,0 +1,16 @@
langcode: en
status: true
dependencies: {}
entity_type: node
field_name: field_show_in_menu
type: boolean
settings:
on_label: 'Sim'
off_label: 'Não'
module: core
locked: false
cardinality: 1
translatable: false
indexes: {}
persist_with_no_fields: false
custom_storage: false

View File

@@ -429,6 +429,7 @@ class StructuralPagesMenuBlock extends BlockBase implements ContainerFactoryPlug
->accessCheck(TRUE)
->condition('type', 'content_page')
->condition('status', 1)
->condition('field_show_in_menu', 0, '<>')
->sort('field_weight', 'ASC')
->sort('title', 'ASC');

View File

@@ -923,3 +923,69 @@ function structural_pages_update_10014(): string {
return 'Campos field_menu_title e field_weight adicionados ao content_page.';
}
/**
* Adiciona field_show_in_menu (boolean) ao content_page.
*
* Retroativamente define o valor como 1 (exibir) para todas as páginas
* existentes, preservando o comportamento anterior.
*/
function structural_pages_update_10015(): string {
$etm = \Drupal::entityTypeManager();
// --- field_show_in_menu ---
if (!\Drupal\field\Entity\FieldStorageConfig::loadByName('node', 'field_show_in_menu')) {
\Drupal\field\Entity\FieldStorageConfig::create([
'field_name' => 'field_show_in_menu',
'entity_type' => 'node',
'type' => 'boolean',
'settings' => ['on_label' => 'Sim', 'off_label' => 'Não'],
'cardinality' => 1,
'translatable' => FALSE,
])->save();
}
if (!\Drupal\field\Entity\FieldConfig::loadByName('node', 'content_page', 'field_show_in_menu')) {
\Drupal\field\Entity\FieldConfig::create([
'field_name' => 'field_show_in_menu',
'entity_type' => 'node',
'bundle' => 'content_page',
'label' => 'Exibir no menu',
'description' => 'Se desmarcado, a página não aparecerá no menu de navegação.',
'required' => FALSE,
'translatable' => FALSE,
'default_value' => [['value' => 1]],
])->save();
}
// Adiciona ao form display padrão.
$form_display = $etm->getStorage('entity_form_display')
->load('node.content_page.default');
if ($form_display && !$form_display->getComponent('field_show_in_menu')) {
$form_display->setComponent('field_show_in_menu', [
'type' => 'boolean_checkbox',
'weight' => 1,
'region' => 'content',
'settings' => ['display_label' => TRUE],
]);
$form_display->save();
}
// Retroativamente define field_show_in_menu = 1 para content_pages existentes
// que ainda não têm valor (NULL é tratado como 0 nas queries).
$nids = $etm->getStorage('node')->getQuery()
->accessCheck(FALSE)
->condition('type', 'content_page')
->notExists('field_show_in_menu')
->execute();
foreach ($nids as $nid) {
/** @var \Drupal\node\NodeInterface $node */
$node = $etm->getStorage('node')->load($nid);
if ($node) {
$node->set('field_show_in_menu', 1);
$node->save();
}
}
return 'Campo field_show_in_menu adicionado ao content_page; ' . count($nids) . ' página(s) retroativamente marcada(s) como visíveis.';
}

View File

@@ -427,6 +427,15 @@ function _structural_pages_alter_parent_page_form(&$form, \Drupal\Core\Form\Form
$form['menu']['#access'] = FALSE;
}
// Conditional visibility: field_menu_title and field_weight are only
// relevant when field_show_in_menu is checked.
$show_in_menu_selector = 'input[name="field_show_in_menu[value]"]';
if (isset($form['field_menu_title'])) {
$form['field_menu_title']['#states'] = [
'visible' => [$show_in_menu_selector => ['checked' => TRUE]],
];
}
if (!isset($form['field_site_section']) || !isset($form['field_parent_page'])) {
return;
}