Comment rendre un champ en lecture seule à l'aide de hook_form_alter

12

J'essaie de rendre certains des champs du formulaire de profil Drupal en lecture seule en mode édition. J'utilise le code suivant dans hook_alter

$form[field_organisation_company_name][und][0]['#after_build'][]='_build_element_readonly';

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    return $element;
}

Dans l'interface utilisateur, le fichier s'affiche en lecture seule, mais je peux toujours modifier la valeur à l'aide de Firebug et enregistrer. Existe-t-il un moyen d'empêcher ce comportement?

Jayesh Jose
la source

Réponses:

6

Il semble que vous puissiez accomplir ce dont vous avez besoin avec les autorisations de champ . Champ par champ, vous pouvez définir des autorisations pour:

  • Créer sa propre valeur pour le champ
  • Modifier sa propre valeur pour le champ
  • Modifier la valeur de n'importe qui pour le champ
  • Afficher sa propre valeur pour le champ
  • Voir la valeur de n'importe qui pour le domaine

Ainsi, vous seriez facilement en mesure de permettre à vos utilisateurs de créer la valeur du champ initialement, mais dès qu'ils l'ont, il ne devient modifiable que par un administrateur.

Clive
la source
+1. Comme OP veut permettre aux administrateurs de modifier la valeur, ce field_permissionsserait plus facile que de faire le travail de manière sale.
AyeshK
Oui, c'est une bien meilleure réponse que la mienne :)
Alfred Armstrong
6

Lorsque vous définissez un champ sur readonly, le navigateur verrouille le champ et renvoie les données au serveur lors de la soumission. Un autre attribut est disabledcelui qui verrouille le champ et ne renvoie pas de données au serveur.

Dans les deux cas, vous pouvez forcer la valeur à être la même après la soumission. Ainsi, même lorsque le champ est défini sur readonlyou disabled, et que l'utilisateur a modifié le code HTML et envoyé des données différentes, $form_state['values']reste inchangé.

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    $element['value']['#value'] = isset($element['value']['#default_value']) 
       ?  $element['value']['#default_value']
       :  ''; 
    return $element;
}

Notez que nous définissons à #value partir de #default_value. #default_value est la manière habituelle de définir la valeur par défaut qui se charge lors de la génération du formulaire et $form_state['values']contient la valeur par défaut ou l'entrée utilisateur. Lorsque vous définissez #valueexplicitement, l'entrée utilisateur est ignorée et #valuesera utilisée.

Quoi qu'il en soit, je recommanderais d'utiliser '#access' => FALSE,lorsque vous masquez des éléments de formulaire. Il supprimera complètement l'élément, tout en vous permettant d'utiliser ses valeurs.

AyeshK
la source
1

Vous ne pouvez pas empêcher Firebug de modifier les champs en lecture seule. Mais si le champ de texte est en lecture seule, son seul but est d'afficher des données. Alors pourquoi ne pas changer l'élément d'entrée contre un élément de texte?

Vous pouvez utiliser l'attribut "désactivé" à la place, car les champs de saisie désactivés ne sont pas envoyés au serveur.

Vous pouvez également supprimer l'attribut "désactivé" avec firebug, mais le noyau drupal ne réagit pas aux modifications des champs de saisie désactivés!

larrydahooster
la source
Merci larrydahooster pour l'aide. Mon exigence consiste à verrouiller certains des champs remplis par l'utilisateur au moment de l'inscription. En mode édition de profil, vous souhaitez afficher ces informations pour l'utilisateur, mais vous voulez empêcher l'utilisateur de mettre à jour ces champs. Seul un super utilisateur peut modifier ces champs
Jayesh Jose
1

La façon la plus sûre de le faire est de changer le type de champ pour qu'il soit un «élément». http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item

Alfred Armstrong
la source
En utilisant l'attribut #disabled, je résous le problème. Dans mon cas, seuls certains utilisateurs peuvent modifier le champ, tandis que d'autres peuvent uniquement afficher le champ. J'ai écrit une logique basée sur le rôle de l'utilisateur et résolu le problème. Merci à tous
Jayesh Jose
1

Vous pouvez utiliser Field Permissions + Field Readonly .

Les autorisations de champ vous permettront de rendre certains de vos champs non accessibles à certains utilisateurs.

Field Readonly vous permettra d'afficher les champs non accessibles en tant qu'éléments en lecture seule sur les formulaires d'édition (au lieu de les masquer).

anrikun
la source
1

Je pense que l'utilisation #disabled = true;est le moyen le plus simple d'y parvenir au lieu d'ajouter un module lourd à votre cœur, par exemple, je désactive la modification du champ d'image personnalisé dans user_profile_form lorsqu'il est rempli par l'utilisateur auparavant.

function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){

        if($form_id == 'user_profile_form'){
            if($form['field_national_front']['und'][0]['#default_value']['fid']){
                $form['field_national_front']['und']['#disabled'] = true;
             }
          //ym($form);
        }
}

En outre, vous pouvez vérifier le rôle de l'utilisateur et simplement le désactiver (champ en lecture seule) pour les utilisateurs non administrateurs.

    function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){
       global $user;
       if($form_id == 'user_profile_form'){
           if($form['field_national_front']['und'][0]['#default_value']['fid'] && !in_array('webadmin', $user->roles)){
              $form['field_national_front']['und']['#disabled'] = true;
         }
//ym($form);
    }
}
Yusef
la source