Пример #1
0
 /**
  * Intersect the configuration meta-data with meta-data from data base.
  * @param FieldDescription $configFieldDescription Configuration meta-data.
  * @param FieldDescription $dbFieldDescription Meta-data from data base.
  * @return FieldDescription
  */
 public static function intersect(FieldDescription $configFieldDescription, FieldDescription $dbFieldDescription)
 {
     $type = $configFieldDescription->getType();
     $mode = $configFieldDescription->getMode();
     if (!is_null($av = $configFieldDescription->getAvailableValues())) {
         $dbFieldDescription->setAvailableValues($av);
     }
     if ($dbFieldDescription->getPropertyValue('index') == 'PRI') {
         $dbFieldDescription->setType(FieldDescription::FIELD_TYPE_HIDDEN);
     }
     if (!is_null($type)) {
         $dbFieldDescription->setProperty('origType', $dbFieldDescription->getType());
         //меняем тип
         $dbFieldDescription->setType($type);
     }
     if (!is_null($mode)) {
         $dbFieldDescription->setMode($mode);
     }
     $dbFieldDescription->isMultilanguage = $configFieldDescription->isMultilanguage || $dbFieldDescription->isMultilanguage();
     $properties = array_unique(array_merge($configFieldDescription->getPropertyNames(), $dbFieldDescription->getPropertyNames()));
     foreach ($properties as $propertyName) {
         $propertyValue = $configFieldDescription->getPropertyValue($propertyName);
         if (!is_null($propertyValue) && !($propertyName == 'title' && $propertyValue == 'FIELD_' . self::EMPTY_FIELD_NAME)) {
             $dbFieldDescription->setProperty($propertyName, $propertyValue);
         }
     }
     return $dbFieldDescription;
 }
Пример #2
0
 /**
  * считаем комментарии для загруженных постов
  * 
  * @param array $data
  */
 protected function loadCommentCount(&$data)
 {
     $comments = Comments::createInsatceFor($this->getTableName());
     if ($commentCount = $comments->getCountByIds(simplifyDBResult($data, 'post_id'))) {
         foreach ($data as &$item) {
             if (key_exists($item['post_id'], $commentCount)) {
                 $item['comments_num'] = $commentCount[$item['post_id']];
             } else {
                 $item['comments_num'] = 0;
             }
         }
         $fd = new FieldDescription('comments_num');
         $fd->setType(FieldDescription::FIELD_TYPE_INT);
         $this->getDataDescription()->addFieldDescription($fd);
     }
 }
