mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/site_users.git
synced 2026-05-03 22:10:41 -03:00
Adiciona página de configuração do microsite em /user/{id}/config
Permite ao usuário selecionar qual conteúdo (content_page toplevel) é exibido na página inicial do microsite. A configuração é armazenada via user.data e a homepage respeita a escolha com fallback para o primeiro nó publicado. O nó configurado como homepage é ocultado automaticamente do menu de navegação (structural_pages). Inclui link "Configuração" no menu da conta via rota de redirecionamento para o usuário atual. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -4,3 +4,9 @@ site_users_microsite.settings:
|
||||
route_name: site_users_microsite.settings
|
||||
parent: site_users.settings
|
||||
weight: 10
|
||||
|
||||
site_users_microsite.my_config:
|
||||
title: 'Configuração'
|
||||
route_name: site_users_microsite.my_config
|
||||
menu_name: account
|
||||
weight: 5
|
||||
|
||||
@@ -29,6 +29,42 @@ function site_users_microsite_theme(): array {
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_preprocess_structural_pages_menu().
|
||||
*
|
||||
* Remove da árvore de navegação o nó configurado como homepage do microsite,
|
||||
* já que esse conteúdo é exibido diretamente em /user/{id}.
|
||||
*/
|
||||
function site_users_microsite_preprocess_structural_pages_menu(array &$variables): void {
|
||||
$user = site_users_get_microsite_user();
|
||||
if ($user === NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
$homepage_nid = \Drupal::service('user.data')
|
||||
->get('site_users_microsite', $user->id(), 'homepage_nid');
|
||||
if (!$homepage_nid) {
|
||||
return;
|
||||
}
|
||||
|
||||
_site_users_microsite_remove_homepage_from_tree($variables['tree'], (int) $homepage_nid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove recursivamente o nó homepage da árvore do structural_pages_menu.
|
||||
*/
|
||||
function _site_users_microsite_remove_homepage_from_tree(array &$items, int $homepage_nid): void {
|
||||
foreach ($items as $key => $item) {
|
||||
if ((int) ($item['id'] ?? 0) === $homepage_nid) {
|
||||
unset($items[$key]);
|
||||
continue;
|
||||
}
|
||||
if (!empty($item['children'])) {
|
||||
_site_users_microsite_remove_homepage_from_tree($items[$key]['children'], $homepage_nid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_preprocess_page().
|
||||
*
|
||||
|
||||
@@ -24,6 +24,27 @@ site_users_microsite.content:
|
||||
user:
|
||||
type: entity:user
|
||||
|
||||
site_users_microsite.user_config:
|
||||
path: '/user/{user}/config'
|
||||
defaults:
|
||||
_form: '\Drupal\site_users_microsite\Form\MicrositeUserConfigForm'
|
||||
_title: 'Microsite settings'
|
||||
requirements:
|
||||
_entity_access: 'user.update'
|
||||
user: \d+
|
||||
options:
|
||||
parameters:
|
||||
user:
|
||||
type: entity:user
|
||||
|
||||
site_users_microsite.my_config:
|
||||
path: '/user/microsite/config'
|
||||
defaults:
|
||||
_controller: '\Drupal\site_users_microsite\Controller\MicrositeHomeController::redirectToMyConfig'
|
||||
_title: 'Microsite settings'
|
||||
requirements:
|
||||
_user_is_logged_in: 'TRUE'
|
||||
|
||||
site_users_microsite.settings:
|
||||
path: '/admin/config/local-modules/site-users/microsite'
|
||||
defaults:
|
||||
|
||||
@@ -4,25 +4,53 @@ namespace Drupal\site_users_microsite\Controller;
|
||||
|
||||
use Drupal\Core\Controller\ControllerBase;
|
||||
use Drupal\Core\StringTranslation\TranslatableMarkup;
|
||||
use Drupal\user\UserDataInterface;
|
||||
use Drupal\user\UserInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
|
||||
/**
|
||||
* Controller para a página inicial do micro-site do usuário.
|
||||
*
|
||||
* Carrega e exibe o nó do tipo content_page cujo autor é o usuário
|
||||
* da rota /user/{user}/home.
|
||||
*/
|
||||
class MicrositeHomeController extends ControllerBase {
|
||||
|
||||
public function __construct(
|
||||
protected UserDataInterface $userData,
|
||||
) {}
|
||||
|
||||
public static function create(ContainerInterface $container): static {
|
||||
return new static(
|
||||
$container->get('user.data'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Página inicial do micro-site.
|
||||
*
|
||||
* Exibe o nó configurado pelo usuário ou, como fallback, o primeiro nó
|
||||
* do tipo content_page publicado pelo usuário.
|
||||
*/
|
||||
public function home(UserInterface $user): array {
|
||||
$cache = [
|
||||
'tags' => ['node_list:content_page', 'user:' . $user->id()],
|
||||
'tags' => [
|
||||
'node_list:content_page',
|
||||
'user:' . $user->id(),
|
||||
'site_users_microsite_config:' . $user->id(),
|
||||
],
|
||||
'contexts' => ['route'],
|
||||
];
|
||||
|
||||
$homepage_nid = $this->userData->get('site_users_microsite', $user->id(), 'homepage_nid');
|
||||
|
||||
if ($homepage_nid) {
|
||||
$node = $this->entityTypeManager()->getStorage('node')->load($homepage_nid);
|
||||
if ($node && $node->isPublished() && $node->access('view')) {
|
||||
$build = $this->entityTypeManager()->getViewBuilder('node')->view($node, 'full');
|
||||
$build['#cache'] = $cache;
|
||||
return $build;
|
||||
}
|
||||
}
|
||||
|
||||
$nids = $this->entityTypeManager()->getStorage('node')
|
||||
->getQuery()
|
||||
->condition('uid', $user->id())
|
||||
@@ -53,11 +81,22 @@ class MicrositeHomeController extends ControllerBase {
|
||||
return $this->entityTypeManager()->getViewBuilder('user')->view($user, 'full');
|
||||
}
|
||||
|
||||
/**
|
||||
* Redireciona para a página de configuração do microsite do usuário atual.
|
||||
*
|
||||
* Usada pelo link do menu da conta, que não suporta parâmetros dinâmicos.
|
||||
*/
|
||||
public function redirectToMyConfig(): RedirectResponse {
|
||||
return $this->redirect('site_users_microsite.user_config', [
|
||||
'user' => $this->currentUser()->id(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback de título para a página inicial.
|
||||
*/
|
||||
public function title(UserInterface $user): TranslatableMarkup {
|
||||
return $this->t("@name", ['@name' => $user->getDisplayName()]);
|
||||
return $this->t('@name', ['@name' => $user->getDisplayName()]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\site_users_microsite\Form;
|
||||
|
||||
use Drupal\Core\Cache\Cache;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Form\FormBase;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\user\UserDataInterface;
|
||||
use Drupal\user\UserInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Formulário de configuração do microsite pessoal do usuário.
|
||||
*/
|
||||
class MicrositeUserConfigForm extends FormBase {
|
||||
|
||||
public function __construct(
|
||||
protected EntityTypeManagerInterface $entityTypeManager,
|
||||
protected UserDataInterface $userData,
|
||||
) {}
|
||||
|
||||
public static function create(ContainerInterface $container): static {
|
||||
return new static(
|
||||
$container->get('entity_type.manager'),
|
||||
$container->get('user.data'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFormId(): string {
|
||||
return 'site_users_microsite_user_config';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildForm(array $form, FormStateInterface $form_state, ?UserInterface $user = NULL): array {
|
||||
if ($user === NULL) {
|
||||
return $form;
|
||||
}
|
||||
|
||||
$form_state->set('user', $user);
|
||||
|
||||
$homepage_nid = $this->userData->get('site_users_microsite', $user->id(), 'homepage_nid');
|
||||
|
||||
$nids = $this->entityTypeManager->getStorage('node')
|
||||
->getQuery()
|
||||
->condition('uid', $user->id())
|
||||
->condition('type', 'content_page')
|
||||
->condition('status', 1)
|
||||
->notExists('field_parent_page')
|
||||
->accessCheck(TRUE)
|
||||
->sort('title')
|
||||
->execute();
|
||||
|
||||
$options = ['' => $this->t('— primeira página publicada —')];
|
||||
if (!empty($nids)) {
|
||||
$nodes = $this->entityTypeManager->getStorage('node')->loadMultiple($nids);
|
||||
foreach ($nodes as $nid => $node) {
|
||||
$options[$nid] = $node->label();
|
||||
}
|
||||
}
|
||||
|
||||
$form['homepage_nid'] = [
|
||||
'#type' => 'select',
|
||||
'#title' => $this->t('Homepage content'),
|
||||
'#description' => $this->t('Select which content to display on your microsite homepage.'),
|
||||
'#options' => $options,
|
||||
'#default_value' => $homepage_nid ?? '',
|
||||
];
|
||||
|
||||
$form['actions'] = ['#type' => 'actions'];
|
||||
$form['actions']['submit'] = [
|
||||
'#type' => 'submit',
|
||||
'#value' => $this->t('Save configuration'),
|
||||
];
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function submitForm(array &$form, FormStateInterface $form_state): void {
|
||||
$user = $form_state->get('user');
|
||||
$nid = $form_state->getValue('homepage_nid');
|
||||
|
||||
if (empty($nid)) {
|
||||
$this->userData->delete('site_users_microsite', $user->id(), 'homepage_nid');
|
||||
}
|
||||
else {
|
||||
$this->userData->set('site_users_microsite', $user->id(), 'homepage_nid', (int) $nid);
|
||||
}
|
||||
|
||||
Cache::invalidateTags(['site_users_microsite_config:' . $user->id()]);
|
||||
$this->messenger()->addStatus($this->t('Configuration saved.'));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user