it-swarm.com.de

Die Formular-API-Auswahlliste zeigt keine leere Option an

Ich versuche, ein Formular hinzuzufügen, das Sie zwingt, eine Option aus einer Dropdown-Liste auszuwählen. Die Dokumentation sagt:

Wenn #required TRUE ist und kein #default_value vorhanden ist, wird dem Auswahlsteuerelement eine leere Option hinzugefügt, um den Benutzer zu zwingen, eine aktive Auswahl zu treffen.

http://api.drupal.org/api/drupal/developer%21topics%21forms_api_reference.html/7#empty_value

OK, das hört sich toll an. Das ist was ich will. Ich habe also den folgenden Code, um die Auswahlliste zu meinem Formular hinzuzufügen.

$form['test'] = array(
    '#type' => 'select',
    '#options' => array (
      1 => 'Very poor',
      2 => 'Not that bad',
      3 => 'Average',
      4 => 'Good',
      5 => 'Perfect',
    ),
    '#required' => TRUE,
    '#title' => 'Rating',
  );

Es ist eine Auswahlliste, sie ist erforderlich und es gibt keinen Standardwert. Ich sehe jedoch keine leere Option ...

Was mache ich falsch?

Aktualisiert

Das obige Element ist jetzt das einzige, was in mein Array geht. Wenn ich dpm() den $form Erhalte, bekomme ich folgendes zurück:

dpm

Update 2

Im Folgenden sehen Sie, was der Themenentwickler sieht:

theme devel

Update 3

Ich habe eine saubere Instanz von drupal 7.22) eingerichtet und meinen benutzerdefinierten Code installiert, und das Gleiche passiert. Ich habe das Minimalprofil verwendet. Muss etwas sein, was ich sonst falsch mache, wo ...

Update 4

Ich habe den vollständigen Code in einer anderen Umgebung getestet (7.19) und das Gleiche passiert. Es sieht also so aus, als ob mit den Modulen selbst etwas grundlegend nicht stimmt. Ich werde versuchen, das Problem zu anonymisieren, damit ich hier posten kann.

Update 5

Ich habe die folgenden zwei Dateien in meinem Modul.

stack_test.module

<?php

function stack_test_menu(){
  $items['stacktest'] = array(
    'title' => 'Stack Test',
    'page callback' => 'stack_test_form',
    'access callback' => TRUE,
    'type' => MENU_NORMAL_ITEM,
    'menu_name' => 'main-menu',
  );
  return $items;
}

function  stack_test_form(){
  $countryList = array (
    1 => t('Very poor'),
    2 => t('Not that bad'),
    3 => t('Average'),
    4 => t('Good'),
    5 => t('Perfect'),
  );
  $form['test'] = array(
    '#type' => 'select',
    '#options' => $countryList,
    '#required' => TRUE,
    '#title' => 'Rating',
  );
  return $form;
}

Dann habe ich meine Datei stack_test.info:

name = Stack Test
description = Test Module
package = Stack Exchange
core = 7.x

files[] = stack_test.module

Update 6

Das Erstellen einer Auswahlliste in einem Inhaltstyp mit erforderlicher Validierung funktioniert wie erwartet und '- Wert auswählen -' wird oben in der Liste angezeigt.

Update 7

Der Code in Update 5 sollte jetzt funktionieren. Ich habe nur damit ein Mini-Modul erstellt und erhalte die gleichen Ergebnisse.

6
user13134

Es sieht so aus, als würden Sie Ihr Formular nicht über drupal_get_form()... ausführen. Dies würde die zusätzlichen Formularverarbeitungsfunktionen berücksichtigen, die nicht ausgeführt werden. Am anderen Ende wird jedoch ein gerendertes HTML-Element angezeigt könnte schwierig sein, den Unterschied zu erkennen.

Ändern Sie einfach page callback Für Ihr Router-Element und fügen Sie das Formular als Argumente hinzu:

function stack_test_menu(){
  $items['stacktest'] = array(
    'title' => 'Stack Test',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('stack_test_form'),
    'access callback' => TRUE,
    'type' => MENU_NORMAL_ITEM,
    'menu_name' => 'main-menu',
  );
  return $items;
}

Leeren Sie die Caches und versuchen Sie es erneut auf Ihrer Testseite.

Das Gleiche gilt für Ihr ursprüngliches Problem: Ein Formular ist im Wesentlichen nur ein Render-Array. Wenn Sie es direkt von einem Seitenrückruf zurückgeben, wird es über drupal_render() ausgeführt. Diese Funktion wird alles tun, um das Formularelement zu rendern, und sie weiß, wie es bis zu einem gewissen Grad zu tun ist, aber die Formularverarbeitungsfunktionen fügen dort eine Menge zusätzlicher Dinge hinzu, die drupal_render() nicht tun wird tun.

Moral der Geschichte - benutze immer drupal_get_form() , um die Ausgabe für ein Formular zu erstellen :)

6
Clive

Sie müssen dem Auswahlfeld die Eigenschaft "#empty_option" hinzufügen, um Ihre leere Standardoption für das Auswahlfeld festzulegen. Es wird die erste Option für das Auswahlfeld hinzugefügt.

    $form['test'] = array(
    '#type' => 'select',
    '#options' => array (
      1 => 'Very poor',
      2 => 'Not that bad',
      3 => 'Average',
      4 => 'Good',
      5 => 'Perfect',
    ),
    '#required' => TRUE,
    '#title' => 'Rating',
    '#empty_option' => '--Test--',
  );
2

Ich habe Ihren Code in mein eigenes Modul kopiert und es funktioniert.

Der Standardwert (keine) des Feldes ist "- Select -".

Haben Sie einen anderen Code, der stören könnte?

Außerdem sollte tet, dass es auf dem Bildschirm gedruckt wird, im Allgemeinen die Übersetzungsfunktion t () durchlaufen.

So was:

$form['test'] = array(
  '#type' => 'select',
  '#title' => t('Rating'),
  '#options' => array(
    1 => t('Very poor'),
    2 => t('Not that bad'),
    3 => t('Average'),
    4 => t('Good'),
    5 => t('Perfect'),
  ),
  '#required' => TRUE,
);
1
rooby