Source for file Builder.class.php

Documentation is available at Builder.class.php

  1. /**
  2.  * Класс Builder.
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author dr.Pavka
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkBuilder.class.php.html,v 1.1 2007/09/17 14:32:33 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/framework/DBWorker.class.php';
  12. require_once 'core/framework/DataDescription.class.php';
  13. require_once 'core/framework/Data.class.php';
  14.  
  15. /**
  16.  * Построитель.
  17.  * Создаёт XML-документ основываясь на переданных ему данных и мета-данных.
  18.  *
  19.  * @package energine
  20.  * @subpackage core
  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.         $this->result = new DOMDocument('1.0''UTF-8');
  55.     }
  56.  
  57.     /**
  58.      * Устанавливает мета-данные.
  59.      *
  60.      * @access public
  61.      * @param DataDescription $dataDescription мета-данные
  62.      * @return void 
  63.      */
  64.     public function setDataDescription(DataDescription $dataDescription{
  65.         $this->dataDescription = $dataDescription;
  66.     }
  67.  
  68.     /**
  69.      * Устанавливает данные.
  70.      *
  71.      * @access public
  72.      * @param Data $data данные
  73.      * @return void 
  74.      */
  75.     public function setData(Data $data{
  76.         $this->data = $data;
  77.     }
  78.  
  79.     /**
  80.      * Создаёт результирующий XML-документ.
  81.      *
  82.      * @access public
  83.      * @return boolean 
  84.      */
  85.     public function build({
  86.         // если отсутствует описание данных - построение невозможно
  87.         if ($this->dataDescription == false{
  88.             throw new SystemException('ERR_DEV_NO_DATA_DESCRIPTION'SystemException::ERR_DEVELOPER);
  89.         }
  90.         $this->run();
  91.         return ($this->result instanceof DOMDocument true false);
  92.     }
  93.  
  94.     /**
  95.      * Возвращает результат работы построителя.
  96.      *
  97.      * @access public
  98.      * @return DOMNode 
  99.      */
  100.     public function getResult({
  101.         return $this->result->documentElement;
  102.     }
  103.  
  104.     /**
  105.      * Используется в производных классах для построения результата.
  106.      * Результат должен быть записан в Builder::$result.
  107.      *
  108.      * @access protected
  109.      * @return void 
  110.      */
  111.     protected function run({
  112.     }
  113.  
  114.     /**
  115.      * Создаёт XML-описание поля данных.
  116.      *
  117.      * @access protected
  118.      * @param string $fieldName 
  119.      * @param FieldDescription $fieldInfo 
  120.      * @param mixed $fieldValue 
  121.      * @param mixed $fieldProperties 
  122.      * @return DOMNode 
  123.      */
  124.      protected function createField($fieldNameFieldDescription $fieldInfo$fieldValue false$fieldProperties false{
  125.         $result $this->result->createElement('field');
  126.         $result->setAttribute('name'$fieldName);
  127.         $result->setAttribute('type'$fieldInfo->getType());
  128.         $length $fieldInfo->getLength();
  129.         if ($length !== true{
  130.             $result->setAttribute('length'$length);
  131.         }
  132.         $result->setAttribute('mode'$fieldInfo->getMode());
  133.  
  134.         foreach ($fieldInfo->getPropertyNames(as $propName{
  135.             $propValue $fieldInfo->getPropertyValue($propName);
  136.             if ($propValue != '' && !is_array($propValue)) {
  137.                 $result->setAttribute($propName$propValue);
  138.             }
  139.         }
  140.  
  141.         if ($fieldProperties{
  142.             foreach ($fieldProperties as $propName => $propValue{
  143.                 $result->setAttribute($propName$propValue);
  144.             }
  145.         }
  146.  
  147.         if ($fieldValue instanceof DOMNode{
  148.             try {
  149.                $result->appendChild($fieldValue);
  150.             }
  151.             catch (Exception $e{
  152.                 $result->appendChild($this->result->importNode($fieldValue,true));
  153.             }
  154.         }
  155.         elseif ($fieldValue !== false{
  156.             if (!empty($fieldValue)) {
  157.                 switch ($fieldInfo->getType()) {
  158.                     case FieldDescription::FIELD_TYPE_DATETIME:
  159.                     case FieldDescription::FIELD_TYPE_DATE:
  160.                         $fieldValue = strftime($fieldInfo->getPropertyValue('outputFormat')$fieldValue);
  161.                         break;
  162.                     default// not used
  163.                 }
  164.             }
  165.             $result->nodeValue = str_replace('&''&'$fieldValue);
  166.         }
  167.  
  168.         return $result;
  169.      }
  170.  
  171.     /**
  172.      * Создает набор возможных значений поля типа select.
  173.      *
  174.      * @access protected
  175.      * @param FieldDescription $fieldInfo 
  176.      * @param mixed $data 
  177.      * @return DOMNode 
  178.      */
  179.     protected function createOptions(FieldDescription $fieldInfo$data false{
  180.         $fieldValue $this->result->createElement('options');
  181.         if(is_array($fieldInfo->getAvailableValues()))
  182.         foreach ($fieldInfo->getAvailableValues(as $key => $option{
  183.             $dom_option $this->result->createElement('option'str_replace('&''&'$option['value']));
  184.             $dom_option->setAttribute('id'$key);
  185.             if ($option['attributes']{
  186.                 foreach ($option['attributes'as $attrName => $attrValue{
  187.                     $dom_option->setAttribute($attrName$attrValue);
  188.                 }
  189.             }
  190.             // для поля типа multi-select
  191.             if (is_array($data&& in_array($key$data)) {
  192.                 $dom_option->setAttribute('selected''selected');
  193.             }
  194.             $fieldValue->appendChild($dom_option);
  195.         }
  196.         return $fieldValue;
  197.     }
  198. }

Documentation generated on Mon, 17 Sep 2007 13:25:34 +0300 by phpDocumentor 1.4.0a2