Legen Sie programmgesteuert den Standardwert für ein Feld fest

10

In Drupal 6 könnten wir PHP verwenden, um Standardwerte festzulegen, aber der gleiche Code kann nicht mit Drupal 7 verwendet werden.

Ich versuche dies durchzuarbeiten hook_form_alter(), aber der Code funktioniert nicht.

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
quelle

Antworten:

17

Angenommen, Ihre Formularänderungsfunktion wird tatsächlich ausgeführt (was Sie mit diesem Aufruf bestätigen können dsm()), müssen Sie tatsächlich zwei weitere Array-Ebenen aufrufen, um zum Feldelement zu gelangen:

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

In Drupal 7 haben Sie ein Array von Werten für jede Sprache, in die das Feld übersetzt wurde (so dass Felder mit mehrfacher / unbegrenzter Kardinalität berücksichtigt werden können), und unter jeder dieser Felder befindet sich ein Array für die verschiedenen Feldspalten. In den meisten Fällen ist dies 'Wert', aber nicht immer (zum Beispiel hat ein Bildfeld eine Datei-ID-Spalte, eine Alt-Spalte usw.).

hoffentlich hilft das

Clive
quelle
Es ist noch eine Tiefe :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79
2
Diese Antwort funktioniert nicht für alle Widgets. hängt davon ab, wie sie ihren Wert angeben. Verwenden Sie beispielsweise bei einem Entityreference-Feld: $ form ['field_name'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee
@ Renée Sehr wahr; es gibt eine tiefer gehende Erklärung hier
Clive
1
Feldwerte haben immer die Sprache @Mouneer. Wenn Sie keine mehrsprachige Site haben, sollte die Standardeinstellung LANGUAGE_NONEverwendet werden
Clive
1
In der Tat hätte ich das etwas besser erklären können @Mouneer :) Sie finden die aktuelle Sprache irgendwo im Formular (ich denke vielleicht, $form['#entity']->languageaber ich müsste das überprüfen, damit sie anstelle einer Konstante verwendet werden kann. Abrufcode würde auch die aktuelle Sprache verwenden, wie von der $languageglobalen bestimmt, aber es gibt API-Methoden, die dabei helfen ( field_get_itemsoder noch besser die EntityMetadataWrappervom Entity-Modul bereitgestellten)
Clive
0

Das ist richtig:

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
quelle
0

Das funktioniert gut:

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
quelle