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

Source for file Saver.class.php

Documentation is available at Saver.class.php

  1. <?php
  2.  
  3. /**
  4.  * Класс Saver.
  5.  *
  6.  * @package energine
  7.  * @subpackage core
  8.  * @author dr.Pavka
  9.  * @copyright Energine 2006
  10.  * @version $Id$
  11.  */
  12.  
  13. //require_once('core/framework/DBWorker.class.php');
  14. //require_once('core/framework/DataDescription.class.php');
  15. //require_once('core/framework/Data.class.php');
  16.  
  17. /**
  18.  * Сохранитель данных в БД.
  19.  *
  20.  * @package energine
  21.  * @subpackage core
  22.  * @author dr.Pavka
  23.  */
  24. class Saver extends DBWorker {
  25.     /**
  26.      * @access private
  27.      * @var array имена полей, в которых произошли ошибки
  28.      */
  29.     private $errors = array();
  30.  
  31.     /**
  32.      * @access private
  33.      * @var mixed условие SQL-запроса сохранения
  34.      * @see QAL::select()
  35.      */
  36.     private $filter = null;
  37.  
  38.     /**
  39.      * @access private
  40.      * @var string режим сохранения
  41.      * @see QAL::INSERT
  42.      * @see QAL::UPDATE
  43.      */
  44.     private $mode = QAL::INSERT;
  45.  
  46.     /**
  47.      * @access protected
  48.      * @var DataDescription описание данных
  49.      */
  50.     protected $dataDescription = false;
  51.  
  52.     /**
  53.      * @access protected
  54.      * @var Data данные
  55.      */
  56.     protected $data = false;
  57.  
  58.    /**
  59.     * @access private
  60.     * @var mixed результат сохранения
  61.     */
  62.     private $result = false;
  63.  
  64.     /**
  65.      * Конструктор класса.
  66.      *
  67.      * @access public
  68.      * @return void 
  69.      */
  70.     public function __construct({
  71.         parent::__construct();
  72.     }
  73.  
  74.     /**
  75.      * Устанавливает описание данных.
  76.      *
  77.      * @access public
  78.      * @param DataDescription $dataDescription 
  79.      * @return void 
  80.      */
  81.     public function setDataDescription(DataDescription $dataDescription{
  82.         $this->dataDescription = $dataDescription;
  83.     }
  84.  
  85.     /**
  86.      * Возвращает описание данных.
  87.      *
  88.      * @access public
  89.      * @return DataDescription 
  90.      */
  91.     public function getDataDescription({
  92.         return $this->dataDescription;
  93.     }
  94.  
  95.     /**
  96.      * Возвращает данные
  97.      *
  98.      * @return Data 
  99.      * @access public
  100.      */
  101.  
  102.     public function getData({
  103.         return $this->data;
  104.     }
  105.  
  106.     /**
  107.      * Устанавливает данные.
  108.      *
  109.      * @access public
  110.      * @param Data $data 
  111.      * @return void 
  112.      */
  113.     public function setData(Data $data{
  114.         $this->data = $data;
  115.     }
  116.  
  117.     /**
  118.      * Устанавливает режим сохранения данных.
  119.      *
  120.      * @access public
  121.      * @param string 
  122.      * @return void 
  123.      */
  124.     public function setMode($mode{
  125.         $this->mode = $mode;
  126.     }
  127.  
  128.     /**
  129.      * Возвращает режим сохранения данных.
  130.      *
  131.      * @access public
  132.      * @return string 
  133.      */
  134.     public function getMode({
  135.         return $this->mode;
  136.     }
  137.  
  138.     /**
  139.      * Возвращает условие SQL-запроса сохранения.
  140.      *
  141.      * @access public
  142.      * @return mixed 
  143.      */
  144.     public function getFilter({
  145.         return $this->filter;
  146.     }
  147.  
  148.     /**
  149.      * Устанавливает условие SQL-запроса сохранения.
  150.      *
  151.      * @access public
  152.      * @param mixed $filter 
  153.      * @return void 
  154.      */
  155.     public function setFilter($filter{
  156.         $this->filter = $filter;
  157.     }
  158.  
  159.     /**
  160.      * Валидация сохраняемых данных.
  161.      *
  162.      * @access public
  163.      * @return boolean 
  164.      * @todo возможность передачи в объект callback функции для пользовательской валидации
  165.      */
  166.     public function validate({
  167.         $result false;
  168.  
  169.         if (!$this->data || !$this->dataDescription{
  170.             throw new SystemException('ERR_DEV_BAD_DATA'SystemException::ERR_DEVELOPER);
  171.         }
  172.  
  173.         foreach ($this->dataDescription as $fieldName => $fieldDescription{
  174.             $fieldData $this->data->getFieldByName($fieldName);
  175.             if ($fieldDescription->getType(== FieldDescription::FIELD_TYPE_BOOL ||
  176.                 $fieldDescription->getType(== FieldDescription::FIELD_TYPE_PFILE ||
  177.                 $fieldName == 'lang_id' ||
  178.                 !is_null($fieldDescription->getPropertyValue('customField'))
  179.                 || $fieldDescription->getPropertyValue('nullable')
  180.                 ){
  181.                 continue;
  182.             }
  183.             // если нет данных в POST-запросе для какого-либо из полей
  184.             elseif ($fieldData == false && $fieldName != 'lang_id'{
  185.                 $this->addError($fieldName);
  186.                 $result false;
  187.                 break;
  188.             }
  189.             else {
  190.                 for ($i 0$i $fieldData->getRowCount()$i++{
  191.                     if (!$fieldDescription->validate($fieldData->getRowData($i))) {
  192.                         $this->addError($fieldName);
  193.                         $result false;
  194.                         break 2;
  195.                     }
  196.                 }
  197.                 $result true;
  198.             }
  199.         }
  200.         return $result;
  201.     }
  202.  
  203.     /**
  204.      * Возвращает имена полей, в которых произошли ошибки.
  205.      *
  206.      * @access public
  207.      * @return array 
  208.      */
  209.     public function getErrors({
  210.         return $this->errors;
  211.     }
  212.  
  213.     /**
  214.      * Добавляет имя поле в набор ошибочных имён полей.
  215.      *
  216.      * @access public
  217.      * @param string $fieldName 
  218.      * @return void 
  219.      */
  220.     public function addError($fieldName{
  221.         array_push($this->errors$fieldName);
  222.     }
  223.  
  224.     /**
  225.      * Сохранение данных.
  226.      *
  227.      * @access public
  228.      * @return void 
  229.      */
  230.     public function save({
  231.         $data array();
  232.  
  233.         for ($i 0$i $this->data->getRowCount()$i++{
  234.             foreach ($this->dataDescription as $fieldName => $fieldInfo{
  235.                 // исключаем поля, которым нет соответствия в БД
  236.                 if (is_null($fieldInfo->getPropertyValue('customField')) && $this->data->getFieldByName($fieldName)) {
  237.                     $fieldValue $this->data->getFieldByName($fieldName)->getRowData($i);
  238.                     if($fieldInfo->getType(== FieldDescription::FIELD_TYPE_HTML_BLOCK){
  239.                         $fieldValue DataSet::cleanupHTML($fieldValue);
  240.                     }    
  241.                     // сохраняем поля из основной таблицы
  242.                     if ($fieldInfo->isMultilanguage(== false && $fieldInfo->getPropertyValue('key'!== true && $fieldInfo->getPropertyValue('languageID'== false{
  243.                         //Для типа флоат меняем запятые на точки
  244.                         if ($fieldInfo->getType(== FieldDescription::FIELD_TYPE_FLOAT{
  245.                             $fieldValue str_replace(',''.'$fieldValue);
  246.                         }
  247.                         $data[$fieldInfo->getPropertyValue('tableName')][$fieldName$fieldValue;
  248.                     }
  249.                     elseif ($fieldInfo->isMultilanguage(|| $fieldInfo->getPropertyValue('languageID')) {
  250.                         $data[$fieldInfo->getPropertyValue('tableName')][$this->data->getFieldByName('lang_id')->getRowData($i)][$fieldName$fieldValue;
  251.                     }
  252.                     elseif ($fieldInfo->getPropertyValue('key'=== true{
  253.                         $pkName $fieldName// имя первичного ключа
  254.                         $mainTableName $fieldInfo->getPropertyValue('tableName')// имя основной таблицы
  255.                     }
  256.                 }
  257.             }
  258.         }
  259.  
  260.         if ($this->getMode(== QAL::INSERT{
  261.             $data[$mainTableName(!isset($data[$mainTableName]))?array():$data[$mainTableName];
  262.             $id $this->dbh->modify(QAL::INSERT$mainTableName$data[$mainTableName]);
  263.             unset($data[$mainTableName]);
  264.             foreach ($data as $tableName => $langRow{
  265.                 foreach ($langRow as $row{
  266.                     $row[$pkName$id;
  267.                     $result $this->dbh->modify(QAL::INSERT$tableName$row);
  268.  
  269.                 }
  270.             }
  271.             $result $id;
  272.         }
  273.         else {
  274.             if (isset($data[$mainTableName])) {
  275.                 $result $this->dbh->modify(QAL::UPDATE$mainTableName$data[$mainTableName]$this->getFilter());
  276.                 unset($data[$mainTableName]);
  277.             }
  278.             foreach ($data as $tableName => $langRow{
  279.                 foreach ($langRow as $langID => $row{
  280.                     try {
  281.                         $result $this->dbh->modify(QAL::INSERT$tableNamearray_merge($row$this->getFilter()));
  282.                     }
  283.                     catch (Exception $e{
  284.                         $result $this->dbh->modify(QAL::UPDATE $tableName$rowarray_merge($this->getFilter()array('lang_id' => $langID)));
  285.                     }
  286.                 }
  287.             }
  288.             $result true;
  289.         }
  290.  
  291.         $this->result = $result;
  292.     }
  293.  
  294.     /**
  295.      * Возвращает результат сохранения данных.
  296.      *
  297.      * @access public
  298.      * @return mixed 
  299.      */
  300.     public function getResult({
  301.         return $this->result;
  302.     }
  303. }
В создании документации нам помог: phpDocumentor