it-swarm-id.com

Bagaimana cara membuat bidang yang hanya menerima nilai unik?

Saya menggunakan modul Field Collection karena saya memiliki hubungan yang rumit antara field, dan saya telah mencoba mengintegrasikannya dengan modul nique field , tanpa hasil, karena - Bidang unik modul tidak didukung oleh modul Koleksi Lapangan .

Apakah ada metode yang lebih sederhana untuk memeriksa apakah nilainya unik, dan untuk menampilkan kesalahan validasi, jika nilainya tidak unik?

Sayangnya, Drupal 7 tidak memiliki fitur ini secara default, jadi harus ada metode untuk melakukan ini.

4
Ek Kosmos

Akhirnya, inilah bagaimana saya mengadaptasi dan menempelkan saran dari @tostinni, @stefgosselin, @ uwe999 jawaban dan lainnya:

/**
 * implementation of hook_form_alter().
 */
function CUSTOM_MODULE_form_alter(&$form, &$form_state, $form_id) {
    switch ($form_id) {
        case 'MY_FORM_ID':
            // add custom validation callback
            $form['#validate'][] = 'CUSTOM_MODULE_MY_FORM_ID_validate';
            break;
            ...
        default:
            break;
    }
}

maka semua fungsi yang saya implementasikan di:

/**
 * implementation of hook_form_FORM_ID_alter
 */
function CUSTOM_MODULE_MY_FORM_ID_validate(&$form, &$form_state) {

    //retrieve the value for your field
    $value = $form_state['values']['field_MY_FIELD']['und'][0]['value'];

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
            ->fieldCondition('field_MY_FIELD', 'value', $value)
            ->count();
    $count = $query->execute();
    if ($count > 0) {
        form_set_error('field_MY_FIELD', 'Unique field value is already used.');
    }
}

Saya sudah mencoba bekerja dengan entity_metadata_wrapper tapi sayangnya saya belum berhasil.

Terima kasih atas jawaban anda.

1
Ek Kosmos

Anda perlu mengimplementasikan ini dalam modul khusus, berikut ini contoh kode untuk mencapai ini:

function custom_node_validate($node, $form) {
  if ($node->type == 'page') {
    //retrieve the value for your field using Entity API
    $wrapper = entity_metadata_wrapper('node', $node);
    $value = $wrapper->field_collection->field_unique->value();

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
      ->fieldCondition('field_unique', 'value', $value)
      ->count();
    $count = $query->execute();
    if ($count > 1) {
      form_set_error('field_unique', 'Unique field value is already used.');
    }
  }
}

Beberapa penafian:

  • Saya benar-benar diisi oleh kompleksitas Bidang API Pengumpulan Lapangan dan itu cukup rumit untuk menemukan informasi yang baik tentang cara mengambil nilai dan membuat kueri.
  • Saya benar-benar menikmati melakukan query SQL (lihat Bagaimana mengubah pengaturan lapangan setinggi-tingginya ) tetapi saya mencoba hanya menggunakan API alih-alih melakukan kueri sederhana di atas meja field_data_field_unique. Namun itu mungkin belum sempurna jadi silakan berpadu.
  • form_set_error () tidak menyoroti bidang, saya tidak dapat menemukan nama yang benar.

Berikut dokumentasi yang saya gunakan:

Edit: Mengikuti saran chx, untuk meneruskan langsung field_name Ke fieldCondition().

8
tostinni

Saya belum memprogram modul tetapi sepertinya akan lebih mudah untuk menulis hook di form_alter dan kemudian query terhadap bidang "nomor seri" yang ada untuk memastikan itu unik.

4
uwe

Pada dasarnya Ek Kosmos memiliki ide dasar. Yang paling mudah adalah membuat modul kecil khusus , ini memiliki keuntungan dengan mengisolasi fitur yang ingin Anda buat, dan mengingat aturan # 1, Anda benar-benar tidak pernah ingin meretas inti apa pun, kecuali Anda benar-benar tidak dapat menghindarinya.

Setelah Anda menyiapkan file .info di folder dan file .module siap digunakan seperti yang ditunjukkan dalam banyak cara-caranya tentang subjek , Anda meningkatkan kekuatan hook_form_alter dengan menulis fungsi bernama nama-modul-Anda _form_alter dalam file modul Anda dan Anda tahu fungsi itu akan dipanggil.

Anda mungkin akan membutuhkan pernyataan pergantian yang tergantung pada formulir) ubah untuk melakukan tindakan tertentu bergantung pada formulir id ,

Anda mungkin perlu mencoba menambahkan atribut (#validate) yang menambahkan pemanggilan fungsi pada form array, menjadi nama fungsi dari fungsi validasi kustom Anda sendiri.

Sesuatu seperti:

   // #validate adds callback to custom validator.
   $validators = $form['#validate'][]; // Save existing validation calls. 
   //  Not clear in docs, but this is important!

  // In your case, you may want to add a method callback with this attribute.                                   
  $form['#validate'][] = $validators . ' _custom_validate';

Tentu saja, dalam fungsi validasi Anda, Anda dapat mencatat kesalahan, mengalihkan, menetapkan pesan kesalahan atau pemberitahuan.

Baca form api dan unduh contoh form .

Jika Anda membutuhkan bantuan dan banyak contoh, unduh modul contrib dan lihat bagaimana orang lain mengatasi binatang buas, atau kirim pertanyaan di sini saat Anda melanjutkan.

Senang conding, semoga sukses.

1
stefgosselin

Coba dengan validasi bidang modul, gunakan validator unik. Tambahkan aturan validasi, pilih lingkup unik, global, entitas, bundel.

1
ghr