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?
field_permissions
serait plus facile que de faire le travail de manière sale.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 estdisabled
celui 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
readonly
oudisabled
, et que l'utilisateur a modifié le code HTML et envoyé des données différentes,$form_state['values']
reste inchangé.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#value
explicitement, l'entrée utilisateur est ignorée et#value
sera 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.la source
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!
la source
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
la source
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).
la source
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.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.
la source