1 <?php
  2 
  3 /**
  4  * @package redaxo\mediapool
  5  */
  6 class rex_media_cache
  7 {
  8     /**
  9      * Löscht die gecachte Medium-Datei.
 10      *
 11      * @param string $filename Dateiname
 12      */
 13     public static function delete($filename)
 14     {
 15         rex_file::delete(rex_path::addonCache('mediapool', $filename . '.media'));
 16         rex_media::clearInstance($filename);
 17         self::deleteLists();
 18     }
 19 
 20     /**
 21      * Löscht die gecachten Dateien der Media-Kategorie.
 22      *
 23      * @param int $category_id Id der Media-Kategorie
 24      */
 25     public static function deleteCategory($category_id)
 26     {
 27         rex_file::delete(rex_path::addonCache('mediapool', $category_id . '.mcat'));
 28         rex_media_category::clearInstance($category_id);
 29         self::deleteCategoryLists();
 30     }
 31 
 32     /**
 33      * Löscht die gecachten Media-Listen.
 34      */
 35     public static function deleteLists()
 36     {
 37         $cachePath = rex_path::addonCache('mediapool');
 38 
 39         $glob = glob($cachePath . '*.mlist');
 40         if (is_array($glob)) {
 41             foreach ($glob as $file) {
 42                 rex_file::delete($file);
 43             }
 44         }
 45         rex_media_category::clearInstanceListPool();
 46     }
 47 
 48     /**
 49      * Löscht die gecachte Liste mit den Media der Kategorie.
 50      *
 51      * @param int $category_id Id der Media-Kategorie
 52      */
 53     public static function deleteList($category_id)
 54     {
 55         rex_file::delete(rex_path::addonCache('mediapool', $category_id . '.mlist'));
 56         rex_media_category::clearInstanceList([$category_id, 'media']);
 57     }
 58 
 59     /**
 60      * Löscht die gecachten Media-Kategorien-Listen.
 61      */
 62     public static function deleteCategoryLists()
 63     {
 64         $cachePath = rex_path::addonCache('mediapool');
 65 
 66         $glob = glob($cachePath . '*.mclist');
 67         if (is_array($glob)) {
 68             foreach ($glob as $file) {
 69                 rex_file::delete($file);
 70             }
 71         }
 72         rex_media_category::clearInstanceListPool();
 73     }
 74 
 75     /**
 76      * Löscht die gecachte Media-Kategorien-Liste.
 77      *
 78      * @param int $category_id Id der Media-Kategorie
 79      */
 80     public static function deleteCategoryList($category_id)
 81     {
 82         rex_file::delete(rex_path::addonCache('mediapool', $category_id . '.mclist'));
 83         rex_media_category::clearInstanceList([$category_id, 'children']);
 84     }
 85 
 86     /**
 87      * Generiert den Cache des Mediums.
 88      *
 89      * @param string $filename Dateiname des zu generierenden Mediums
 90      *
 91      * @return bool TRUE bei Erfolg, sonst FALSE
 92      */
 93     public static function generate($filename)
 94     {
 95         $query = 'SELECT * FROM ' . rex::getTable('media') . ' WHERE filename = ?';
 96         $sql = rex_sql::factory();
 97         //$sql->setDebug();
 98         $sql->setQuery($query, [$filename]);
 99 
100         if ($sql->getRows() == 0) {
101             return false;
102         }
103 
104         $cacheArray = [];
105         foreach ($sql->getFieldNames() as $fieldName) {
106             switch ($fieldName) {
107                 case 'createdate':
108                 case 'updatedate':
109                     $cacheArray[$fieldName] = $sql->getDateTimeValue($fieldName);
110                     break;
111                 default:
112                     $cacheArray[$fieldName] = $sql->getValue($fieldName);
113             }
114         }
115 
116         $media_file = rex_path::addonCache('mediapool', $filename . '.media');
117         if (rex_file::putCache($media_file, $cacheArray)) {
118             return true;
119         }
120 
121         return false;
122     }
123 
124     /**
125      * Generiert den Cache der Media-Kategorie.
126      *
127      * @param int $category_id Id des zu generierenden Media-Kategorie
128      *
129      * @return bool TRUE bei Erfolg, sonst FALSE
130      */
131     public static function generateCategory($category_id)
132     {
133         // sanity check
134         if ($category_id < 0) {
135             return false;
136         }
137 
138         $query = 'SELECT * FROM ' . rex::getTable('media_category') . ' WHERE id = ?';
139         $sql = rex_sql::factory();
140         //$sql->setDebug();
141         $sql->setQuery($query, [$category_id]);
142 
143         if ($sql->getRows() == 0) {
144             return false;
145         }
146 
147         $cacheArray = [];
148         foreach ($sql->getFieldNames() as $fieldName) {
149             switch ($fieldName) {
150                 case 'createdate':
151                 case 'updatedate':
152                     $cacheArray[$fieldName] = $sql->getDateTimeValue($fieldName);
153                     break;
154                 default:
155                     $cacheArray[$fieldName] = $sql->getValue($fieldName);
156             }
157         }
158 
159         $cat_file = rex_path::addonCache('mediapool', $category_id . '.mcat');
160         if (rex_file::putCache($cat_file, $cacheArray)) {
161             return true;
162         }
163 
164         return false;
165     }
166 
167     /**
168      * Generiert eine Liste mit den Media einer Kategorie.
169      *
170      * @param int $category_id Id der Kategorie
171      *
172      * @return bool TRUE bei Erfolg, sonst FALSE
173      */
174     public static function generateList($category_id)
175     {
176         // sanity check
177         if ($category_id < 0) {
178             return false;
179         }
180 
181         $query = 'SELECT filename FROM ' . rex::getTable('media') . ' WHERE category_id = ?';
182         $sql = rex_sql::factory();
183         $sql->setQuery($query, [$category_id]);
184 
185         $cacheArray = [];
186         for ($i = 0; $i < $sql->getRows(); ++$i) {
187             $cacheArray[] = $sql->getValue('filename');
188             $sql->next();
189         }
190 
191         $list_file = rex_path::addonCache('mediapool', $category_id . '.mlist');
192         if (rex_file::putCache($list_file, $cacheArray)) {
193             return true;
194         }
195 
196         return false;
197     }
198 
199     /**
200      * Generiert eine Liste mit den Kindkategorien einer Kategorie.
201      *
202      * @param int $category_id Id der Kategorie
203      *
204      * @return bool TRUE bei Erfolg, sonst FALSE
205      */
206     public static function generateCategoryList($category_id)
207     {
208         // sanity check
209         if ($category_id < 0) {
210             return false;
211         }
212 
213         $query = 'SELECT id, cast( name AS SIGNED ) AS sort FROM ' . rex::getTable('media_category') . ' WHERE parent_id = ? ORDER BY sort, name';
214         $sql = rex_sql::factory();
215         //$sql->setDebug();
216         $sql->setQuery($query, [$category_id]);
217 
218         $cacheArray = [];
219         for ($i = 0; $i < $sql->getRows(); ++$i) {
220             $cacheArray[] = $sql->getValue('id');
221             $sql->next();
222         }
223 
224         $list_file = rex_path::addonCache('mediapool', $category_id . '.mclist');
225         if (rex_file::putCache($list_file, $cacheArray)) {
226             return true;
227         }
228 
229         return false;
230     }
231 }
232