Version: current

      1 <?php
      2 /**
      3  * Объект для сохранения трекинга файлов у DataObject
      4  *
      5  *
      6  * @package sapphire
      7  * @author menedem
      8  *
      9  */
     10
     11 class DataObjectFileTracking extends DataObject {
     12     static $db = array(
     13         'ObjectID' => 'Int',
     14         'ObjectClass' => 'Varchar(150)',
     15         'FieldName' => 'Varchar(150)',
     16     );
     17
     18     static $has_one = array(
     19         'File' => 'File',
     20     );
     21
     22     /**
     23      * Возвращает связанный объект
     24      *
     25      * @return DataObject
     26      */
     27     function LinkedObject() {
     28         return DataObject::get_by_id($this->ObjectClass, $this->ObjectID);
     29     }
     30
     31     /**
     32      * Получение информации по трекингу файлов для объекта
     33      *
     34      * @param int $objectID - ID объекта
     35      * @param string $objectClass   - Класс объекта
     36      * @param string $fieldName - Имя поля
     37      *
     38      * @return DataObjectSet
     39      */
     40     static function get_track($objectID, $objectClass, $fieldName='') {
     41         $where = "ObjectID = {$objectID} AND ObjectClass = '{$objectClass}'";
     42         if ($fieldName) {
     43             $where .= " AND FieldName = '{$fieldName}'";
     44         }
     45         return DataObject::get('DataObjectFileTracking', $where);
     46     }
     47
     48     /**
     49      * Обновляет информацию по трекингу файлов для объекта
     50      *
     51      * @param int $objectID - ID объекта
     52      * @param string $objectClass   - Класс объекта
     53      * @param string $fieldName - Имя поля
     54      * @param array $fileIDs    - Список ID файлов
     55      */
     56     static function update_track($objectID, $objectClass, $fieldName, $fileIDs) {
     57         // берем текущий список файлов по объекту для вычисления разницы
     58         $currentTrackIDs = DB::Query("SELECT FileID FROM DataObjectFileTracking WHERE FieldName = '{$fieldName}' AND ObjectID = {$objectID} AND ObjectClass = '{$objectClass}'")->keyedColumn();
     59
     60         // сохраняем новый
     61         foreach($fileIDs as $fileID) {
     62             if (isset($currentTrackIDs[$fileID])) {
     63                 // уже присутвует
     64                 unset($currentTrackIDs[$fileID]);
     65             } else {
     66                 // новый
     67                 self::save_track($objectID, $objectClass, $fieldName, $fileID);
     68             }
     69
     70         }
     71         // удаляем то, что было, но пропало
     72         if (count($currentTrackIDs)) {
     73             self::delete_track($objectID, $objectClass, $fieldName, $currentTrackIDs);
     74         }
     75     }
     76
     77     /**
     78      * Удаляет информацию о связанных файлах
     79      * Может удалять информацию по объекту, объекту и полю или конретным id файлов
     80      *
     81      * TODO обновление информации при удалении файлов / фиксация "битых" ссылок на файлы
     82      *
     83      * @param int $objectID - ID объекта
     84      * @param string $objectClass   - Класс объекта
     85      * @param string $fieldName - Имя поля
     86      * @param array $fileIDs    - Список ID файлов
     87      */
     88     static function delete_track($objectID=0, $objectClass='', $fieldName='', $fileIDs=array()) {
     89         $where = array();
     90         if ($objectID) {
     91             $where[] = "ObjectID = {$objectID}";
     92         }
     93         if ($objectClass) {
     94             $where[] = "ObjectClass = '{$objectClass}'";
     95         }
     96         if ($fieldName) {
     97             $where[] = "FieldName = '{$fieldName}'";
     98         }
     99         if ($fileIDs) {
    100             $where[] = "FileID IN (" . join(',', $fileIDs) . ")";
    101         }
    102         if (count($where)) {
    103             DB::Query("DELETE FROM `DataObjectFileTracking` WHERE " . implode(' AND ', $where));
    104         }
    105     }
    106
    107     /**
    108      * Создает запись об использовании файла
    109      *
    110      * @param int $objectID - ID объекта
    111      * @param string $objectClass   - Класс объекта
    112      * @param string $fieldName - Имя поля
    113      * @param int $fileID   - ID файла
    114      *
    115      * @return DataObjectFileTracking
    116      */
    117     static function save_track($objectID, $objectClass, $fieldName, $fileID) {
    118         $obj = new DataObjectFileTracking();
    119         $obj->ObjectID = $objectID;
    120         $obj->ObjectClass = $objectClass;
    121         $obj->FieldName = $fieldName;
    122         $obj->FileID = $fileID;
    123         $obj->write();
    124         return $obj->ID;
    125     }
    126 }

[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -