divで2つのレンダー配列要素をラップするにはどうすればよいですか?


12

このレンダリング可能な配列がある場合:

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
    ), 
  );

これらの要素の両方を単一のDIVにラップする方法を教えてください。

回答:


29

また、#containerフォーム要素、および次のようなコードを使用できます。

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

#containerの要素を持つその子要素ラップ<div>CSSクラスに渡されたものですタグ、#attributesプロパティを。

「twitter-icon」要素にコンテナを使用することもできますが、次のコードのように要素を追加できる場合を除いて、利点はありません。

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('twitter-icon'),
  ),
);

if ($condition) {
  $wrapper['twitter-icon']['twitter-icon-text'] => array(
    '#type' => 'markup',
    '#markup' => t('Icon text'),
  );
}

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

私にとってこれが最良の答えです。物理配列構造を使用してラップされているものを表現し、コピーと貼り付けを改善します(@ninjascornerの要素を移動するとオープン/クローズDIVが壊れる可能性があります)、余分な必要はありませんテーマ機能。ありがとう!
ジャスティン

そのとおりです。#suffixプロパティを最後の要素から、または#prefixプロパティを最初の要素から新しい追加要素に移動することなく、同じコンテナにレンダリングされる別の要素を追加できます。あなたが言ったように、これはエラーが発生しにくいです。
キアムルノ

6

これはあなたが探しているものですか?

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
      '#prefix' => '<div class="test">',
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/fdgf'),
      '#suffix' => '</div>',
    ), 
);

お役に立てば幸いです!


@nijaが+1されました。これらの属性を忘れていたというすばらしい答えです。私の答えを読んでください、これはあなたのサフィックスとプレフィックスのテーマベースの代替手段によって達成できますか?
stefgosselin

@stefgosselin、あなたはそれをテーマにTPLファイルを作成したいということですか?
ninjascorner

この答えをありがとう。1つの要素でこれを行う方法は知っていましたが、接尾辞と接頭辞を分割することはありませんでした。面白い。面倒くさいですが、なぜ説明できないので、本当に問題を抱えることはできません。
ジャスティン

@ninjascorner遅れて申し訳ありませんが、この件に関するメモが見つかりませんでした。私はテーマフック使用しているテーマやモジュールで使用可能な他の答え、より仕方可能性が少ないエレガントだと思いもありますtheme_render_example_add_div 参照くださいapi.drupal.org/api/examples/...
stefgosselinを

これは、両方の要素が常にレンダリングされると確信している場合にのみ有効です。このように分割すると、閉じられていない<div>になりやすくなります。
kufeiko

2

このためのテーマを作成することもできます。

$form['twitter']['#theme'] = 'my_twitter_theme';

$form['twitter']['icon'] = array(
'twitter-icon' => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$form['twitter']['link'] = array(
  '#type' => 'markup',
  '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
);

そして、テーマフックで:

function my_hook_theme(){
  return array(
    'my_twitter_theme' => array('form' => NULL)
  );
} 

また、テーマ機能では:

function theme_my_twitter_theme($form){
  $output = "";

  $output .= "<div class=\"twitter\">";
  $output .= drupal_render($form['icon']);
  $output .= drupal_render($form['link']);
  $output .= "</div>";    

  $output .= drupal_render($form);
  return $output;
}

私はこれをDrupal 6で使用していますが、D7でも動作するかどうかわかりませんが、そう願っています


はい、投稿後にこのメソッドを見つけました(例モジュールをコピーします)。それはうまく機能しますが、(私が正しく理解していれば)関数にクラス名を入れる必要があり、再利用性が低下するため、私はそれを最良の方法とは見なしません。
ジャスティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.