it-swarm.com.de

Wie erhalte ich bei Änderung den ausgewählten Wert der Formular-API #states?

Wenn ich mit #states Die Sichtbarkeit eines Formularfelds festlege, überprüfe ich ein Eingabeelement auf seinen Wert. Gibt es dann eine Möglichkeit, den ausgewählten Wert in dem Moment abzurufen, in dem er ausgewählt wurde?

Im folgenden Arbeitsbeispiel zeige ich ein Markup an, wenn eine Auswahlliste value != '_none' Ist. Es funktioniert soweit gut. Aber wie bekomme ich das Markup, um den von mir ausgewählten Wert anzuzeigen?

Hintergrund ist: Es handelt sich um eine Auswahlliste für Knotenreferenzen, und ich versuche möglicherweise, einige Felder des ausgewählten Knotens als Vorschau in das Markup zu laden. In dem Moment, in dem ich das schreibe, denke ich, dass es eine dumme Idee ist. Ich bin mit #states In Ajax, oder? Und es gibt vielleicht keine Möglichkeit, node_load() oder ähnliches aufzurufen, oder?

/**
 * Implements hook_form_alter().
 */
function MY_MODULE_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == 'MY_FORM') {

    $form['my_container'] = [
      '#type'   => 'container',
      '#states' => [
        'visible' => [
          ':input[name="my_field_name[und]"]' => ['!value' => '_none'],
        ],
      ],
    ];

    $form['my_container']['markup'] = [
      '#type'   => 'markup',
      '#markup' => /* selected value here */ ,
    ];
  }
}
6
leymannx

Drupal #states ist nichts anderes als die Seite mit JS-Daten und states.js Lesen und Hinzufügen der erforderlichen JS-Ereignisse zum Ausblenden/Anzeigen/usw. von Feldern. Im Moment gibt es kein #states -basierte Methode zum Abrufen des ausgewählten Werts.

Beachten Sie, dass es vollkommen in Ordnung ist, #states an Elemente, die über Ajax übergeben werden. Das Schöne ist, wann immer etwas #states wird gerendert, Drupal leitet diese JS-Daten zusammen mit der Ajax-Antwort weiter. Da Verhaltensweisen jedes Mal nach einer Ajax-Antwort ausgeführt werden, states.js kann seine Sichtbarkeitsregeln auch für von Ajax geänderte Elemente aktualisieren.

Ich denke, Ihre Lösung wäre, #ajax um dies zu tun. Ihre [#ajax]['callback'] enthält gerade ausgewählte Werte in $form_state['input'], damit du sie benutzen kannst.

5
AyeshK

Vielen Dank an @AyeshK und @Beebee, dass sie mich in die richtige Richtung gelenkt haben. So habe ich endlich den ausgewählten Wert gefunden und über einen ['#ajax']['callback'] Angezeigt, den ich an die Auswahlliste node_reference Angehängt habe. Von da an ist es ganz einfach, das Markup an erweiterte Anforderungen wie das Anzeigen einer Vorschau eines Knotens oder eines Felds anzupassen.

Am Ende möchten Sie möglicherweise einen zweiten Wrapper mit derselben ID hinzufügen, um den Standardwert beim Bearbeiten eines vorhandenen Knotens beizubehalten.

/**
 * Implements hook_form_alter().
 */
function MY_MODULE_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == 'MY_FORM') {

        // add an Ajax callback to the select list and define a wrapper the action should happen in
        $form['field_node_reference'][LANGUAGE_NONE]['#ajax']['callback'] = '_MY_MODULE_ajax_callback';
        $form['field_node_reference'][LANGUAGE_NONE]['#ajax']['wrapper'] = 'MY-ID';

        // create a wrapper
        $form['MY_WRAPPER'] = array(
            '#type' => 'markup',
            '#prefix' => '<div id="MY-ID">',
            '#suffix' => '</div>',
            '#weight' => 3,
            );

        // do some magic
        if (isset($form_state['values']['field_node_reference'][LANGUAGE_NONE][0]['nid']) && $form_state['values']['field_node_reference'][LANGUAGE_NONE][0]['nid'] != '') {

            $nid = $form_state['values']['field_node_reference'][LANGUAGE_NONE][0]['nid'];
            $form['MY_WRAPPER']['#markup'] = t('You selected node number: @nid', array('@nid' => $nid));
        }
    }
}

function _MY_MODULE_ajax_callback(&$form, &$form_state) {
    // return the wrapper
    return $form['MY_WRAPPER'];
}
2
leymannx