mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/site_users.git
synced 2026-05-05 08:40:41 -03:00
Adiciona sub-módulo site_users_blog e melhora negociador de tema
Sub-módulo site_users_blog:
- Tipo de conteúdo blog_post (título, corpo, imagem, assuntos)
- Vocabulário blog_tags para categorias
- Listagem em /user/{uid}/blog via Views com filtro contextual por autor
- Padrão Pathauto: user/[node:author:uid]/blog/[node:title]
- hook_node_presave: preenche field_site_section com o autor
- hook_node_access: restringe criação às roles configuradas
- hook_preprocess_structural_pages_menu: injeta item "Blog" quando
usuário tem posts publicados
- Plugin BlogUserHandler: resolve usuário ancestral para rotas de blog
(post individual e listagem Views)
- Link "Post de blog" no menu "Adicionar" da conta
- Página de configuração de roles permitidas
- Update 10001: adiciona field_site_section a posts existentes
MicrositeThemeNegotiator:
- Injeta path.current para cobrir rotas sem parâmetro 'user' (ex.: Views)
- Qualquer path /user/{uid}/... recebe o tema do microsite
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
102
modules/site_users_blog/site_users_blog.module
Normal file
102
modules/site_users_blog/site_users_blog.module
Normal file
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Blog pessoal por usuário.
|
||||
*/
|
||||
|
||||
use Drupal\Core\Access\AccessResult;
|
||||
use Drupal\Core\Access\AccessResultInterface;
|
||||
use Drupal\Core\Session\AccountInterface;
|
||||
use Drupal\node\NodeInterface;
|
||||
use Drupal\user\UserInterface;
|
||||
|
||||
/**
|
||||
* Implements hook_node_presave().
|
||||
*
|
||||
* Preenche field_site_section com o autor do post para que o bloco de
|
||||
* navegação do structural_pages encontre o usuário ancestral corretamente.
|
||||
*/
|
||||
function site_users_blog_node_presave(NodeInterface $node): void {
|
||||
if ($node->bundle() !== 'blog_post') {
|
||||
return;
|
||||
}
|
||||
if (!$node->hasField('field_site_section') || !$node->get('field_site_section')->isEmpty()) {
|
||||
return;
|
||||
}
|
||||
$node->set('field_site_section', [
|
||||
'target_type' => 'user',
|
||||
'target_id' => $node->getOwnerId(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_node_access().
|
||||
*
|
||||
* Restringe a criação de blog_post às roles configuradas pelo administrador.
|
||||
* Se nenhuma role estiver configurada, qualquer usuário autenticado pode criar.
|
||||
*/
|
||||
function site_users_blog_node_access(NodeInterface $node, string $op, AccountInterface $account): AccessResultInterface {
|
||||
if ($node->bundle() !== 'blog_post' || $op !== 'create') {
|
||||
return AccessResult::neutral();
|
||||
}
|
||||
|
||||
$allowed = \Drupal::config('site_users_blog.settings')->get('allowed_roles') ?? [];
|
||||
$allowed = array_filter($allowed);
|
||||
|
||||
$result = AccessResult::neutral()
|
||||
->addCacheTags(['config:site_users_blog.settings'])
|
||||
->cachePerUser();
|
||||
|
||||
if (empty($allowed)) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
foreach (array_keys($allowed) as $role) {
|
||||
if ($account->hasRole($role)) {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
return AccessResult::forbidden()
|
||||
->addCacheTags(['config:site_users_blog.settings'])
|
||||
->cachePerUser();
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_preprocess_structural_pages_menu().
|
||||
*
|
||||
* Adiciona o item "Blog" ao menu do microsite quando o usuário tem pelo menos
|
||||
* um post publicado.
|
||||
*/
|
||||
function site_users_blog_preprocess_structural_pages_menu(array &$variables): void {
|
||||
$user = site_users_get_microsite_user();
|
||||
if ($user === NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
$nids = \Drupal::entityTypeManager()->getStorage('node')
|
||||
->getQuery()
|
||||
->condition('uid', $user->id())
|
||||
->condition('type', 'blog_post')
|
||||
->condition('status', 1)
|
||||
->accessCheck(FALSE)
|
||||
->range(0, 1)
|
||||
->execute();
|
||||
|
||||
if (empty($nids)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$url = \Drupal\Core\Url::fromRoute('view.user_blog.page_user_blog', [
|
||||
'arg_0' => $user->id(),
|
||||
])->toString();
|
||||
|
||||
$variables['tree'][] = [
|
||||
'id' => 0,
|
||||
'title' => t('Blog'),
|
||||
'url' => $url,
|
||||
'is_redirect' => FALSE,
|
||||
'children' => [],
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user