/** * Edit ad. * Modify input DataDescription argument by adding to it an information about ad. * * @param Data $d Data. * @param DataDescription $dd Data description. */ public function edit(Data $d, DataDescription $dd) { $fds = $this->dbh->getColumnsInfo(self::TABLE_NAME); unset($fds['smap_id']); $fds['ad_id']['key'] = false; foreach ($fds as $key => $value) { $fds[$key]['tabName'] = 'TXT_ADS'; } $dd->load($fds); $data = $this->dbh->select(self::TABLE_NAME, array_keys($fds), array('smap_id' => $d->getFieldByName('smap_id')->getRowData(0))); if (is_array($data)) { //Тут как всегда проблема с загрузкой значений в мультиязычный билдер foreach ($data[0] as $fieldName => $fieldData) { $f = new Field($fieldName); for ($i = 0, $l = sizeof(E()->getLanguage()->getLanguages()); $i < $l; $i++) { $f->setRowData($i, $fieldData); } $d->addField($f); } } }
/** * Save data. */ public function save() { //Основные данные для сохранения $data = []; //Данные для сохранения в связанные таблицы или в mysql set //Начальное значение false, поскольку пустой массив будет говорить о том что поле существует. но ничего не выбрано $m2mData = false; $m2mFDs = $this->getDataDescription()->getFieldDescriptionsByType(FieldDescription::FIELD_TYPE_MULTI); if (!empty($m2mFDs)) { foreach ($m2mFDs as $fieldInfo) { if (is_null($fieldInfo->getPropertyValue('customField'))) { //@todo На хера оно здесь? //с 260 тот же самый код - пока не убираю но нужно разобраться if (!in_array($fieldInfo->getSystemType(), [QAL::COLTYPE_ENUM, QAL::COLTYPE_SET])) { //Определяем имя m2m таблицы list($m2mTableName, $m2mPKName) = array_values($fieldInfo->getPropertyValue('key')); //Определяем имя поля $m2mInfo = $this->dbh->getColumnsInfo($m2mTableName); unset($m2mInfo[$m2mPKName]); $m2mData[$m2mTableName]['pk'] = $m2mPKName; } } } } for ($i = 0; $i < $this->getData()->getRowCount(); $i++) { foreach ($this->getDataDescription() as $fieldName => $fieldInfo) { // исключаем поля, которым нет соответствия в БД if (is_null($fieldInfo->getPropertyValue('customField')) && $this->getData()->getFieldByName($fieldName)) { $fieldValue = $this->getData()->getFieldByName($fieldName)->getRowData($i); if ($fieldInfo->getType() == FieldDescription::FIELD_TYPE_HTML_BLOCK) { $fieldValue = DataSet::cleanupHTML($fieldValue); } // сохраняем поля из основной таблицы if ($fieldInfo->isMultilanguage() == false && $fieldInfo->getPropertyValue('key') !== true && $fieldInfo->getPropertyValue('languageID') == false) { switch ($fieldInfo->getType()) { case FieldDescription::FIELD_TYPE_FLOAT: $fieldValue = str_replace(',', '.', $fieldValue); break; case FieldDescription::FIELD_TYPE_MULTI: /** * @todo необходимо оптимизировать алгоритм, а то произошло дублирование кода * */ //many 2 many relations stored in tables if (!in_array($fieldInfo->getSystemType(), [QAL::COLTYPE_ENUM, QAL::COLTYPE_SET])) { $m2mValues = $fieldValue; //Поскольку мультиполе реально фейковое //записываем в него NULL $fieldValue = ''; //Определяем имя m2m таблицы list($m2mTableName, $m2mPKName) = array_values($fieldInfo->getPropertyValue('key')); //Определяем имя поля $m2mInfo = $this->dbh->getColumnsInfo($m2mTableName); unset($m2mInfo[$m2mPKName]); foreach ($m2mValues as $val) { $m2mData[$m2mTableName]['pk'] = $m2mPKName; $m2mData[$m2mTableName][key($m2mInfo)][] = $val; } unset($m2mValues, $m2mPKName, $m2mInfo, $m2mTableName); } else { $fieldValue = implode(',', $fieldValue); } break; } $data[$fieldInfo->getPropertyValue('tableName')][$fieldName] = $fieldValue; } elseif ($fieldInfo->isMultilanguage() || $fieldInfo->getPropertyValue('languageID')) { $data[$fieldInfo->getPropertyValue('tableName')][$this->data->getFieldByName('lang_id')->getRowData($i)][$fieldName] = $fieldValue; } elseif ($fieldInfo->getPropertyValue('key') === true) { $pkName = $fieldName; // имя первичного ключа $mainTableName = $fieldInfo->getPropertyValue('tableName'); // имя основной таблицы } } } } if ($this->getMode() == QAL::INSERT) { $data[$mainTableName] = !isset($data[$mainTableName]) ? [] : $data[$mainTableName]; $id = $this->dbh->modify(QAL::INSERT, $mainTableName, $data[$mainTableName]); unset($data[$mainTableName]); foreach ($data as $tableName => $langRow) { foreach ($langRow as $row) { $row[$pkName] = $id; /*$result = */ $this->dbh->modify(QAL::INSERT, $tableName, $row); } } $result = $id; } else { if (isset($data[$mainTableName])) { /*$result = */ $this->dbh->modify(QAL::UPDATE, $mainTableName, $data[$mainTableName], $this->getFilter()); unset($data[$mainTableName]); } foreach ($data as $tableName => $langRow) { foreach ($langRow as $langID => $row) { try { /*$result = */ $this->dbh->modify(QAL::INSERT, $tableName, array_merge($row, $this->getFilter())); } catch (\Exception $e) { /*$result = */ $this->dbh->modify(QAL::UPDATE, $tableName, $row, array_merge($this->getFilter(), ['lang_id' => $langID])); } } } if ($pkName) { $result = $this->getData()->getFieldByName($pkName)->getRowData(0); } else { $result = true; } } if (is_array($m2mData) && is_numeric($result)) { foreach ($m2mData as $tableName => $m2mInfo) { $this->dbh->modify(QAL::DELETE, $tableName, NULL, [$m2mInfo['pk'] => $result]); } foreach ($m2mData as $tableName => $m2mInfo) { $pk = $m2mInfo['pk']; unset($m2mInfo['pk']); if ($m2mInfo) { foreach (current($m2mInfo) as $fieldValue) { $this->dbh->modify(QAL::INSERT_IGNORE, $tableName, [key($m2mInfo) => $fieldValue, $pk => $result]); } } } } return $this->result = $result; }