render vs drupal_render

render,会先判断传入的参数是否是数组。如是数组,调用drupal_render()渲染传入的参数。如不是数组,说明是渲染好的,则直接返回传入的参数。
render的作用是:如是数组则渲染,如不是数组说明是渲染好的。

render的源码:
function render(&$element) {
if (is_array($element)) {
show($element);
return drupal_render($element);
}
else {
// Safe-guard for inappropriate use of render() on flat variables: return
// the variable as-is.
return $element;
}
}

render

Render 函数把数组转成相应的html。
如想隐藏一部分输出,可在输出前
如:
hide($content[‘comments’]);
print render($content);
这样会不输出$content 里的$content[‘comments’] 部分。

还可只输出部分的方式。
print render($content[‘comments’][‘comment_form’]);
要做:记一下http://api.drupal.org/api/drupal/includes!common.inc/function/show/7 的输出原理。
意思是?:drupal 第一次调用 render()或drupal_render()时,会检查每个元素。如果标记为#printed的,则不会再次渲染。如渲染了一部分后,会把这部分标 记为#printed。因此,如想显示某个元素,必须在父元素渲染前调用这个元素。

例如:node里面有一个field_image的字段,读取他的默认显示样式:

方法1:

$node = node_load($nid);
$content = node_view($node, ‘full’);
$row[‘image’] = drupal_render($content[‘field_image’]);

方法2:

$node = node_load($nid);
$content = field_view_field(‘node’, $node, ‘field_image’);
$row[‘image’] = render($content);

如果你想应用后台内容类型的设置显示格式,就需要改写代码:
?

$node = node_load($nid);
// Must load field content for entity before using field_view_value()
$fields = field_get_items(‘node’, $node, ‘field_image’);
// $index corresponds to the value you want to render. First value = 0.
$index = 0;
$content = field_view_value(‘node’, $node, ‘field_image’, $fields[$index]);
$row[‘image’] = render($content);

如果想自定义样式,可以

$display = array(‘type’ => ‘my_formatter’);
$content = field_view_field(‘node’, $node, ‘field_image’, $display);
$row[‘image’] = render($content)’

node.tpl.php里 输出某个字段、覆写字段等。
如果想改写字段的位置,是在node.tpl.php里的。其中,$content变量是所有字段的总体输出。如要先单独输出其中的某个,可先通过dpm找到相应的。
print render($content[‘body’]);
print render($content[‘field_tua’]);
如果需要在$content这个总体后面输出,
hide($content[‘comments’]);
hide($content[‘links’]);

Tell others about me!

Leave a Reply

Your email address will not be published. Required fields are marked *