Saat Anda menetapkan bidang sebagai readonly, browser mengunci bidang dan mengirim data kembali ke server setelah pengiriman. Atribut lainnya adalah disabledyang mengunci bidang dan tidak mengirim data kembali ke server.
Untuk kedua kasus, Anda dapat secara paksa mengatur nilainya menjadi sama setelah pengiriman. Jadi, bahkan ketika bidang diatur ke readonlyatau disabled, dan pengguna memodifikasi HTML dan mengirim data yang berbeda, $form_state['values']akan tetap tidak berubah.
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;
}
Perhatikan bahwa kita atur #value dari #default_value. #default_value adalah cara biasa untuk menetapkan nilai default yang dimuat saat formulir dibuat, dan $form_state['values']akan berisi nilai default_value atau input pengguna. Ketika Anda mengatur #valuesecara eksplisit, input pengguna diabaikan dan #valueakan digunakan.
Bagaimanapun, saya akan merekomendasikan untuk digunakan '#access' => FALSE,ketika menyembunyikan elemen formulir. Ini akan menghapus elemen sepenuhnya, sementara memungkinkan Anda untuk menggunakan nilainya.
field_permissionsakan lebih mudah daripada melakukan pekerjaan dengan cara yang kotor.