1 <?php
  2 
  3 /**
  4  * @package redaxo\structure
  5  */
  6 class rex_article_cache
  7 {
  8     /**
  9      * Löscht die gecachten Dateien eines Artikels. Wenn keine clang angegeben, wird
 10      * der Artikel-Cache in allen Sprachen gelöscht.
 11      *
 12      * @param int $id    ArtikelId des Artikels
 13      * @param int $clang ClangId des Artikels
 14      *
 15      * @return bool True on success, False on errro
 16      */
 17     public static function delete($id, $clang = null)
 18     {
 19         // sanity check
 20         if ($id < 0) {
 21             return false;
 22         }
 23 
 24         foreach (rex_clang::getAllIds() as $_clang) {
 25             if ($clang !== null && $clang != $_clang) {
 26                 continue;
 27             }
 28 
 29             self::deleteMeta($id, $clang);
 30             self::deleteContent($id, $clang);
 31         }
 32         self::deleteLists($id);
 33 
 34         return true;
 35     }
 36 
 37     /**
 38      * Löscht die gecachten Meta-Dateien eines Artikels. Wenn keine clang angegeben, wird
 39      * der Artikel in allen Sprachen gelöscht.
 40      *
 41      * @param int $id    ArtikelId des Artikels
 42      * @param int $clang ClangId des Artikels
 43      *
 44      * @return bool True on success, False on errro
 45      */
 46     public static function deleteMeta($id, $clang = null)
 47     {
 48         // sanity check
 49         if ($id < 0) {
 50             return false;
 51         }
 52 
 53         $cachePath = rex_path::addonCache('structure');
 54 
 55         foreach (rex_clang::getAllIds() as $_clang) {
 56             if ($clang !== null && $clang != $_clang) {
 57                 continue;
 58             }
 59 
 60             rex_file::delete($cachePath . $id . '.' . $_clang . '.article');
 61             rex_article::clearInstance([$id, $_clang]);
 62             rex_category::clearInstance([$id, $_clang]);
 63         }
 64 
 65         return true;
 66     }
 67 
 68     /**
 69      * Löscht die gecachten Content-Dateien eines Artikels. Wenn keine clang angegeben, wird
 70      * der Artikel in allen Sprachen gelöscht.
 71      *
 72      * @param int $id    ArtikelId des Artikels
 73      * @param int $clang ClangId des Artikels
 74      *
 75      * @return bool True on success, False on errro
 76      */
 77     public static function deleteContent($id, $clang = null)
 78     {
 79         // sanity check
 80         if ($id < 0) {
 81             return false;
 82         }
 83 
 84         $cachePath = rex_path::addonCache('structure');
 85 
 86         foreach (rex_clang::getAllIds() as $_clang) {
 87             if ($clang !== null && $clang != $_clang) {
 88                 continue;
 89             }
 90 
 91             rex_file::delete($cachePath . $id . '.' . $_clang . '.content');
 92         }
 93 
 94         return true;
 95     }
 96 
 97     /**
 98      * Löscht die gecachten List-Dateien eines Artikels. Wenn keine clang angegeben, wird
 99      * der Artikel in allen Sprachen gelöscht.
100      *
101      * @param int $id ArtikelId des Artikels
102      *
103      * @return bool True on success, False on errro
104      */
105     public static function deleteLists($id)
106     {
107         // sanity check
108         if ($id < 0) {
109             return false;
110         }
111 
112         $cachePath = rex_path::addonCache('structure');
113 
114         foreach (['alist', 'clist'] as $list) {
115             rex_file::delete($cachePath . $id . '.' . $list);
116             rex_structure_element::clearInstanceList([$id, $list]);
117         }
118 
119         return true;
120     }
121 
122     /**
123      * Generiert den Artikel-Cache der Metainformationen.
124      *
125      * @param int $article_id Id des zu generierenden Artikels
126      * @param int $clang      ClangId des Artikels
127      *
128      * @return bool TRUE bei Erfolg, FALSE wenn eine ungütlige article_id übergeben wird, sonst eine Fehlermeldung
129      */
130     public static function generateMeta($article_id, $clang = null)
131     {
132         // sanity check
133         if ($article_id <= 0) {
134             return false;
135         }
136 
137         $qry = 'SELECT * FROM ' . rex::getTablePrefix() . 'article WHERE id=' . (int) $article_id;
138         if ($clang !== null) {
139             $qry .= ' AND clang_id=' . (int) $clang;
140         }
141 
142         $sql = rex_sql::factory();
143         $sql->setQuery($qry);
144         $fieldnames = $sql->getFieldnames();
145         foreach ($sql as $row) {
146             $_clang = $row->getValue('clang_id');
147 
148             // --------------------------------------------------- Artikelparameter speichern
149             $params = ['last_update_stamp' => time()];
150             foreach ($fieldnames as $field) {
151                 switch ($field) {
152                     case 'createdate':
153                     case 'updatedate':
154                         $params[$field] = $row->getDateTimeValue($field);
155                         break;
156                     default:
157                         $params[$field] = $row->getValue($field);
158                 }
159             }
160 
161             $article_file = rex_path::addonCache('structure', "$article_id.$_clang.article");
162             if (rex_file::putCache($article_file, $params) === false) {
163                 return rex_i18n::msg('article_could_not_be_generated') . ' ' . rex_i18n::msg('check_rights_in_directory') . rex_path::addonCache('structure');
164             }
165         }
166 
167         return true;
168     }
169 
170     /**
171      * Generiert alle *.alist u. *.clist Dateien einer Kategorie/eines Artikels.
172      *
173      * @param int $parent_id KategorieId oder ArtikelId, die erneuert werden soll
174      *
175      * @return bool TRUE wenn der Artikel gelöscht wurde, sonst eine Fehlermeldung
176      */
177     public static function generateLists($parent_id)
178     {
179         // sanity check
180         if ($parent_id < 0) {
181             return false;
182         }
183 
184         // --------------------------------------- ARTICLE LIST
185 
186         $GC = rex_sql::factory();
187         // $GC->setDebug();
188         $GC->setQuery('select * from ' . rex::getTablePrefix() . 'article where clang_id=:clang AND ((parent_id=:id and startarticle=0) OR (id=:id and startarticle=1)) order by priority,name', ['id' => $parent_id, 'clang' => rex_clang::getStartId()]);
189 
190         $cacheArray = [];
191         foreach ($GC as $row) {
192             $cacheArray[] = (int) $row->getValue('id');
193         }
194 
195         $article_list_file = rex_path::addonCache('structure', $parent_id . '.alist');
196         if (rex_file::putCache($article_list_file, $cacheArray) === false) {
197             return rex_i18n::msg('article_could_not_be_generated') . ' ' . rex_i18n::msg('check_rights_in_directory') . rex_path::addonCache('structure');
198         }
199 
200         // --------------------------------------- CAT LIST
201 
202         $GC = rex_sql::factory();
203         $GC->setQuery('select * from ' . rex::getTablePrefix() . 'article where parent_id=:id and clang_id=:clang and startarticle=1 order by catpriority,name', ['id' => $parent_id, 'clang' => rex_clang::getStartId()]);
204 
205         $cacheArray = [];
206         foreach ($GC as $row) {
207             $cacheArray[] = (int) $row->getValue('id');
208         }
209 
210         $article_categories_file = rex_path::addonCache('structure', $parent_id . '.clist');
211         if (rex_file::putCache($article_categories_file, $cacheArray) === false) {
212             return rex_i18n::msg('article_could_not_be_generated') . ' ' . rex_i18n::msg('check_rights_in_directory') . rex_path::addonCache('structure');
213         }
214 
215         return true;
216     }
217 }
218