web-dev-qa-db-fra.com

L'élément de formulaire "#markup" ne peut pas avoir d'enfants

J'ai mon formulaire, mais aucun enfant de l'élément "#markup" n'apparaîtra lors du rendu du formulaire.

$form['html'] = array(
  '#type' => 'markup',
  '#markup' => '<h2>My Heading</h2>',
  '#tree' => true,
);

$form['html']['element'] = array(
  '#type' => 'textfield',
  '#title' => 'Foo',
);

Dans cet exemple, le champ de formulaire "élément" ne sera pas rendu.

Est-ce un bug Drupal, ou dois-je faire quelque chose de spécifique?

7
user1589

Ne pas pouvoir utiliser "#tree" avec un élément "#markup" semble être un bogue de Drupal, car la page de référence pour l'API de formulaire signale que "#tree" est pris en charge par l'élément "#markup" .

Comme solution de contournement, vous pouvez également utiliser la propriété "#prefix", comme dans le code suivant:

$form['html']['element'] = array(
  '#type' => 'textfield',
  '#title' => 'Foo',
  '#prefix' => '<h2>My Heading</h2>',
);

S'il n'est pas rendu comme prévu, vous pouvez simplement supprimer "#tree" de votre code, ce qui ne semble pas être nécessaire, si tout ce que vous voulez est de rendre le <h2>My Heading</h2> tag avant les champs du formulaire. L'API de formulaire rend les éléments suivant l'ordre dans lequel ils apparaissent dans le tableau; si vous souhaitez modifier la commande, vous pouvez utiliser la propriété " # weight ".

$form['html'] = array(
 '#type' => 'markup',
 '#markup' => '<h2>My Heading</h2>',
);

$form['html']['element'] = array(
  '#type' => 'textfield',
  '#title' => 'Foo',
);
8
kiamlaluno

Pour être un peu plus précis, les enfants des éléments de type #markup Ne sont pas rendus. Ils sont cependant traités à des fins de formulaire.

1
user49