it-swarm.com.de

Legen Sie die Auswahlfeldoptionen in form_alter fest

Ich habe ein Auswahlfeld mit dem Namen field_ee_project. Ich möchte die Auswahlfeldoptionen dynamisch auf hook_form_alter.

Was ich versucht habe


    function gamodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
       //check whether the form is effort estimation
        if($form_id = 'node_effordestimation_form'){
            $form['field_ee_project']['und']['#options'] = effort_estimation_project_autoload();
        }
     }

    /*
     * Effort estimation project field select box
     */
    function effort_estimation_project_autoload(){
            $matches = array();
            $result = db_query("SELECT ga_id,name FROM ga_projects");
            $row = $result->fetchAll();
            $row = json_decode(json_encode($row), True);
            foreach ($row as $key => $value) {
                $matches[$value['name']] = $value['name'];
             }
            return $matches;
    }

Aber es funktioniert nicht. Irgendeine Idee ?

4
Crazyrubixfan

Versuchen Sie dies, es sollte funktionieren.

 function gamodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
   //check whether the form is effort estimation
    if($form_id = 'node_effordestimation_form'){
        $form['field_ee_project']['widget']['#options']  = effort_estimation_project_autoload();
    }
 }

function effort_estimation_project_autoload(){
                $matches = array();
                $result = db_query("SELECT ga_id,name FROM ga_projects");
                $row = $result->fetchAll();
                $row = json_decode(json_encode($row), True);
                foreach ($row as $key => $value) {
                    $matches[$key] = $value['name'];
                 }
                return $matches;
        }
2
Shreya Shetty

Die Feldtyp-API ist in Drupal 8) strenger, sodass Webdienste und Formulare demselben Validierungspfad folgen. Dies ist nicht immer das gewünschte Verhalten.

Wenn ich Ihre Frage noch einmal betrachte, denke ich, dass die Verwendung eines Rückrufs für zulässige Werte auf dem Feld ebenfalls funktionieren würde.

Ich habe einige Alternativen bereitgestellt, die auf den Einschränkungen basieren, die der Kern in Listenfeldern unter # 1 festlegt, falls das Folgende nicht wie beabsichtigt funktioniert. Diese könnten für andere Leute nützlich sein, die ähnliche Dinge tun.

# 1: Versuchen Sie stattdessen, den Rückruf zulässiger Werte für das Feld zu verwenden

Legen Sie einen allow_values_callback für das Listenfeld fest.

function gamodule_allowed_values_callback(FieldStorageDefinitionInterface $definition, FieldableEntityInterface $entity = NULL, &$cacheable = TRUE) {
  // @todo make this a bit more conditional based on the parameters above.
  $result = db_query("SELECT ga_id,name FROM ga_projects");
  $row = $result->fetchAll();
  $row = json_decode(json_encode($row), True);
  foreach ($row as $key => $value) {
    $matches[$key] = $value['name'];
  }
  return $matches;
}

Beachten Sie, dass in der Dokumentation zu callback_allowed_values_callback die Verwendung von opt-Gruppen erwähnt wird. Diese Funktionalität weist jedoch einen Fehler auf und ist in 8 fehlerhaft.

# 2: Listenfeld in Textfeld migrieren

Erstellen Sie ein Auswahllistenfeld-Widget für Textfelder. Migrieren Sie Ihre Daten über.

  • Viel Arbeit zum Umbau.
  • Kann ein Entwicklungsteam verwirren, das die Site erbt.

# 3: Überschreiben Sie das AllowedValues-Einschränkungs-Plugin

Verwenden hook_validation_constraint_alter, um Ihr eigenes Constraint-Plugin bereitzustellen (siehe Symfony 2 Constraint-Dokumentation).

  • Die Site ist nicht kompatibel mit einigen Contrib-Modulen, die dasselbe tun (select_or_other, cck_select_other).

# 4: Stellen Sie sicher, dass alle möglichen zulässigen Werte im Listenfeld sind

Verwenden Sie keine benutzerdefinierte Tabelle, um zulässige Werte zu speichern. Legen Sie die zulässigen Werte in der Listenfeldkonfiguration fest. Schreiben Sie ein Feld-Widget-Plugin.

Schreiben Sie Ihr eigenes Feld-Widget, das Optionen basierend auf anderen Parametern wie Ihrer Abfrage einschränkt.

# 5: Überschreiben Sie die Kernbehandlung von Listenfeld-Plugins mit Ihrer eigenen Implementierung

Verwenden hook_field_info_alter Core-Code überhaupt nicht verwenden. Schreiben Sie Ihr eigenes Plugin für den Listenfeldtyp mit einer besseren Implementierung von Optionen oder zulässigen Werten.

  • Kann ein Entwicklungsteam verwirren, das die Site erbt.
  • Alle Listenfelder verhalten sich jetzt so.
4
mradcliffe