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:
2026-02-26 08:06:10 -03:00
parent f58c8f90f4
commit bd24e6eb6b
9 changed files with 431 additions and 2 deletions

View File

@@ -145,9 +145,62 @@ class SiteUsersSettingsForm extends ConfigFormBase {
];
}
// Fieldset para view modes por role.
$form['role_view_modes'] = [
'#type' => 'fieldset',
'#title' => $this->t('Profile visibility options by role'),
'#description' => $this->t('Select which view modes each role can choose for their public profile. The "restricted" option is always available to all users.'),
'#tree' => TRUE,
];
$available_view_modes = $this->getCustomUserViewModes();
if (empty($available_view_modes)) {
$form['role_view_modes']['_empty'] = [
'#markup' => '<p>' . $this->t('No custom view modes found for user entities. Create view modes at <a href=":url">Manage display</a>.', [
':url' => '/admin/config/people/accounts/display',
]) . '</p>',
];
}
else {
$roles = \Drupal\user\Entity\Role::loadMultiple();
foreach ($roles as $role_id => $role) {
if (in_array($role_id, ['anonymous', 'authenticated'])) {
continue;
}
$form['role_view_modes'][$role_id] = [
'#type' => 'checkboxes',
'#title' => $role->label(),
'#options' => $available_view_modes,
'#default_value' => $config->get('role_view_modes.' . $role_id) ?? [],
];
}
}
return parent::buildForm($form, $form_state);
}
/**
* Returns custom user view modes (excluding 'default' and 'restricted').
*
* @return array
* Associative array of machine_name => label.
*/
protected function getCustomUserViewModes(): array {
$view_mode_storage = \Drupal::entityTypeManager()->getStorage('entity_view_mode');
$view_modes = $view_mode_storage->loadByProperties(['targetEntityType' => 'user']);
$options = [];
foreach ($view_modes as $view_mode) {
$id_parts = explode('.', $view_mode->id());
$machine_name = end($id_parts);
if ($machine_name === 'default' || $machine_name === 'restricted') {
continue;
}
$options[$machine_name] = $view_mode->label();
}
return $options;
}
/**
* {@inheritdoc}
*/
@@ -177,6 +230,17 @@ class SiteUsersSettingsForm extends ConfigFormBase {
}
}
// Salvar role_view_modes: apenas os valores marcados (filtrar 0).
$role_view_modes_raw = $form_state->getValue('role_view_modes') ?? [];
$roles = \Drupal\user\Entity\Role::loadMultiple();
foreach ($roles as $role_id => $role) {
if ($role_id === 'anonymous' || !isset($role_view_modes_raw[$role_id])) {
continue;
}
$selected = array_values(array_filter($role_view_modes_raw[$role_id]));
$config->set('role_view_modes.' . $role_id, $selected);
}
$config->save();
parent::submitForm($form, $form_state);