36 创建一个新的扩展器

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

    一个扩展器,就是一个简单的实现了SelectQueryInterface接口的类;并且在它的构造函数中,有两个参数:一个选择查询(或者是一个实现了SelectQueryInterface接口的对象)和一个DatabaseConnection对象。它必须重新实现SelectQueryInterface接口中的方法,并把它们传递给构造函数中指定的查询对象,在合适的时候返回自己。

    在大多数情况下,所有的这些工作都可以通过继承SelectQueryExtender类来实现,因为后者帮我们处理了这些工作。因此,在实践中,一个扩展器就是SelectQueryExtender的一个子类。类的名字,就是在查询对象的extend()方法中指定的字符串。

    那么,也就是扩展类负责添加或者覆写方法。对于它没有覆写的方法,将会透明的传递给包装后的查询对象。当覆写一个方法时,扩展器可能会也可能不会调用底层的查询对象,但是它必须返回SelectQuery接口规定的相同值。在大多数情况下,也就是查询对象本身,或者是扩展器对象本身。

    下面的例子,可能帮我们更好的理解这一点。

<?php
class ExampleExtender extends SelectQueryExtender {

  /**
   * Override the normal orderBy behavior.
   */
  public function orderBy($field$direction 'ASC') {
    return $this;
  }

  /**
   * Add a new method of our own.
   */
  public function orderByForReal($field$direction 'ASC') {
    $this->query->orderBy($field$direction);
    return $this;
  }
}
?>

    在上面的例子中,我们覆写了orderBy()方法,使其不做任何工作;同时添加了另一个方法,orderByForReal(),它实现了实际的排序行为。当然,这完全是一个例子,仅仅用来说明扩展器是如何工作的,它本身没有任何实际意义。注意,在两个方法中,被返回的$this就是扩展器对象本身。通过返回查询对象,就确保了扩展器没有“迷失”。

    任何模块都可以声明一个扩展器。Drupal核心自带了两个非常有用的扩展器:PagerDefault TableSort。对于如何在你的代码中使用这些扩展器,可以参看对应的API文档。


Drupal版本: