/**
  * Save data.
  *
  * @param array $data Data.
  * @return bool|mixed
  *
  * @throws SystemException 'ERR_VALIDATE_FORM'
  */
 protected function saveData($data)
 {
     $result = false;
     //создаем объект описания данных
     $dataDescriptionObject = new DataDescription();
     //получаем описание полей для метода
     $configDataDescription = $this->getConfig()->getStateConfig($this->getPreviousState());
     //если в конфиге есть описание полей для метода - загружаем их
     if (isset($configDataDescription->fields)) {
         $dataDescriptionObject->loadXML($configDataDescription->fields);
     }
     //Создаем объект описания данных взятых из БД
     $DBDataDescription = new DataDescription();
     //Загружаем в него инфу о колонках
     $DBDataDescription->load($this->loadDataDescription());
     $this->setDataDescription($dataDescriptionObject->intersect($DBDataDescription));
     $dataObject = new Data();
     $dataObject->load($data);
     $this->setData($dataObject);
     //Создаем сейвер
     $saver = new Saver();
     //Устанавливаем его режим
     $saver->setMode(self::COMPONENT_TYPE_FORM_ADD);
     $saver->setDataDescription($this->getDataDescription());
     $saver->setData($this->getData());
     if ($saver->validate() === true) {
         $saver->setFilter($this->getFilter());
         $saver->save();
         $result = $saver->getResult();
     } else {
         //выдвигается пустой exception который перехватывается в методе save
         throw new SystemException('ERR_VALIDATE_FORM', SystemException::ERR_WARNING, $saver->getErrors());
     }
     return $result;
 }
Exemple #2
0
 /**
  * Save data.
  * @return mixed
  * @throws SystemException 'ERR_NO_ACTION'
  * @throws SystemException 'ERR_VALIDATE_FORM'
  */
 protected function saveData()
 {
     $result = false;
     //если в POST не пустое значение значение первичного ключа - значит мы находимся в режиме редактирования
     if (isset($_POST[$this->getTableName()][$this->getPK()]) && !empty($_POST[$this->getTableName()][$this->getPK()])) {
         $mode = self::COMPONENT_TYPE_FORM_ALTER;
         $this->setFilter([$this->getPK() => $_POST[$this->getTableName()][$this->getPK()]]);
     } else {
         $mode = self::COMPONENT_TYPE_FORM_ADD;
     }
     //создаем объект описания данных
     $dataDescriptionObject = new DataDescription();
     if (!method_exists($this, $this->getPreviousState())) {
         throw new SystemException('ERR_NO_ACTION', SystemException::ERR_CRITICAL);
     }
     //получаем описание полей для метода
     $configDataDescription = $this->getConfig()->getStateConfig($this->getPreviousState());
     //если в конфиге есть описание полей для метода - загружаем их
     if (isset($configDataDescription->fields)) {
         $dataDescriptionObject->loadXML($configDataDescription->fields);
     }
     //Создаем объект описания данных взятых из БД
     $DBDataDescription = new DataDescription();
     //Загружаем в него инфу о колонках
     $DBDataDescription->load($this->loadDataDescription());
     $this->setDataDescription($dataDescriptionObject->intersect($DBDataDescription));
     //Поле с порядком следования убираем из списка
     /**
      * @todo  Надо бы это как то переделать, потому что разбросано получилось
      * часть кода относящаяся к обработке колонки с нумерацией здесь, часть
      * @see Grid::createDataDescription
      */
     if (($col = $this->getOrderColumn()) && ($field = $this->getDataDescription()->getFieldDescriptionByName($col))) {
         $this->getDataDescription()->removeFieldDescription($field);
     }
     $dataObject = new Data();
     $dataObject->load($this->loadData());
     $this->setData($dataObject);
     //Создаем сейвер
     $saver = $this->getSaver();
     //Устанавливаем его режим
     $saver->setMode($mode);
     $saver->setDataDescription($this->getDataDescription());
     $saver->setData($this->getData());
     if ($saver->validate() === true) {
         $saver->setFilter($this->getFilter());
         $saver->save();
         $result = $saver->getResult();
     } else {
         //выдвигается exception который перехватывается в методе save
         throw new SystemException('ERR_VALIDATE_FORM', SystemException::ERR_WARNING, $this->saver->getErrors());
     }
     //Если у нас режим вставки и определена колонка для порядка следования, изменяем порядок следования
     if (($orderColumn = $this->getOrderColumn()) && $mode == self::COMPONENT_TYPE_FORM_ADD) {
         $this->addFilterCondition([$this->getPK() . '!=' . $result]);
         $request = 'UPDATE ' . $this->getTableName() . ' SET ' . $orderColumn . '=' . $orderColumn . '+1 ' . $this->dbh->buildWhereCondition($this->getFilter());
         $this->dbh->modify($request);
     }
     return $result;
 }
