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

@@ -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.';
}