「#markup」フォーム要素に子を含めることはできません


7

フォームを持っていますが、フォームがレンダリングされているときに「#markup」要素の子が表示されません。

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

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

この例では、「要素」フォームフィールドはレンダリングされません。

これはDrupalのバグですか、それとも何か特別なことをする必要がありますか?


これはバグではなく、誤解です。マークアップテキストに他の要素を挿入することはできません。代わりにコンテナを作成し、そこにマークアップとテキストフィールドを追加します。
Neograph734 2016年

回答:


8

フォームAPIのリファレンスページで「#tree」が「#markup」要素でサポートされていると報告されているため、「#tree」を「#markup」要素で使用できないのはDrupalのバグのようです。

回避策として、次のコードのように、「#prefix」プロパティを使用することもできます。

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

期待どおりにレンダリングされない場合は、コードから "#tree"を削除するだけでよく<h2>My Heading</h2>、フォームフィールドの前にタグをレンダリングするだけでよい場合は、不要と思われます。フォームAPIは、配列に表示される順序に従って要素をレンダリングします。順序を変更したい場合は、 " #weight "プロパティを使用できます。

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

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

ありがとうございます。ただし、実際のフォームは上記の例よりも少し洗練されているので、tree要素が必要です。また、コードをよりクリーンに保つために、接頭辞/接尾辞のマークアップ値を使用しないようにしています。私のフォームは、深さ約4の要素のツリー構造を生成するいくつかのループで構成されています。「マークアップ」要素タイプに子を含めることができない場合、フォームの一部を再構築する必要があります。
user1589 2011

「マークアップ」要素は「#tree」を使用できるはずなので、Drupalのバグのようです。私が報告したのは、私が知っている唯一の回避策/代替策です。
kiamlaluno

1
問題レポートを開きました:drupal.org/node/1261040。バグは最初にDrupal 8で修正され、その後、以前のバージョンにバックポーティングされるため、参照バージョンは8.xです。
kiamlaluno

1

もう少し正確に言うと、#markuptype要素の子はレンダリングされません。ただし、フォームの目的で処理されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.