Exemple #3
0
 /**
  * Send.
  */
 protected function send()
 {
     $postTableName = str_replace('.', '_', $this->getTableName());
     if (!isset($_POST[$postTableName])) {
         E()->getResponse()->redirectToCurrentSection();
     }
     try {
         $data[$this->getTableName()] = $_POST[$postTableName];
         if (!$this->document->getUser()->isAuthenticated() && !$this->getParam('noCaptcha')) {
             $this->checkCaptcha();
         }
         if ($result = $this->saveData($data)) {
             $data = $data[$this->getTableName()];
             //Unset pk_id field, because we don't need it in body of message to send
             $data['pk_id'] = $result;
             foreach ($data as $key => $value) {
                 $data[$key] = ['translation' => $this->translate('FIELD_' . $key), 'value' => $value];
                 if ($fd = $this->saver->getDataDescription()->getFieldDescriptionByName($key)) {
                     if ($fd->getType() == FieldDescription::FIELD_TYPE_MULTI && is_array($keyInfo = $fd->getPropertyValue('key'))) {
                         $m2mTableName = $keyInfo['tableName'];
                         $m2mPKName = $keyInfo['fieldName'];
                         //Если существует таблица связанная
                         if ($this->dbh->tableExists($m2mTableName)) {
                             $tableInfo = $this->dbh->getColumnsInfo($m2mTableName);
                             unset($tableInfo[$m2mPKName]);
                             $m2mValueFieldInfo = current($tableInfo);
                             if (isset($m2mValueFieldInfo['key']) && is_array($m2mValueFieldInfo)) {
                                 list($values, , ) = $this->dbh->getForeignKeyData($m2mValueFieldInfo['key']['tableName'], $m2mValueFieldInfo['key']['fieldName'], E()->getLanguage()->getCurrent(), [$m2mValueFieldInfo['key']['tableName'] . '.' . $m2mValueFieldInfo['key']['fieldName'] => $value]);
                                 if (is_array($values)) {
                                     $data[$key]['value'] = implode(',', array_map(function ($row) {
                                         return $row['fk_name'];
                                     }, $values));
                                 }
                             }
                         }
                     }
                 }
             }
             try {
                 $mailer = new Mail();
                 //Get subject
                 $subject = $this->dbh->getScalar('frm_forms_translation', 'form_name', ['form_id' => $this->formID, 'lang_id' => E()->getLanguage()->getCurrent()]);
                 $subject = $this->translate('TXT_EMAIL_FROM_FORM') . ' ' . $subject;
                 //Create text to send. The last one will contain: translations of variables and  variables.
                 $body = '';
                 //                    if (!($url = $this->getConfigValue('site.media')))
                 $url = E()->getSiteManager()->getCurrentSite()->base;
                 foreach ($data as $fieldname => $value) {
                     $type = $this->getDataDescription()->getFieldDescriptionByName($fieldname)->getType();
                     if ($type == FieldDescription::FIELD_TYPE_FILE) {
                         $val = $url . $value['value'];
                     } elseif ($type == FieldDescription::FIELD_TYPE_BOOL) {
                         $val = $this->translate((int) $value['value'] === 0 ? 'TXT_NO' : 'TXT_YES');
                     } else {
                         $val = $value['value'];
                     }
                     $body .= '<strong>' . $value['translation'] . '</strong>: ' . $val . '<br>';
                 }
                 $mailer->setFrom($this->getConfigValue('mail.from'))->setSubject($subject)->setText(strip_tags($body))->setHtmlText($body)->addTo(($recp = $this->getRecipientEmail()) ? $recp : $this->getConfigValue('mail.manager'))->send();
             } catch (\Exception $e) {
             }
         }
         //$this->prepare();
         $this->response->redirectToCurrentSection('send/success/');
     } catch (\Exception $e) {
         $this->failure($e->getMessage(), $data);
     }
 }