如何在div中包装两个渲染数组元素?


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中?

Answers:


29

您还可以使用#containerform元素,并且代码类似于以下代码:

$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属性或第一个元素的属性移至新添加的元素。如您所说,这不太容易出错。
kiamlaluno

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 2011年

@stefgosselin,您的意思是您想创建一个tpl文件作为主题吗?
ninjascorner 2011年

感谢您的回答。我知道如何在一个元素上执行此操作,但是我没有想到将后缀和前缀分开。有趣。这对我来说很混乱,但是我无法阐明原因,所以我真的没有问题。
贾斯汀

@ninjascorner对不起,抱歉,我找不到我对此主题的笔记。还有,我认为一个可能的方式比其他的答案,在主题或模块使用正在使用该主题勾欠优雅theme_render_example_add_divapi.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中是否也可以使用,但我希望如此


是的,我在发布后弄清楚了这个方法(好吧,我复制了示例模块)。它很好用,但是我不认为它是最好的方法,因为(如果我理解正确的话),您必须将类名放入函数中,从而降低其可重用性。
贾斯汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.