Estoy tratando de hacer que algunos de los campos del formulario de perfil de Drupal sean de solo lectura en el modo de edición. Estoy usando el siguiente código en 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;
}
En la interfaz de usuario presentada se muestra como de solo lectura, pero aún así, puedo cambiar el valor usando firebug y guardar. ¿Hay alguna forma de prevenir este comportamiento?
field_permissions
sería más fácil que hacer el trabajo de manera sucia.Cuando configura un campo como
readonly
, el navegador bloquea el campo y envía los datos de vuelta al servidor al enviarlo. Otro atributo esdisabled
que bloquea el campo y no envía datos al servidor.Para ambos casos, puede establecer forzosamente el valor para que sea el mismo después del envío. Por lo tanto, incluso cuando el campo se establece en
readonly
odisabled
, y el usuario modificó el HTML y envió datos diferentes,$form_state['values']
permanecerá sin cambios.Tenga en cuenta que establecemos
#value
desde #default_value. #default_value es la forma habitual de establecer el valor predeterminado que se carga cuando se crea el formulario, y$form_state['values']
contendrá el valor predeterminado o la entrada del usuario. Cuando configura#value
explícitamente, la entrada del usuario se ignora y#value
se utilizará.De todos modos, recomiendo usar
'#access' => FALSE,
al ocultar elementos de formulario. Eliminará el elemento por completo, mientras le permite utilizar sus valores.fuente
No puede evitar que Firebug cambie los campos de solo lectura. Pero si el campo de texto es de solo lectura, su único propósito es mostrar datos. Entonces, ¿por qué no cambiar el elemento de entrada contra un elemento de texto?
En su lugar, podría usar el atributo "deshabilitado", porque los campos de entrada deshabilitados no se envían al servidor.
¡También puede eliminar el atributo "deshabilitado" con firebug, pero el núcleo de drupal no reacciona ante los cambios de los campos de entrada deshabilitados!
fuente
La forma más segura de hacer esto es cambiar el tipo de campo para que sea un 'elemento'. http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item
fuente
Puede usar Permisos de campo + Solo lectura de campo .
Los permisos de campo le permitirán hacer que algunos de sus campos no sean accesibles para ciertos usuarios.
Field Readonly le permitirá mostrar los campos no accesibles como elementos de solo lectura en los formularios de edición (en lugar de ocultarlos).
fuente
Creo que usar
#disabled = true;
es la forma más fácil de lograr esto en lugar de agregar algún módulo pesado a su núcleo, como ejemplo, deshabilito la edición del campo de imagen personalizado en user_profile_form cuando el usuario lo llena antes.Además, puede verificar el rol de usuario y simplemente deshabilitar (campo de solo lectura) para usuarios no administradores.
fuente