mirror of
https://gitlab.unicamp.br/infimecc_drupal11_modules/site_users.git
synced 2026-03-10 18:27:42 -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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user