Secara terprogram mengatur nilai default untuk suatu bidang

10

Di Drupal 6, kita bisa menggunakan PHP untuk menetapkan nilai default, tetapi kode yang sama tidak dapat digunakan dengan Drupal 7.

Saya mencoba melakukan ini hook_form_alter(), tetapi kode tidak berfungsi.

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"]['#default_value'] = $default;
      // …
      break;
  }
}
giorgio79
sumber

Jawaban:

17

Dengan asumsi bahwa fungsi perubahan bentuk Anda benar-benar berjalan (yang dapat Anda konfirmasi dengan panggilan itu dsm()), sebenarnya ada 2 level array yang perlu Anda turuni untuk bisa masuk ke elemen bidang:

$form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;

Dalam Drupal 7 Anda memiliki array nilai untuk setiap bahasa bidang telah diterjemahkan ke dalam (sehingga bidang dengan kardinalitas ganda / tak terbatas dapat dipenuhi), dan di bawah masing-masing dalam array untuk berbagai kolom bidang yang berbeda. Dalam sebagian besar kasus ini akan menjadi 'nilai' tetapi tidak selalu (misalnya bidang gambar memiliki kolom id file, kolom alt dll)

Semoga itu bisa membantu

Clive
sumber
Ini satu kedalaman lagi :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79
2
Jawaban ini tidak akan berfungsi untuk semua widget; tergantung pada bagaimana mereka menentukan nilainya. Misalnya, dengan bidang entitasreferensi, gunakan: $ form ['field_name'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee
@ Renee Sangat benar; ada penjelasan yang lebih mendalam di sini
Clive
1
Nilai kolom selalu memiliki bahasa @Mouneer, jika Anda tidak memiliki situs multibahasa, standarnya LANGUAGE_NONEharus digunakan
Clive
1
Memang, saya bisa menjelaskan bahwa @Mouneer sedikit lebih baik :) Anda akan menemukan bahasa saat ini dalam bentuk di suatu tempat (saya pikir mungkin $form['#entity']->languagetapi saya harus memeriksa, sehingga dapat digunakan sebagai pengganti konstanta. Kode Pengambilan juga akan menggunakan bahasa saat ini sebagaimana ditentukan oleh $languageglobal, tetapi ada metode API untuk membantu dengan itu ( field_get_itemsatau bahkan lebih baik yang EntityMetadataWrapperdisediakan oleh modul entitas)
Clive
0

Ini benar:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;
      // …
      break;
  }
}
keopx
sumber
0

Ini berfungsi dengan baik:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);
  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"][0]['value']['#default_value']=$default;
      break;
  }
}
keopx
sumber