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:
2026-03-21 09:55:56 -03:00
parent f4d6c49312
commit 85bc63b250
5 changed files with 209 additions and 5 deletions

View File

@@ -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()]);
}
}

View File

@@ -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.'));
}
}