实践理解drupal 7 render API

drupal render array实践学习
上篇文章介绍drupal 7中的render API,这篇通过实践来更好的理解drupal render api.

创建一个模块

下面通过一个小模块学习drupal render api。
按照开发drupal模块的惯例,首先在sites/all/modules下面创建两个文件:

render_array.info
render_array.module

render_array.info的内容如下:

name = render array
description = understanding drupal's render api
package = test modules
core = 7.x

然后在render_array.module添加如下代码,挂个hook menu钩子。

<?php
function render_array_menu() {

$items['testpage'] = array (
               'title' => 'learning render array',
               'page callback' => 'learning_render_array',
               'access callback' => TRUE,
       );

   return $items;
}

在上面的代码中我们把tesgpage的回调函数设为learning_render_array。这样我们访问testpage页面时,该函数会被调用来生成这个页面的HTML文件。

一个简单的回调函数:

function learning_render_array() {

           $render_array['myrender_array'] = array (
                            '#markup' =>'<p>this is a test</p>',
                             );
          return $render_array;
}

下面我们多加几个render array的属性。

function learning_render_array() {

      $render_array['myrender_array'] array(
               'output' => t('<p>this is the main content, outputted by #theme</p>'),
               '#note' => t('<p style="background-color:green">this is generated by out custom render array property #note</p>'),
               '#pre_render' => array('add_heading_to_output'),
               '#theme' => 'output_render_array',//theme function
               '#theme_wrappers' => array ('render_array_wrapper'),//theme wrapper function       
               '#post_render' => array('add_footnote_to_output'),
          ),);
    return $render_array;
}

除了带#外,上面的数组跟普通的关联数组没什么不同,drupal的render api将根据里的数据来渲染页面。我们一个个来看每个属性的作用。

最外的myrender_array键只是随意一个名称,可以自定,里面的output和#note也是一样。
主要来说说其它四个属性,即#theme, #theme_wrappers,#pre_render,#post_render.

#theme,

如果设了这个值后,drupal就会把渲染该render array的数据交给该函数来完成,这里将被调用的函数名是theme_output_render_array,注意前面要加上theme_,而且要先用hook theme建一个相应的主题
钩子才能使用。下面的代码创建了两个主题钩子,一个是上面的说到output_render_array即theme_render_array_theme,另外一个是下面需要用到的。

function render_array_theme() {
  $items = array(
    'output_render_array' => array(
      'render element' => 'element',
    ),
   
    'render_array_wrapper' => array(
      'render element' => 'element',
    ),
  );
  return $items;
}

theme_output_render_array通过$vars['element']变量得到该render array的数据。注意这里之所以用‘element'作为key是因为我们在创建主题钩子时设定的,即’render element‘ => 'element'.你也可以用其它名称。

下面是theme_output_render_array函数的代码:

function theme_output_render_array($variables) {

            $output = '';
            $output .= $variables['element']['output'].$variables['element']['#note'];
           
            return $output;
}

在函数中我们把outpu和#note元素合并为$output并返回给drupal render api作进一步的处理。
其实,如果其它几个属性是空的话,这就是最终的HTML输出

'#pre_render'

按照调用顺序的话,这个函数的调用还在#theme之前发生,但它的作用主要是对数组里的数据进行操作。该函数也是接收一个参数,即整个数组数据。具体看代码

function add_heading_to_output($element) {

         $element['output'] = t('<p style="background-color:yellow;">this heading is generated by #pre_render</p>').$element['output'];
          return $element;
       
}

上面的函数对output元素进行修改,也可以修改其它元素。

#theme_wrappers

这个值是一组函数。在所有子元素完成渲染并且数据保存到#children这个元素后,它就会被调用。主要可以用来加div什么的。一般不与#theme一起用。

function theme_render_array_wrapper($variables) {

           $output = '<div style="border:1px solid red">';
           $output .= $variables['element']['#children'];
           $output .= '</div>';
      return $output;
}

'#post_render'

与其它属性不一样,#post_render接收两个参数,已经生成的HTML字符和原本的render array.

  function add_footnote_to_output($markup,$element) {

        $markup = $markup.t('<p style="background-color:blue;">this is added by #post_render element</p>');
       
        return $markup;
       
     }

完整代码在此,有兴趣的朋友可以启用这个模块试下

添加新评论

个人信息
此内容将保密,不会被其他人看见。
评论内容

Filter HTML

  • 允许的HTML标签:<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • 自动断行和分段。
  • 自动将网址与电子邮件地址转变为链接。

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
提交该页面即表示您接受Mollon的隐私政策