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

Source for file Saver.class.php

Documentation is available at Saver.class.php

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