diff --git a/modules/site_users_microsite/site_users_microsite.links.menu.yml b/modules/site_users_microsite/site_users_microsite.links.menu.yml index a9da2f0..6779ed4 100644 --- a/modules/site_users_microsite/site_users_microsite.links.menu.yml +++ b/modules/site_users_microsite/site_users_microsite.links.menu.yml @@ -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 diff --git a/modules/site_users_microsite/site_users_microsite.module b/modules/site_users_microsite/site_users_microsite.module index 55a54ab..2a551e1 100644 --- a/modules/site_users_microsite/site_users_microsite.module +++ b/modules/site_users_microsite/site_users_microsite.module @@ -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(). * diff --git a/modules/site_users_microsite/site_users_microsite.routing.yml b/modules/site_users_microsite/site_users_microsite.routing.yml index ccb94f7..f5d3787 100644 --- a/modules/site_users_microsite/site_users_microsite.routing.yml +++ b/modules/site_users_microsite/site_users_microsite.routing.yml @@ -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: diff --git a/modules/site_users_microsite/src/Controller/MicrositeHomeController.php b/modules/site_users_microsite/src/Controller/MicrositeHomeController.php index 624ab36..d10985d 100644 --- a/modules/site_users_microsite/src/Controller/MicrositeHomeController.php +++ b/modules/site_users_microsite/src/Controller/MicrositeHomeController.php @@ -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()]); } } diff --git a/modules/site_users_microsite/src/Form/MicrositeUserConfigForm.php b/modules/site_users_microsite/src/Form/MicrositeUserConfigForm.php new file mode 100644 index 0000000..c6ca262 --- /dev/null +++ b/modules/site_users_microsite/src/Form/MicrositeUserConfigForm.php @@ -0,0 +1,102 @@ +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.')); + } + +}