energine
[ class tree: energine ] [ index: energine ] [ all elements ]

Source for file Builder.class.php

Documentation is available at Builder.class.php

  1. <?php
  2.  
  3. /**
  4.  * Класс Builder.
  5.  *
  6.  * @package energine
  7.  * @subpackage core
  8.  * @author dr.Pavka
  9.  * @copyright Energine 2006
  10.  * @version $Id$
  11.  */
  12.  
  13.  
  14. /**
  15.  * Построитель.
  16.  * Создаёт XML-документ основываясь на переданных ему данных и мета-данных.
  17.  *
  18.  * @package energine
  19.  * @subpackage core
  20.  * @author dr.Pavka
  21.  * @abstract
  22.  */
  23. abstract class Builder extends DBWorker {
  24.  
  25.     /**
  26.      * @access protected
  27.      * @var DataDescription мета-данные
  28.      */
  29.     protected $dataDescription;
  30.  
  31.     /**
  32.      * @access protected
  33.      * @var Data данные
  34.      */
  35.     protected $data;
  36.  
  37.     /**
  38.      * @access protected
  39.      * @var DOMDocument результирующий документ
  40.      */
  41.     protected $result;
  42.  
  43.     /**
  44.      * Конструктор класса.
  45.      *
  46.      * @access public
  47.      * @return void 
  48.      */
  49.     public function __construct({
  50.         parent::__construct();
  51.  
  52.         $this->dataDescription = false;
  53.         $this->data = false;
  54.     }
  55.  
  56.     /**
  57.      * Устанавливает мета-данные.
  58.      *
  59.      * @access public
  60.      * @param DataDescription $dataDescription мета-данные
  61.      * @return void 
  62.      */
  63.     public function setDataDescription(DataDescription $dataDescription{
  64.         $this->dataDescription = $dataDescription;
  65.     }
  66.  
  67.     /**
  68.      * Устанавливает данные.
  69.      *
  70.      * @access public
  71.      * @param Data $data данные
  72.      * @return void 
  73.      */
  74.     public function setData(Data $data{
  75.         $this->data = $data;
  76.     }
  77.  
  78.     /**
  79.      * Создаёт результирующий XML-документ.
  80.      *
  81.      * @access public
  82.      * @return boolean 
  83.      */
  84.     public function build({
  85.         $this->result = new DOMDocument('1.0''UTF-8');
  86.  
  87.         // если отсутствует описание данных - построение невозможно
  88.         if ($this->dataDescription == false{
  89.             throw new SystemException('ERR_DEV_NO_DATA_DESCRIPTION'SystemException::ERR_DEVELOPER);
  90.         }
  91.         $this->run();
  92.         return ($this->result instanceof DOMDocument true false);
  93.     }
  94.  
  95.     /**
  96.      * Возвращает результат работы построителя.
  97.      *
  98.      * @access public
  99.      * @return DOMNode 
  100.      */
  101.     public function getResult({
  102.         return $this->result->documentElement;
  103.     }
  104.  
  105.     /**
  106.      * Используется в производных классах для построения результата.
  107.      * Результат должен быть записан в Builder::$result.
  108.      *
  109.      * @access protected
  110.      * @return void 
  111.      */
  112.     protected function run({
  113.     }
  114.  
  115.     /**
  116.      * Создаёт XML-описание поля данных.
  117.      *
  118.      * @access protected
  119.      * @param string $fieldName 
  120.      * @param FieldDescription $fieldInfo 
  121.      * @param mixed $fieldValue 
  122.      * @param mixed $fieldProperties 
  123.      * @return DOMNode 
  124.      */
  125.      protected function createField($fieldNameFieldDescription $fieldInfo$fieldValue false$fieldProperties false{
  126.         $result $this->result->createElement('field');
  127.         $result->setAttribute('name'$fieldName);
  128.         $result->setAttribute('type'$fieldInfo->getType());
  129.         $length $fieldInfo->getLength();
  130.         if ($length !== true{
  131.             $result->setAttribute('length'$length);
  132.         }
  133.         $result->setAttribute('mode'$fieldInfo->getMode());
  134.  
  135.         foreach ($fieldInfo->getPropertyNames(as $propName{
  136.             $propValue $fieldInfo->getPropertyValue($propName);
  137.             if ($propValue != '' && !is_array($propValue)) {
  138.                 $result->setAttribute($propName$propValue);
  139.             }
  140.         }
  141.  
  142.         if ($fieldProperties{
  143.             foreach ($fieldProperties as $propName => $propValue{
  144.                 $result->setAttribute($propName$propValue);
  145.             }
  146.         }
  147.  
  148.         if (($fieldValue instanceof DOMNode|| ($fieldValue instanceof DOMElement)) {
  149.             try {
  150.                $result->appendChild($fieldValue);
  151.             }
  152.             catch (Exception $e{
  153.                 $result->appendChild($this->result->importNode($fieldValue,true));
  154.             }
  155.         }
  156.         elseif(($fieldInfo->getType(== FieldDescription::FIELD_TYPE_IMAGE&& $fieldValue){
  157.                 if(file_exists($fieldValue)){
  158.                     list($width$heightgetimagesize($fieldValue);
  159.                     $img $this->result->createElement('image');
  160.                     $img->setAttribute('width'$width);
  161.                     $img->setAttribute('height'$height);
  162.                     $img->setAttribute('name''main');
  163.                     $img->nodeValue $fieldValue;
  164.                     $result->appendChild($img);
  165.  
  166.                     foreach($this->getConfigValue('thumbnails.thumbnail'as $thumbnail){
  167.                         $thumbnailFile 
  168.                            FileObject::getThumbFilename(
  169.                                $fieldValue,
  170.                                $width = (int)$thumbnail->width,
  171.                                $height = (int)$thumbnail->height
  172.                            );
  173.                         if(file_exists($thumbnailFile)){
  174.                            $img $this->result->createElement(
  175.                                'image'
  176.                            );
  177.                            $img->setAttribute('width'$width);
  178.                            $img->setAttribute('height'$height);
  179.                            $img->setAttribute('name',(string)$thumbnail['name']);
  180.                            $img->nodeValue $thumbnailFile;
  181.                            $result->appendChild($img);
  182.                                
  183.                         }
  184.                     }
  185.                 }
  186.         }
  187.         elseif ($fieldValue !== false{
  188.             if (!empty($fieldValue)) {
  189.                 switch ($fieldInfo->getType()) {
  190.                     case FieldDescription::FIELD_TYPE_DATETIME:
  191.                     case FieldDescription::FIELD_TYPE_DATE:
  192.                     case FieldDescription::FIELD_TYPE_HIDDEN:
  193.                             try {
  194.                                 $result->setAttribute('date'@strftime('%d-%m-%Y-%H-%S'$fieldValue));
  195.                                 $fieldValue @strftime($fieldInfo->getPropertyValue('outputFormat')$fieldValue);
  196.                             }
  197.                             catch (Exception  $dummy){
  198.                             };
  199.                         break;
  200.                     default// not used
  201.                 }
  202.             }
  203.             $result->nodeValue str_replace('&''&amp;'$fieldValue);
  204.         }
  205.  
  206.         return $result;
  207.      }
  208.  
  209.     /**
  210.      * Создает набор возможных значений поля типа select.
  211.      *
  212.      * @access protected
  213.      * @param FieldDescription $fieldInfo 
  214.      * @param mixed $data 
  215.      * @return DOMNode 
  216.      */
  217.     protected function createOptions(FieldDescription $fieldInfo$data false{
  218.         $fieldValue $this->result->createElement('options');
  219.         if(is_array($fieldInfo->getAvailableValues()))
  220.         foreach ($fieldInfo->getAvailableValues(as $key => $option{
  221.             $dom_option $this->result->createElement('option'str_replace('&''&amp;'$option['value']));
  222.             $dom_option->setAttribute('id'$key);
  223.             if ($option['attributes']{
  224.                 foreach ($option['attributes'as $attrName => $attrValue{
  225.                     $dom_option->setAttribute($attrName$attrValue);
  226.                 }
  227.             }
  228.             // для поля типа multi-select
  229.             if (is_array($data&& in_array($key$data)) {
  230.                 $dom_option->setAttribute('selected''selected');
  231.             }
  232.             $fieldValue->appendChild($dom_option);
  233.         }
  234.         return $fieldValue;
  235.     }
  236. }
В создании документации нам помог: phpDocumentor