mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/site_users.git
synced 2026-05-03 14:30:41 -03:00
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>
103 lines
2.6 KiB
Plaintext
103 lines
2.6 KiB
Plaintext
<?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' => [],
|
|
];
|
|
}
|