Cuando configura un campo como readonly, el navegador bloquea el campo y envía los datos de vuelta al servidor al enviarlo. Otro atributo es disabledque 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 readonlyo disabled, y el usuario modificó el HTML y envió datos diferentes, $form_state['values']permanecerá sin cambios.
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;
}
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 #valueexplícitamente, la entrada del usuario se ignora y #valuese utilizará.
De todos modos, recomiendo usar '#access' => FALSE,al ocultar elementos de formulario. Eliminará el elemento por completo, mientras le permite utilizar sus valores.
field_permissionssería más fácil que hacer el trabajo de manera sucia.