Files
site_users/modules/site_users_blog/site_users_blog.module
Quintino A. G. Souza d72f41de97 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>
2026-03-24 07:32:10 -03:00

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' => [],
];
}