From f32a27dff94d2beb7b283bc06c77eb5cdecc4b8d Mon Sep 17 00:00:00 2001 From: "Quintino A. G. Souza" Date: Tue, 24 Mar 2026 09:55:26 -0300 Subject: [PATCH] Adiciona campo field_show_in_menu ao content_page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- ...form_display.node.content_page.default.yml | 10 ++- ...d.node.content_page.field_show_in_menu.yml | 20 ++++++ .../field.storage.node.field_show_in_menu.yml | 16 +++++ src/Plugin/Block/StructuralPagesMenuBlock.php | 1 + structural_pages.install | 66 +++++++++++++++++++ structural_pages.module | 9 +++ 6 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 config/install/field.field.node.content_page.field_show_in_menu.yml create mode 100644 config/install/field.storage.node.field_show_in_menu.yml diff --git a/config/install/core.entity_form_display.node.content_page.default.yml b/config/install/core.entity_form_display.node.content_page.default.yml index 0f65949..bb5e72c 100644 --- a/config/install/core.entity_form_display.node.content_page.default.yml +++ b/config/install/core.entity_form_display.node.content_page.default.yml @@ -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 diff --git a/config/install/field.field.node.content_page.field_show_in_menu.yml b/config/install/field.field.node.content_page.field_show_in_menu.yml new file mode 100644 index 0000000..0f89941 --- /dev/null +++ b/config/install/field.field.node.content_page.field_show_in_menu.yml @@ -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 diff --git a/config/install/field.storage.node.field_show_in_menu.yml b/config/install/field.storage.node.field_show_in_menu.yml new file mode 100644 index 0000000..aeae3e3 --- /dev/null +++ b/config/install/field.storage.node.field_show_in_menu.yml @@ -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 diff --git a/src/Plugin/Block/StructuralPagesMenuBlock.php b/src/Plugin/Block/StructuralPagesMenuBlock.php index 14db951..fc3391d 100644 --- a/src/Plugin/Block/StructuralPagesMenuBlock.php +++ b/src/Plugin/Block/StructuralPagesMenuBlock.php @@ -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'); diff --git a/structural_pages.install b/structural_pages.install index b28ef59..4468639 100644 --- a/structural_pages.install +++ b/structural_pages.install @@ -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.'; +} diff --git a/structural_pages.module b/structural_pages.module index 2fc22ab..442a47a 100644 --- a/structural_pages.module +++ b/structural_pages.module @@ -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; }