Cara membuat bidang dibaca hanya menggunakan hook_form_alter


12

Saya mencoba menjadikan beberapa bidang formulir profil Drupal sebagai hanya-baca dalam mode edit. Saya menggunakan kode berikut di 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;
}

Di UI yang diajukan ditampilkan sebagai hanya-baca, tapi tetap saja, saya bisa mengubah nilainya menggunakan pembakar dan menyimpan. Apakah ada cara untuk mencegah perilaku ini?

Jawaban:


6

Sepertinya Anda bisa mencapai apa yang Anda butuhkan dengan Izin Bidang . Berdasarkan bidang per bidang, Anda dapat menetapkan izin untuk:

  • Buat nilai sendiri untuk bidang tersebut
  • Edit nilai sendiri untuk bidang tersebut
  • Edit nilai siapa pun untuk bidang tersebut
  • Lihat nilai sendiri untuk bidang tersebut
  • Lihat nilai siapa pun untuk bidang tersebut

Jadi, Anda akan dapat dengan mudah mengizinkan pengguna Anda untuk membuat nilai untuk bidang tersebut pada awalnya, tetapi begitu mereka memilikinya, hanya dapat diedit oleh admin.


+1. Karena OP ingin mengizinkan admin mengedit nilai, field_permissionsakan lebih mudah daripada melakukan pekerjaan dengan cara yang kotor.
AyeshK

Ya, ini adalah jawaban yang jauh lebih baik daripada saya :)
Alfred Armstrong

6

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.


1

Anda tidak dapat mencegah Firebug dari mengubah bidang hanya baca. Tetapi jika bidang teks hanya dibaca, itu hanya tujuannya adalah untuk menampilkan data. Jadi mengapa tidak mengubah elemen input terhadap elemen teks?

Anda dapat menggunakan atribut "cacat" sebagai gantinya, karena bidang input yang dinonaktifkan tidak dikirim ke server.

Anda dapat menghapus atribut "nonaktif" dengan pembakar juga, tetapi inti drupal tidak bereaksi pada perubahan bidang input yang dinonaktifkan!


Terima kasih larrydahooster atas bantuannya. Persyaratan saya adalah seperti mengunci beberapa bidang yang diisi oleh pengguna pada saat pendaftaran. Sementara pada mode edit profil ingin menampilkan informasi ini kepada pengguna, tetapi ingin mencegah pengguna untuk memperbarui bidang ini. Hanya pengguna super yang dapat mengedit bidang ini
Jayesh Jose


1

Anda dapat menggunakan Izin Bidang + Bidang Baca Saja .

Izin Bidang akan memungkinkan Anda untuk membuat beberapa bidang Anda tidak dapat diakses oleh pengguna tertentu.

Field Readonly akan memungkinkan Anda untuk menampilkan bidang yang tidak dapat diakses sebagai item hanya-baca pada formulir edit (alih-alih menyembunyikannya).


1

Saya pikir menggunakan #disabled = true;adalah cara termudah untuk mencapai ini alih-alih menambahkan beberapa modul berat ke inti Anda, sebagai contoh saya menonaktifkan edit bidang gambar kustom di user_profile_form ketika itu diisi oleh pengguna sebelumnya.

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);
        }
}

Juga, Anda dapat memeriksa peran pengguna dan hanya menonaktifkan (bidang baca-saja) untuk bukan admin pengguna.

    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);
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.