From 072e64b771c53e3ee9216dd3ce1d0145a9231326 Mon Sep 17 00:00:00 2001 From: "Quintino A. G. Souza" Date: Tue, 24 Mar 2026 07:45:04 -0300 Subject: [PATCH] Adiciona field_menu_title e field_weight ao content_page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit field_menu_title (string, 128 chars): - Título alternativo para exibição no menu de navegação - Quando preenchido, substitui o título da página no menu - Útil para abreviar títulos longos field_weight (integer, padrão 0): - Controla a ordenação de páginas com o mesmo pai - Valores menores aparecem primeiro; empate resolvido por título StructuralPagesMenuBlock: - Ordenação: field_weight ASC, título ASC (antes: só título) - Título no menu: field_menu_title se preenchido, senão label() Update 10014: cria os campos e atualiza o form display em instalações existentes. Co-Authored-By: Claude Sonnet 4.6 --- ...form_display.node.content_page.default.yml | 17 ++++ ...eld.node.content_page.field_menu_title.yml | 17 ++++ ...d.field.node.content_page.field_weight.yml | 22 ++++++ .../field.storage.node.field_menu_title.yml | 17 ++++ .../field.storage.node.field_weight.yml | 16 ++++ src/Plugin/Block/StructuralPagesMenuBlock.php | 7 +- structural_pages.install | 78 +++++++++++++++++++ 7 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 config/install/field.field.node.content_page.field_menu_title.yml create mode 100644 config/install/field.field.node.content_page.field_weight.yml create mode 100644 config/install/field.storage.node.field_menu_title.yml create mode 100644 config/install/field.storage.node.field_weight.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 51a2c9c..0f65949 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 @@ -4,9 +4,11 @@ status: true dependencies: config: - field.field.node.content_page.body + - 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_site_section + - field.field.node.content_page.field_weight - node.type.content_page module: - dynamic_entity_reference @@ -81,6 +83,21 @@ content: size: 60 placeholder: '' third_party_settings: { } + field_menu_title: + type: string_textfield + weight: 1 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + field_weight: + type: number + weight: 27 + region: content + settings: + placeholder: '0' + third_party_settings: { } uid: type: entity_reference_autocomplete weight: 5 diff --git a/config/install/field.field.node.content_page.field_menu_title.yml b/config/install/field.field.node.content_page.field_menu_title.yml new file mode 100644 index 0000000..6f5fad9 --- /dev/null +++ b/config/install/field.field.node.content_page.field_menu_title.yml @@ -0,0 +1,17 @@ +langcode: pt-br +status: true +dependencies: + config: + - field.storage.node.field_menu_title + - node.type.content_page +entity_type: node +field_name: field_menu_title +bundle: content_page +label: 'Título no menu' +description: 'Título abreviado para o menu de navegação. Se vazio, usa o título da página.' +required: false +translatable: true +default_value: {} +default_value_callback: '' +settings: {} +field_type: string diff --git a/config/install/field.field.node.content_page.field_weight.yml b/config/install/field.field.node.content_page.field_weight.yml new file mode 100644 index 0000000..5d3c246 --- /dev/null +++ b/config/install/field.field.node.content_page.field_weight.yml @@ -0,0 +1,22 @@ +langcode: pt-br +status: true +dependencies: + config: + - field.storage.node.field_weight + - node.type.content_page +entity_type: node +field_name: field_weight +bundle: content_page +label: 'Peso (ordenação)' +description: 'Valores menores aparecem primeiro entre páginas com o mesmo pai. Padrão: 0.' +required: false +translatable: false +default_value: + - value: 0 +default_value_callback: '' +settings: + min: '' + max: '' + prefix: '' + suffix: '' +field_type: integer diff --git a/config/install/field.storage.node.field_menu_title.yml b/config/install/field.storage.node.field_menu_title.yml new file mode 100644 index 0000000..95831bd --- /dev/null +++ b/config/install/field.storage.node.field_menu_title.yml @@ -0,0 +1,17 @@ +langcode: en +status: true +dependencies: {} +entity_type: node +field_name: field_menu_title +type: string +settings: + max_length: 128 + is_ascii: false + case_sensitive: false +module: core +locked: false +cardinality: 1 +translatable: true +indexes: {} +persist_with_no_fields: false +custom_storage: false diff --git a/config/install/field.storage.node.field_weight.yml b/config/install/field.storage.node.field_weight.yml new file mode 100644 index 0000000..b60e975 --- /dev/null +++ b/config/install/field.storage.node.field_weight.yml @@ -0,0 +1,16 @@ +langcode: en +status: true +dependencies: {} +entity_type: node +field_name: field_weight +type: integer +settings: + unsigned: false + size: normal +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 04db3b2..14db951 100644 --- a/src/Plugin/Block/StructuralPagesMenuBlock.php +++ b/src/Plugin/Block/StructuralPagesMenuBlock.php @@ -351,10 +351,14 @@ class StructuralPagesMenuBlock extends BlockBase implements ContainerFactoryPlug } } + $menu_title = ($node->hasField('field_menu_title') && !$node->get('field_menu_title')->isEmpty()) + ? $node->get('field_menu_title')->value + : $node->label(); + $branch = [ 'entity' => $node, 'id' => $node->id(), - 'title' => $node->label(), + 'title' => $menu_title, 'url' => $url, 'is_redirect' => $is_redirect, 'depth' => $current_depth, @@ -425,6 +429,7 @@ class StructuralPagesMenuBlock extends BlockBase implements ContainerFactoryPlug ->accessCheck(TRUE) ->condition('type', 'content_page') ->condition('status', 1) + ->sort('field_weight', 'ASC') ->sort('title', 'ASC'); if ($parent_type === 'node') { diff --git a/structural_pages.install b/structural_pages.install index 93d9146..b28ef59 100644 --- a/structural_pages.install +++ b/structural_pages.install @@ -845,3 +845,81 @@ function structural_pages_requirements(string $phase): array { return $requirements; } + +/** + * Adiciona field_menu_title e field_weight ao tipo content_page. + */ +function structural_pages_update_10014(): string { + $etm = \Drupal::entityTypeManager(); + + // --- field_menu_title --- + if (!\Drupal\field\Entity\FieldStorageConfig::loadByName('node', 'field_menu_title')) { + \Drupal\field\Entity\FieldStorageConfig::create([ + 'field_name' => 'field_menu_title', + 'entity_type' => 'node', + 'type' => 'string', + 'settings' => ['max_length' => 128], + 'cardinality' => 1, + 'translatable' => TRUE, + ])->save(); + } + if (!\Drupal\field\Entity\FieldConfig::loadByName('node', 'content_page', 'field_menu_title')) { + \Drupal\field\Entity\FieldConfig::create([ + 'field_name' => 'field_menu_title', + 'entity_type' => 'node', + 'bundle' => 'content_page', + 'label' => 'Título no menu', + 'description' => 'Título abreviado para o menu de navegação. Se vazio, usa o título da página.', + 'required' => FALSE, + 'translatable' => TRUE, + ])->save(); + } + + // --- field_weight --- + if (!\Drupal\field\Entity\FieldStorageConfig::loadByName('node', 'field_weight')) { + \Drupal\field\Entity\FieldStorageConfig::create([ + 'field_name' => 'field_weight', + 'entity_type' => 'node', + 'type' => 'integer', + 'cardinality' => 1, + 'translatable' => FALSE, + ])->save(); + } + if (!\Drupal\field\Entity\FieldConfig::loadByName('node', 'content_page', 'field_weight')) { + \Drupal\field\Entity\FieldConfig::create([ + 'field_name' => 'field_weight', + 'entity_type' => 'node', + 'bundle' => 'content_page', + 'label' => 'Peso (ordenação)', + 'description' => 'Valores menores aparecem primeiro entre páginas com o mesmo pai. Padrão: 0.', + 'required' => FALSE, + 'translatable' => FALSE, + 'default_value' => [['value' => 0]], + ])->save(); + } + + // Adiciona os campos ao form display padrão. + $form_display = $etm->getStorage('entity_form_display') + ->load('node.content_page.default'); + if ($form_display) { + if (!$form_display->getComponent('field_menu_title')) { + $form_display->setComponent('field_menu_title', [ + 'type' => 'string_textfield', + 'weight' => 1, + 'region' => 'content', + 'settings' => ['size' => 60, 'placeholder' => ''], + ]); + } + if (!$form_display->getComponent('field_weight')) { + $form_display->setComponent('field_weight', [ + 'type' => 'number', + 'weight' => 27, + 'region' => 'content', + 'settings' => ['placeholder' => '0'], + ]); + } + $form_display->save(); + } + + return 'Campos field_menu_title e field_weight adicionados ao content_page.'; +}