From 27134fce190d08548f269efa18b92584b56a8e04 Mon Sep 17 00:00:00 2001 From: "Quintino A. G. Souza" Date: Tue, 17 Mar 2026 07:13:07 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20condi=C3=A7=C3=A3o=20PageUserIsCurre?= =?UTF-8?q?ntUser=20e=20atualiza=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nova condição de visibilidade de bloco (site_tools_page_owner): restringe exibição à situação em que o usuário logado é o dono da rota /user/{id}. Ativada por checkbox na UI; desativada por padrão. - README atualizado com documentação da condição, do widget MSC 2020 e do sub-módulo de migrate. Co-Authored-By: Claude Sonnet 4.6 --- README.md | 49 ++++++++ .../Condition/PageUserIsCurrentUser.php | 111 ++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 src/Plugin/Condition/PageUserIsCurrentUser.php diff --git a/README.md b/README.md index 85782bb..e4d3040 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,12 @@ Módulo Drupal com ferramentas utilitárias reutilizáveis para outros módulos - **Menu de configuração "Local Modules"**: Fornece uma seção centralizada em `/admin/config/local-modules` para configurações de módulos desenvolvidos internamente. - **Bloco Share Links**: Bloco de compartilhamento em redes sociais extensível via hooks. +- **Condição de visibilidade "Usuário da página é o usuário logado"**: Restringe a exibição de qualquer bloco à situação em que o usuário autenticado é o mesmo da rota `/user/{id}`. + +## Sub-módulos + +- **site_tools_msc_2020**: Widget de seleção em cascata (1–3 níveis) para o vocabulário MSC 2020, com carregamento eficiente dos 597 termos via `loadTree()` + consulta direta ao banco. +- **site_tools_msc_2020_migrate**: Migrations para importação do vocabulário MSC 2020 a partir de CSV. ## Requisitos @@ -98,3 +104,46 @@ Consulte [docs/share-links.md](docs/share-links.md) para documentação detalhad - Personalização do template Twig - Classes CSS disponíveis - Gerenciamento de cache + +## Condição de visibilidade: Usuário da página é o usuário logado + +O plugin `PageUserIsCurrentUser` adiciona uma condição de visibilidade reutilizável a qualquer bloco do site. + +### Configuração + +1. Acesse `/admin/structure/block` e edite o bloco desejado +2. Na aba **Visibilidade**, localize a seção **"Usuário da página é o usuário logado"** +3. Marque **"Exibir apenas para o dono da página"** e salve + +Quando ativada, o bloco só é exibido se o usuário autenticado tiver o mesmo ID que o parâmetro `{id}` da rota `/user/{id}`. A opção **"Negar a condição"** inverte o comportamento (exibe para todos exceto o dono). + +## Sub-módulo: site_tools_msc_2020 + +Widget de campo (`FieldWidget`) para seleção hierárquica de termos do vocabulário **MSC 2020** (Mathematics Subject Classification), com até 3 níveis em cascata via AJAX. + +### Configuração + +1. Ative o sub-módulo: `drush en site_tools_msc_2020` +2. No formulário de exibição do campo (`/admin/structure/types/manage/.../form-display`), selecione o widget **"MSC 2020 — Seleção em cascata"** +3. Configure o **Nível máximo** (1, 2 ou 3) nas opções do widget + +### Níveis + +| Nível | Código | Exemplo | +|-------|--------|---------| +| 1 | 2 dígitos | `03` | +| 2 | 3 caracteres | `03B` | +| 3 | 5 caracteres | `03B05` | + +O valor armazenado é sempre o TID do nível mais profundo selecionado. Selecionar "— área geral —" em um nível armazena o TID do nível imediatamente superior. + +## Sub-módulo: site_tools_msc_2020_migrate + +Migrations para importação do vocabulário MSC 2020 a partir de arquivos CSV. + +### Uso + +```bash +drush en site_tools_msc_2020_migrate +drush migrate:import --group=msc_2020 +``` diff --git a/src/Plugin/Condition/PageUserIsCurrentUser.php b/src/Plugin/Condition/PageUserIsCurrentUser.php new file mode 100644 index 0000000..8770acc --- /dev/null +++ b/src/Plugin/Condition/PageUserIsCurrentUser.php @@ -0,0 +1,111 @@ +get('current_route_match'), + $container->get('current_user'), + ); + } + + /** + * {@inheritdoc} + */ + public function defaultConfiguration(): array { + return ['enabled' => FALSE] + parent::defaultConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state): array { + $form['enabled'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Exibir apenas para o dono da página'), + '#description' => $this->t('Quando marcado, o bloco só é exibido se o usuário logado for o mesmo da rota /user/{id}.'), + '#default_value' => $this->configuration['enabled'], + ]; + return parent::buildConfigurationForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function submitConfigurationForm(array &$form, FormStateInterface $form_state): void { + $this->configuration['enabled'] = (bool) $form_state->getValue('enabled'); + parent::submitConfigurationForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function evaluate(): bool { + // Condição desativada: sempre passa. + if (empty($this->configuration['enabled'])) { + return TRUE; + } + + $param = $this->routeMatch->getParameter('user'); + + if ($param instanceof UserInterface) { + $page_uid = (int) $param->id(); + } + elseif (is_numeric($param)) { + $page_uid = (int) $param; + } + else { + return FALSE; + } + + return $page_uid === (int) $this->currentUser->id(); + } + + /** + * {@inheritdoc} + */ + public function summary(): string { + if (empty($this->configuration['enabled'])) { + return (string) $this->t('Sem restrição por dono da página.'); + } + if ($this->isNegated()) { + return (string) $this->t('O usuário logado não é o dono da página.'); + } + return (string) $this->t('O usuário logado é o dono da página.'); + } + +}