web-dev-qa-db-fra.com

La liste de sélection de l'API de formulaire n'affichera pas l'option vide

J'essaie d'ajouter un formulaire qui vous oblige à sélectionner une option dans une liste déroulante. La documentation dit:

Si #required est TRUE et qu'il n'y a pas de #default_value, une option vide est ajoutée au contrôle de sélection pour forcer l'utilisateur à faire un choix actif.

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

OK ça sonne bien. C'est ce que je veux. J'ai donc le code suivant pour ajouter la liste de sélection à mon formulaire.

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

Il s'agit d'une liste de sélection, elle est obligatoire et il n'y a pas de valeur par défaut. Je ne vois cependant pas d'option vide ...

Qu'est-ce que je fais mal?

Mise à jour

L'élément ci-dessus est maintenant la seule chose qui entre dans mon tableau. Lorsque je dpm() le $form J'obtiens ce qui suit:

dpm

Mise à jour 2

Voici ce que le développeur de thème voit:

theme devel

Mise à jour 3

J'ai mis en place une instance propre de drupal 7.22 et installé mon code personnalisé et la même chose se produit. J'ai utilisé le profil minimal. Doit être quelque chose que je fais mal ailleurs où ...

Mise à jour 4

J'ai testé le code complet sur un environnement différent (7.19) et la même chose se produit. Il semble donc qu'il y ait un problème fondamental avec les modules eux-mêmes. J'essaierai d'anonymiser le problème afin que je puisse poster ici.

Mise à jour 5

J'ai les deux fichiers suivants dans mon module.

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;
}

Ensuite, j'ai mon fichier stack_test.info:

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

files[] = stack_test.module

Mise à jour 6

La création d'une liste de sélection dans un type de contenu avec une validation requise fonctionne comme prévu et "- Sélectionnez une valeur -" s'affiche en haut de la liste.

Mise à jour 7

Le code de la mise à jour 5 devrait fonctionner maintenant. J'ai créé un mini module juste avec ça et j'obtiens les mêmes résultats.

6
user13134

Il semble que vous n'exécutiez pas votre formulaire via drupal_get_form()... qui expliquerait les fonctions de traitement de formulaire supplémentaires non exécutées, mais vous obtiendrez toujours un élément HTML rendu à l'autre extrémité afin qu'il pourrait être difficile de faire la différence.

Modifiez simplement le page callback Pour votre élément de routeur et ajoutez le formulaire comme arguments:

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;
}

Videz les caches et essayez à nouveau votre page de test.

Il en va de même pour votre problème d'origine - Un formulaire est essentiellement juste un tableau de rendu, et lorsque vous le retournez directement à partir d'un rappel de page, il est exécuté via drupal_render(). Cette fonction fera ce qu'elle peut pour rendre l'élément de formulaire, et elle sait comment le faire dans une certaine mesure, mais les fonctions de traitement de formulaire y ajoutent beaucoup de choses supplémentaires, que drupal_render() ne fera pas faire.

Morale de l'histoire - utilisez toujours drupal_get_form() pour construire la sortie d'un formulaire :)

6
Clive

Vous devez ajouter la propriété "#empty_option" à la boîte de sélection pour définir votre option vide par défaut pour la boîte de sélection. Il ajoutera la première option pour la boîte de sélection.

    $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
Jayendra Kainthola

J'ai copié votre code sur mon propre module et cela fonctionne.

La valeur par défaut (aucune) du champ est "- Sélectionner -".

Avez-vous un autre code qui pourrait interférer?

En outre, tet qu'il a généralement imprimé à l'écran doit exécuter la fonction de traduction t () .

Comme ça:

$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