/** * 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; }
/** * 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; }
/** * 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); } }