35 使用一个扩展器

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

    为了使用一个扩展器,你首先需要有一个查询对象。extend()方法由查询对象返回一个新的对象,来替换原有的查询对象。例如:

<?php
$query $query->extend('PagerDefault');
?>

    上面的代码中,查询对象调用extend()方法,创建了一个新的PagerDefault查询对象,新对象包含了原来的选择查询,最后返回这个新创建的对象。现在,$query除了具有原来查询对象的各种功能以外,现在又有了新的附加方法可用。

    注意,$query的变更不是当即生效的。从extend()中返回了一个新的对象,我们需要把这个对象存放在一个变量中,否则它就会丢失。例如,下面的代码就不会按照你的期望执行:

<?php
$query db_select('node''n');
$query
  ->fields('n', array('nid''title')
  ->extend('PagerDefault')  //这一行返回一个新的PagerDefault对象
  ->limit(5);            //这一行能够工作,因为正被调用的是PagerDefault对象。

//extend()中返回的对象没有被保存,所以$query仍然是最初的选择对象。
$query->orderBy('title');

//这一行执行的是最初的选择对象,而不是扩展。扩展现在已不存在。
$result $query->execute();
?>

    为了避免这一问题,推荐大家在初次定义查询时,就对选择查询进行扩展。

<?php
$query db_select('node''n')->extend('PagerDefault')->extend('TableSort');
$query->fields(...);
// ...
?>

    这就确保了,从一开始,$query就是完全扩展后的对象。

    还有需要注意的是,尽管扩展器可被堆叠调用(如上例所示),但是并不是所有的扩展器都相互兼容,并且扩展的先后顺序也有可能会对结果产生影响。例如,同时扩展了分页和表排序行为的查询,必须要先扩展PagerDefault


Drupal版本: