Source for file Hook.php

Documentation is available at Hook.php

  1. <?php
  2. /*
  3.  *  $Id: Hook.php 2149 2007-08-02 21:27:42Z zYne $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information, see
  19.  * <http://www.phpdoctrine.com>.
  20.  */
  21.  
  22. /**
  23.  * Doctrine_Hook
  24.  *
  25.  * @package     Doctrine
  26.  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
  27.  * @category    Object Relational Mapping
  28.  * @link        www.phpdoctrine.com
  29.  * @since       1.0
  30.  * @version     $Revision: 2149 $
  31.  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
  32.  */
  33. {
  34.     /**
  35.      * @var Doctrine_Query $query           the base query
  36.      */
  37.     protected $query;
  38.     /**
  39.      * @var array $joins                    the optional joins of the base query
  40.      */
  41.     protected $joins;
  42.     /**
  43.      * @var array $hooks                    hooks array
  44.      */
  45.     protected $hooks        = array(
  46.                              'where',
  47.                              'orderby',
  48.                              'limit',
  49.                              'offset'
  50.                               );
  51.     /**
  52.      * @var array $fieldParsers             custom field parsers array
  53.      *                                       keys as field names in the format componentAlias.FieldName
  54.      *                                       values as parser names / objects
  55.      */
  56.     protected $fieldParsers = array();
  57.  
  58.     /**
  59.      * @var array $typeParsers              type parsers array
  60.      *                                       keys as type names and values as parser names / objects
  61.      */
  62.     protected $typeParsers  = array(
  63.                               'char'      => 'Doctrine_Hook_WordLike',
  64.                               'string'    => 'Doctrine_Hook_WordLike',
  65.                               'varchar'   => 'Doctrine_Hook_WordLike',
  66.                               'integer'   => 'Doctrine_Hook_Integer',
  67.                               'enum'      => 'Doctrine_Hook_Integer',
  68.                               'time'      => 'Doctrine_Hook_Time',
  69.                               'date'      => 'Doctrine_Hook_Date',
  70.                               );
  71.  
  72.     /**
  73.      * @param Doctrine_Query $query         the base query
  74.      */
  75.     public function __construct($query)
  76.     {
  77.         if (is_string($query)) {
  78.             $this->query = new Doctrine_Query();
  79.             $this->query->parseQuery($query);
  80.         elseif ($query instanceof Doctrine_Query{
  81.             $this->query = $query;
  82.         else {
  83.             throw new Doctrine_Exception('Constructor argument should be either Doctrine_Query object or valid DQL query');          
  84.         }
  85.         
  86.         $this->query->getQuery();
  87.     }
  88.     /**
  89.      * getQuery
  90.      *
  91.      * @return Doctrine_Query       returns the query object associated with this hook
  92.      */
  93.     public function getQuery()
  94.     {
  95.         return $this->query;
  96.     }
  97.     /**
  98.      * setTypeParser
  99.      *
  100.      * @param string $type              type name
  101.      * @param string|object $parser     parser name or custom parser object
  102.      */
  103.     public function setTypeParser($type$parser
  104.     {
  105.         $this->typeParsers[$type$parser;
  106.     }
  107.     /**
  108.      * setFieldParser
  109.      *
  110.      * @param string $field             field name
  111.      * @param string|object $parser     parser name or custom parser object
  112.      */
  113.     public function setFieldParser($field$parser)
  114.     {
  115.         $this->fieldParsers[$field$parser;
  116.     }
  117.     /**
  118.      * hookWhere
  119.      * builds DQL query where part from given parameter array
  120.      *
  121.      * @param array $params         an associative array containing field
  122.      *                               names and their values
  123.      * @return boolean              whether or not the hooking was
  124.      */
  125.     public function hookWhere($params)
  126.     {
  127.         if is_array($params)) {
  128.             return false;
  129.         }
  130.         foreach ($params as $name => $value{
  131.             if ($value === '' || $value === '-'{
  132.                 continue;
  133.             }
  134.             $e explode('.'$name);
  135.  
  136.             if (count($e== 2{
  137.                 list($alias$column$e;
  138.  
  139.                 $map   $this->query->getAliasDeclaration($alias);
  140.                 $table $map['table'];
  141.  
  142.                 if $table{
  143.                     throw new Doctrine_Exception('Unknown alias ' $alias);
  144.                 }
  145.  
  146.                 if ($def $table->getDefinitionOf($column)) {
  147.  
  148.                 $def[0gettype($value);
  149.                     if (isset($this->typeParsers[$def[0]])) {
  150.                         $name   $this->typeParsers[$def[0]];
  151.                         $parser new $name;
  152.                     }
  153.  
  154.                     $parser->parse($alias$column$value);
  155.  
  156.                     $this->query->addWhere($parser->getCondition()$parser->getParams());
  157.                 }
  158.             }
  159.         }
  160.  
  161.         return true;
  162.     }
  163.     /**
  164.      * hookOrderBy
  165.      * builds DQL query orderby part from given parameter array
  166.      *
  167.      * @param array $params         an array containing all fields which the built query
  168.      *                               should be ordered by
  169.      * @return boolean              whether or not the hooking was successful
  170.      */
  171.     public function hookOrderby($params)
  172.     {
  173.         if is_array($params)) {
  174.             return false;
  175.         }
  176.         foreach ($params as $name{
  177.             $e explode(' '$name);
  178.  
  179.             $order 'ASC';
  180.  
  181.             if (count($e1{
  182.                 $order ($e[1== 'DESC''DESC' 'ASC';
  183.             }
  184.  
  185.             $e explode('.'$e[0]);
  186.  
  187.             if (count($e== 2{
  188.                 list($alias$column$e;
  189.  
  190.                 $map   $this->query->getAliasDeclaration($alias);
  191.                 $table $map['table'];
  192.  
  193.                 if ($def $table->getDefinitionOf($column)) {   
  194.                     $this->query->addOrderBy($alias '.' $column ' ' $order);
  195.                 }
  196.             }
  197.         }
  198.         return true;
  199.     }
  200.     /**
  201.      * @param integer $limit 
  202.      */
  203.     public function hookLimit($limit)
  204.     {
  205.         $this->query->limit((int) $limit);
  206.     }
  207.     /**
  208.      * @param integer $offset 
  209.      */
  210.     public function hookOffset($offset)
  211.     {
  212.         $this->query->offset((int) $offset);
  213.     }
  214. }