mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/site_users.git
synced 2026-03-09 09:57:41 -03:00
feat: View mode por role/usuário com seletor de visibilidade no perfil
- Cria view mode e display 'restricted' (template mostra só username + mensagem) - Adiciona campo field_user_selected_view_mode (string, default: restricted) - update_10006: provisiona view mode, display e campo; inicializa role_view_modes - Seletor de visibilidade no form de edição do perfil (owner e admin) - hook_entity_view_mode_alter lê o campo e valida existência do display - Formulário de admin: checkboxes de view modes por role (exceto anonymous e authenticated) - Schema YAML completo para site_users.settings incluindo role_view_modes - Tradução pt-BR de todas as novas strings Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -165,6 +165,27 @@ function site_users_install() {
|
||||
$view_display->save();
|
||||
}
|
||||
|
||||
// Criar view mode 'restricted'.
|
||||
$view_mode_storage = \Drupal::entityTypeManager()->getStorage('entity_view_mode');
|
||||
if (!$view_mode_storage->load('user.restricted')) {
|
||||
\Drupal\Core\Entity\Entity\EntityViewMode::create([
|
||||
'id' => 'user.restricted',
|
||||
'label' => 'Restricted',
|
||||
'targetEntityType' => 'user',
|
||||
])->save();
|
||||
}
|
||||
|
||||
// Criar view display 'restricted' vazio (template controla a exibição).
|
||||
$display_storage = \Drupal::entityTypeManager()->getStorage('entity_view_display');
|
||||
if (!$display_storage->load('user.user.restricted')) {
|
||||
\Drupal\Core\Entity\Entity\EntityViewDisplay::create([
|
||||
'targetEntityType' => 'user',
|
||||
'bundle' => 'user',
|
||||
'mode' => 'restricted',
|
||||
'status' => TRUE,
|
||||
])->save();
|
||||
}
|
||||
|
||||
// Conceder permissão "access user profiles" ao papel anonymous.
|
||||
$anonymous_role = \Drupal\user\Entity\Role::load('anonymous');
|
||||
if ($anonymous_role && !$anonymous_role->hasPermission('access user profiles')) {
|
||||
@@ -388,6 +409,84 @@ function site_users_update_10003() {
|
||||
return t('Nenhuma correção necessária nos mapeamentos LDAP.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Cria view mode 'restricted', campo field_user_selected_view_mode e config role_view_modes.
|
||||
*/
|
||||
function site_users_update_10006() {
|
||||
$view_mode_storage = \Drupal::entityTypeManager()->getStorage('entity_view_mode');
|
||||
$display_storage = \Drupal::entityTypeManager()->getStorage('entity_view_display');
|
||||
|
||||
// 1. Criar view mode 'restricted'.
|
||||
if (!$view_mode_storage->load('user.restricted')) {
|
||||
\Drupal\Core\Entity\Entity\EntityViewMode::create([
|
||||
'id' => 'user.restricted',
|
||||
'label' => 'Restricted',
|
||||
'targetEntityType' => 'user',
|
||||
])->save();
|
||||
}
|
||||
|
||||
// 2. Criar view display 'restricted' vazio (template controla a exibição).
|
||||
if (!$display_storage->load('user.user.restricted')) {
|
||||
\Drupal\Core\Entity\Entity\EntityViewDisplay::create([
|
||||
'targetEntityType' => 'user',
|
||||
'bundle' => 'user',
|
||||
'mode' => 'restricted',
|
||||
'status' => TRUE,
|
||||
])->save();
|
||||
}
|
||||
|
||||
// 3. Criar field storage se não existir.
|
||||
if (!FieldStorageConfig::loadByName('user', 'field_user_selected_view_mode')) {
|
||||
FieldStorageConfig::create([
|
||||
'field_name' => 'field_user_selected_view_mode',
|
||||
'entity_type' => 'user',
|
||||
'type' => 'string',
|
||||
'settings' => [
|
||||
'max_length' => 64,
|
||||
'is_ascii' => TRUE,
|
||||
'case_sensitive' => FALSE,
|
||||
],
|
||||
'cardinality' => 1,
|
||||
'translatable' => FALSE,
|
||||
])->save();
|
||||
}
|
||||
|
||||
// 4. Criar field instance se não existir.
|
||||
if (!FieldConfig::loadByName('user', 'user', 'field_user_selected_view_mode')) {
|
||||
FieldConfig::create([
|
||||
'field_name' => 'field_user_selected_view_mode',
|
||||
'entity_type' => 'user',
|
||||
'bundle' => 'user',
|
||||
'label' => 'Profile visibility',
|
||||
'description' => 'Controls how this profile appears to other visitors.',
|
||||
'required' => FALSE,
|
||||
'default_value' => [['value' => 'restricted']],
|
||||
])->save();
|
||||
}
|
||||
|
||||
// 5. Remover do form display.
|
||||
$form_display = EntityFormDisplay::load('user.user.default');
|
||||
if ($form_display) {
|
||||
$form_display->removeComponent('field_user_selected_view_mode')->save();
|
||||
}
|
||||
|
||||
// 6. Remover de todos os view displays existentes.
|
||||
$displays = $display_storage->loadMultiple();
|
||||
foreach ($displays as $display) {
|
||||
if ($display->getTargetEntityTypeId() === 'user' && $display->getComponent('field_user_selected_view_mode')) {
|
||||
$display->removeComponent('field_user_selected_view_mode')->save();
|
||||
}
|
||||
}
|
||||
|
||||
// 7. Adicionar role_view_modes ao config se ausente.
|
||||
$config = \Drupal::configFactory()->getEditable('site_users.settings');
|
||||
if ($config->get('role_view_modes') === NULL) {
|
||||
$config->set('role_view_modes', [])->save();
|
||||
}
|
||||
|
||||
return t("View mode 'restricted' e campo field_user_selected_view_mode criados.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Corrige mapeamentos LDAP com campos de string nulos na config ativa.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user