web-dev-qa-db-fra.com

Désactiver le paramètre de langue de l'utilisateur dans la page de modification par l'utilisateur

Je veux désactiver cette partie spécifique du formulaire de paramètres dans le modèle php. J'ai trouvé un exemple de code pour Drupal 6, mais je ne sais pas comment le faire dans Drupal 7.

J'ai essayé cela sans résultat:

if ($form_id == 'user_profile_form') {
  unset($form['language']);
}

(Il y a un module "réglages utilisateur" mais je veux qu'il le fasse dans le pré-processus)

5
cateye

J'ai créé les deux projets mentionnés et je les ai maintenus pendant un certain temps. (J'ai arrêté de maintenir Drupal 6 et 7 modules.)

Le code utilisé dans le module Désactiver le langage utilisateur n'est pas correct: unset() ne doit jamais être utilisé pour les éléments de formulaire, car cela causerait des problèmes aux modules qui tentent d'accéder à l'élément de formulaire.

Le code correct est le suivant. Il serait préférable que le code soit exécuté après que d'autres modules exécutent leur propre code.

/**
 * Implements hook_form_alter().
 */
function mytheme_form_alter(&$form, $form_state, $form_id) {
  // The language selector is only displayed if there is more than one language.
  if (drupal_multilingual()) {
    if ($form_id == 'user_register_form' || ($form_id == 'user_profile_form' && $form['#user_category'] == 'account')) {
      if (count(element_children($form['locale'])) > 1) {
        $form['locale']['language']['#access'] = FALSE;
      }
      else {
        $form['locale']['#access'] = FALSE;
      }
    }
  }
}

Dans mon module, j'ai également utilisé hook_init() pour remplacer $user->language Par une valeur par défaut; autrement $user->language aurait la dernière valeur enregistrée.

/**
 * Implements hook_init().
 */
function dul_init() {
  if (!user_access('change own user language')) {
    global $user;

    $user->language = language_default('language');
  }
}

De toute évidence, le module Disable user language possède sa propre autorisation, qui permet de sélectionner les utilisateurs autorisés à sélectionner leur propre langue, mais cette partie n'est pas strictement nécessaire.

J'ai utilisé hook_init() car la documentation de hook_user_load() contient l'avertissement suivant:

En raison du cache statique dans user_load_multiple() vous ne devez pas utiliser ce hook pour modifier les propriétés utilisateur renvoyées par la table {users} elle-même car cela peut entraîner des résultats peu fiables lors du chargement à partir du cache .

Le code modifie également à la volée une propriété pour l'utilisateur actuellement connecté, sans apporter de modifications dans la base de données. hook_user_load() ne servirait pas cet objectif, car il est invoqué à chaque fois qu'un module appelle user_load().

14
kiamlaluno

J'ai jeté un œil au module " Disable user language ".

Cette partie du code me suffit en effet:

function template_form_user_profile_form_alter(&$form, $form_state) {
   unset($form['locale']);
}
5
cateye

Pour ceux qui, pour quelque raison que ce soit, ne peuvent/ne peuvent pas faire de PHP, un moyen simple de masquer le bloc des paramètres de langue dans Drupal 7 est d'ajouter le CSS suivant à la page de modification de l'utilisateur) :

#user-profile-form fieldset#edit-locale
{
    display: none;
}

Ayant essayé plusieurs méthodes d'ajout de CSS aux pages, ma méthode préférée est le module CSS Injector ( https://www.drupal.org/project/css_injector ). Je le trouve facile à utiliser, efficace et un endroit pratique pour maintenir la totalité de mon CSS injecté.

P.S. Je me rends compte que c'est un vieux post, mais je l'ai lu à la recherche d'une réponse, alors je pense que d'autres le feront aussi.

1
Marshall Morrise

Dans drupal 8, nous pouvons désactiver en utilisant le code ci-dessous

function digicare_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id){ if($form_id = "user_register_form" || $form_id = "user_profile_form"){ $form['language']['#access'] = FALSE; } }

0
nehapandya