Exemplo n.º 1
0
 /**
  * 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);
         }
     }
 }
Exemplo n.º 2
0
 /**
  * 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;
 }