mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/structural_pages.git
synced 2026-05-04 18:20:40 -03:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
16
config/install/field.storage.node.field_show_in_menu.yml
Normal file
16
config/install/field.storage.node.field_show_in_menu.yml
Normal 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
|
||||
@@ -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');
|
||||
|
||||
|
||||
@@ -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.';
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user