Пример #3
0
 /**
  * Create field.
  * It is used in feeds and their derivatives.
  *
  * @param bool|string $mapFieldName Map field name.
  * @param bool $returnOnlyFirstAttachment Defines whether only the first attachment should be returned.
  * @param bool|array $mapValue Map values.
  */
 public function createField($mapFieldName = false, $returnOnlyFirstAttachment = false, $mapValue = false)
 {
     if ($this->isActive && !$this->data->isEmpty()) {
         if (!$mapFieldName) {
             $mapFieldName = $this->pk->getName();
         }
         if (!$mapValue) {
             if (!($f = $this->data->getFieldByName($mapFieldName))) {
                 return;
             }
             $mapValue = $f->getData();
         }
         $mapTableName = $this->tableName;
         //@todo в принципе имя филда можеть быть вычислено через ColumnInfo
         $f = new Field('attachments');
         $this->data->addField($f);
         if (!is_array($mapValue)) {
             $mapValue = [$mapValue];
         }
         if ($filteredMapValue = array_filter(array_values($mapValue))) {
             $langMapTableName = $this->dbh->getTranslationTablename($mapTableName);
             $columns = $this->dbh->getColumnsInfo($mapTableName);
             $prefix = '';
             foreach ($columns as $cname => $col) {
                 if (isset($col['index']) && $col['index'] == 'PRI') {
                     $prefix = str_replace('_id', '', $cname);
                 }
             }
             if ($langMapTableName) {
                 $lang_columns = $this->dbh->getColumnsInfo($langMapTableName);
                 $lang_pk = false;
                 foreach ($lang_columns as $cname => $col) {
                     if (isset($col['index']) && $col['index'] == 'PRI' && $cname != 'lang_id') {
                         $lang_pk = $cname;
                     }
                 }
             }
             $additional_fields = [];
             foreach ($columns as $cname => $col) {
                 if ($cname != 'session_id' && (empty($col['index']) or $col['index'] != 'PRI' and empty($col['key']['tableName']))) {
                     $new_cname = str_replace($prefix . '_', '', $cname);
                     if ($new_cname != 'order_num') {
                         $additional_fields[$cname] = $new_cname;
                     }
                 }
             }
             if ($langMapTableName) {
                 foreach ($lang_columns as $cname => $col) {
                     if (empty($col['index']) or $col['index'] != 'PRI') {
                         $new_cname = str_replace($prefix . '_', '', $cname);
                         if ($new_cname != 'name') {
                             $additional_fields[$cname] = $new_cname;
                         }
                     }
                 }
             }
             $request = 'SELECT spu.' . $mapFieldName . ',spu.upl_id as id, spu.*, ' . 'upl_path as file, upl_name as name, upl_title as title, upl_width as width, upl_height as height, TIME_FORMAT(upl_duration, "%i:%s") as duration,
                         upl_internal_type as type,upl_mime_type as mime, upl_data as data, ' . 'upl_is_mp4 as is_mp4, upl_is_webm as is_webm, upl_is_flv as is_flv ' . ($langMapTableName && $lang_pk ? ', spt.*' : '') . 'FROM ' . self::ATTACH_TABLENAME . ' su ' . 'LEFT JOIN `' . $mapTableName . '` spu ON spu.upl_id = su.upl_id ' . ($langMapTableName && $lang_pk ? 'LEFT JOIN `' . $langMapTableName . '` spt ON spu.' . $lang_pk . ' = spt.' . $lang_pk . ' AND spt.lang_id = ' . E()->getDocument()->getLang() : '') . ' WHERE ' . $mapFieldName . ' IN (' . implode(',', $filteredMapValue) . ') AND (su.upl_is_ready=1) AND (su.upl_is_active = 1)';
             // получаем имя колонки _order_num и сортируем по этому полю, если оно есть
             if ($columns) {
                 foreach ($columns as $col => $colInfo) {
                     if (strpos($col, '_order_num') !== false) {
                         $request .= ' ORDER BY ' . $col;
                     }
                 }
             }
             $images = $this->dbh->select($request);
             if ($images) {
                 foreach ($images as $row) {
                     $repoPath = E()->FileRepoInfo->getRepositoryRoot($row['file']);
                     $row['secure'] = E()->getConfigValue('repositories.ftp.' . $repoPath . '.secure', 0) ? true : false;
                     // делаем преобразование имен из $additional_fiels (отрезаем prefix)
                     if ($additional_fields) {
                         foreach ($additional_fields as $old_field => $new_field) {
                             if (array_key_exists($old_field, $row)) {
                                 $val = $row[$old_field];
                                 unset($row[$old_field]);
                                 $row[$new_field] = $val;
                             }
                         }
                     }
                     $mapID = $row[$mapFieldName];
                     if ($returnOnlyFirstAttachment && isset($imageData[$mapID])) {
                         continue;
                     }
                     if (!isset($imageData[$mapID])) {
                         $imageData[$mapID] = [];
                     }
                     array_push($imageData[$mapID], $row);
                 }
                 list($uploadsPK) = array_keys($columns);
                 for ($i = 0; $i < sizeof($mapValue); $i++) {
                     if (isset($imageData[$mapValue[$i]])) {
                         if ($this->addOG) {
                             foreach ($imageData[$mapValue[$i]] as $row) {
                                 E()->getOGObject()->addImage($row['file']);
                             }
                             $attachment = $imageData[$mapValue[$i]];
                             if (isset($attachment[0]) && $attachment[0]['type'] === 'video') {
                                 //inspect($attachment);
                                 E()->getOGObject()->setVideo($attachment[0]['file'], $attachment[0]['duration'], $attachment[0]['mime'], $attachment[0]['width'], $attachment[0]['height']);
                             }
                         }
                         $builder = new SimplestBuilder();
                         $localData = new Data();
                         $localData->load($imageData[$mapValue[$i]]);
                         $dataDescription = new DataDescription();
                         $fd = new FieldDescription('id');
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription($uploadsPK);
                         $fd->setType(FieldDescription::FIELD_TYPE_INT);
                         $fd->setProperty('key', true);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('file');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $base = pathinfo($imageData[$mapValue[$i]][0]['file'], PATHINFO_DIRNAME) . '/' . pathinfo($imageData[$mapValue[$i]][0]['file'], PATHINFO_FILENAME);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('type');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('duration');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('width');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('height');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('mime');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('data');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $dataDescription->addFieldDescription($fd);
                         $fd = new FieldDescription('title');
                         $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                         $dataDescription->addFieldDescription($fd);
                         $fd_name = new FieldDescription('name');
                         $dataDescription->addFieldDescription($fd_name);
                         $fd = new FieldDescription('secure');
                         $fd->setType(FieldDescription::FIELD_TYPE_HIDDEN);
                         $dataDescription->addFieldDescription($fd);
                         $playlist = [];
                         foreach (['mp4', 'webm', 'flv'] as $fileType) {
                             if ($imageData[$mapValue[$i]][0]['is_' . $fileType] == '1') {
                                 $playlist[] = ['id' => $base . '.' . $fileType, 'type' => $fileType];
                             }
                         }
                         if ($playlist && count($playlist) > 1) {
                             $fd = new FieldDescription('playlist');
                             $fd->setType(FieldDescription::FIELD_TYPE_SELECT);
                             $fd->loadAvailableValues($playlist, 'id', 'id');
                             $dataDescription->addFieldDescription($fd);
                         }
                         // дополнительные поля из основной и языковой таблицы _uploads
                         foreach ($additional_fields as $new_name) {
                             if ($new_name != 'name') {
                                 $fd = new FieldDescription($new_name);
                                 $fd->setType(FieldDescription::FIELD_TYPE_STRING);
                                 $dataDescription->addFieldDescription($fd);
                             }
                         }
                         $builder->setData($localData);
                         $builder->setDataDescription($dataDescription);
                         if ($this->dbh->getTagsTablename($mapTableName)) {
                             $tm = new TagManager($dataDescription, $localData, $mapTableName);
                             $tm->createFieldDescription();
                             $tm->createField();
                         }
                         $builder->build();
                         $f->setRowData($i, $builder->getResult());
                     }
                 }
             }
         }
     }
 }