Passed
Push — master ( 3a2d72...a747ff )
by Jens
02:50
created

DocumentRouting::documentRouting()   B

Complexity

Conditions 9
Paths 8

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 9
nc 8
nop 3
dl 0
loc 11
rs 7.756
c 0
b 0
f 0
1
<?php
2
/**
3
 * User: Jens
4
 * Date: 29-1-2017
5
 * Time: 15:23
6
 */
7
8
namespace CloudControl\Cms\components\cms;
9
10
11
use CloudControl\Cms\cc\Request;
12
use CloudControl\Cms\cc\ResponseHeaders;
13
use CloudControl\Cms\components\cms\document\FolderRouting;
14
use CloudControl\Cms\components\cms\document\InfoMessagesHandler;
15
use CloudControl\Cms\components\CmsComponent;
16
use CloudControl\Cms\search\Search;
17
use CloudControl\Cms\storage\Cache;
18
use CloudControl\Cms\storage\entities\Document;
19
20
class DocumentRouting extends CmsRouting
21
{
22
    protected static $routes = array(
23
        '/documents' => 'overviewRouting',
24
        '/documents/new-document' => 'documentNewRoute',
25
        '/documents/edit-document' => 'editDocumentRoute',
26
        '/documents/get-brick' => 'getBrickRoute',
27
        '/documents/delete-document' => 'deleteDocumentRoute',
28
        '/documents/publish-document' => 'publishDocumentRoute',
29
        '/documents/unpublish-document' => 'unpublishDocumentRoute',
30
    );
31
    const GET_PARAMETER_NOT_FOUND = 'not-found';
32
    const GET_PARAMETER_PUBLISHED = 'published';
33
    const GET_PARAMETER_UNPUBLISHED = 'unpublished';
34
    const GET_PARAMETER_FOLDER_DELETE = 'folder-delete';
35
    const GET_PARAMETER_DOCUMENT_DELETE = 'document-delete';
36
    const GET_PARAMETER_NO_DOCUMENT_TYPES = 'no-document-types';
37
38
    private static $infoMessageHandlers = array(
39
        self::GET_PARAMETER_NOT_FOUND => 'notFound',
40
        self::GET_PARAMETER_PUBLISHED => 'published',
41
        self::GET_PARAMETER_UNPUBLISHED => 'unpublished',
42
        self::GET_PARAMETER_FOLDER_DELETE => 'folderDelete',
43
        self::GET_PARAMETER_DOCUMENT_DELETE => 'documentDelete',
44
        self::GET_PARAMETER_NO_DOCUMENT_TYPES => 'noDocumentTypes',
45
    );
46
47
    /**
48
     * DocumentRouting constructor.
49
     * @param $request
50
     * @param $relativeCmsUri
51
     * @param CmsComponent $cmsComponent
52
     * @throws \Exception
53
     */
54
    public function __construct(Request $request, $relativeCmsUri, CmsComponent $cmsComponent)
55
    {
56
        $this->doRouting($request, $relativeCmsUri, $cmsComponent);
57
        new FolderRouting($request, $relativeCmsUri, $cmsComponent);
58
    }
59
60
    /**
61
     * @param $request
62
     * @param CmsComponent $cmsComponent
63
     *
64
     * @throws \Exception
65
     */
66
    protected function documentNewRoute($request, $cmsComponent)
67
    {
68
        if (isset($request::$get[CmsConstants::GET_PARAMETER_PATH])) {
69
            $this->setDocumentFormParameters($cmsComponent);
70
            if (isset($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE])) {
71
                $this->newDocumentRoute($request, $cmsComponent);
72
            } else {
73
                $this->selectDocumentTypesRoute($request, $cmsComponent);
74
            }
75
        }
76
77
    }
78
79
    /**
80
     * @param $request
81
     * @param CmsComponent $cmsComponent
82
     * @throws \Exception
83
     */
84
    protected function editDocumentRoute($request, $cmsComponent)
85
    {
86
        $document = $cmsComponent->storage->getDocuments()->getDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG],
87
            self::GET_PARAMETER_UNPUBLISHED);
88
        if (!$document instanceof Document) {
89
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?not-found');
90
            exit;
91
        }
92
93
        $this->setDocumentFormParameters($cmsComponent);
94
95
        if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::GET_PARAMETER_SLUG])) {
96
            $this->saveDocument($request, $cmsComponent);
97
        }
98
99
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT, $document);
100
101
        $request::$get[CmsConstants::GET_PARAMETER_PATH] = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
102
        $this->setDocumentTypeParameter($cmsComponent, $document);
103
104
105
    }
106
107
    /**
108
     * @param $request
109
     * @param CmsComponent $cmsComponent
110
     * @throws \Exception
111
     */
112
    protected function getBrickRoute($request, $cmsComponent)
113
    {
114
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE,
115
            $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
116
        $cmsComponent->subTemplate = 'documents/brick';
117
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICK,
118
            $cmsComponent->storage->getBricks()->getBrickBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
119
        $cmsComponent->setParameter(CmsConstants::PARAMETER_STATIC,
120
            $request::$get[CmsConstants::PARAMETER_STATIC] === 'true');
121
        if (isset($request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG])) {
122
            $cmsComponent->setParameter(CmsConstants::PARAMETER_MY_BRICK_SLUG,
123
                $request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG]);
124
        }
125
        $result = new \stdClass();
126
        $result->body = $cmsComponent->renderTemplate('documents/brick');
127
        $result->rteList = isset($GLOBALS['rteList']) ? $GLOBALS['rteList'] : array();
128
        ob_clean();
129
        ResponseHeaders::add(ResponseHeaders::HEADER_CONTENT_TYPE, ResponseHeaders::HEADER_CONTENT_TYPE_CONTENT_APPLICATION_JSON);
130
        ResponseHeaders::sendAllHeaders();
131
        die(json_encode($result));
132
    }
133
134
    /**
135
     * @param $request
136
     * @param CmsComponent $cmsComponent
137
     * @throws \Exception
138
     */
139
    protected function deleteDocumentRoute($request, $cmsComponent)
140
    {
141
        $cmsComponent->storage->getDocuments()->deleteDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
142
        $cmsComponent->storage->getActivityLog()->add('deleted document /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG],
143
            'trash');
144
        header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?document-delete');
145
        exit;
146
    }
147
148
    /**
149
     * @param $request
150
     * @param CmsComponent $cmsComponent
151
     * @throws \Exception
152
     */
153
    protected function publishDocumentRoute($request, $cmsComponent)
154
    {
155
        $cmsComponent->storage->getDocuments()->publishDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
156
        $this->clearCacheAndLogActivity($request, $cmsComponent);
157
        $this->doAfterPublishRedirect($request, $cmsComponent);
158
    }
159
160
    /**
161
     * @param $request
162
     * @param CmsComponent $cmsComponent
163
     * @throws \Exception
164
     */
165
    protected function unpublishDocumentRoute($request, $cmsComponent)
166
    {
167
        $cmsComponent->storage->getDocuments()->unpublishDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
168
        $this->clearCacheAndLogActivity($request, $cmsComponent, 'times-circle-o', self::GET_PARAMETER_UNPUBLISHED);
169
        $this->doAfterPublishRedirect($request, $cmsComponent, self::GET_PARAMETER_UNPUBLISHED);
170
    }
171
172
    /**
173
     * @param CmsComponent $cmsComponent
174
     * @param Request $request
175
     * @throws \Exception
176
     */
177
    protected function overviewRouting($request, $cmsComponent)
178
    {
179
        $cmsComponent->subTemplate = 'documents';
180
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENTS,
181
            $cmsComponent->storage->getDocuments()->getDocumentsWithState());
182
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
183
184
        $documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
185
        $indexer = new Search($cmsComponent->storage);
186
        $indexedDocuments = $indexer->getIndexedDocuments();
187
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
188
189
        $this->handleInfoMessages($cmsComponent);
190
    }
191
192
    /**
193
     * @param CmsComponent $cmsComponent
194
     * @internal param Request $request
195
     */
196
    private function handleInfoMessages($cmsComponent)
197
    {
198
        $getParameters = array_keys($_GET);
199
        $infoMessageKeys = array_keys(self::$infoMessageHandlers);
200
        foreach ($getParameters as $parameter) {
201
            if (in_array($parameter, $infoMessageKeys, true)) {
202
                $method = self::$infoMessageHandlers[$parameter];
203
                InfoMessagesHandler::$method($cmsComponent);
204
            }
205
        }
206
    }
207
208
    /**
209
     * @param $request
210
     * @param CmsComponent $cmsComponent
211
     * @param string $param
212
     */
213
    private function doAfterPublishRedirect($request, $cmsComponent, $param = 'published')
214
    {
215
        if ($cmsComponent->autoUpdateSearchIndex) {
216
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/search/update-index?returnUrl=' . urlencode($request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?' . $param . '=' . urlencode($request::$get[CmsConstants::GET_PARAMETER_SLUG])));
217
        } else {
218
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?' . $param . '=' . urlencode($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
219
        }
220
        exit;
221
    }
222
223
    /**
224
     * @param $request
225
     * @param CmsComponent $cmsComponent
226
     * @param string $icon
227
     * @param string $activity
228
     */
229
    private function clearCacheAndLogActivity(
230
        $request,
231
        $cmsComponent,
232
        $icon = 'check-circle-o',
233
        $activity = 'published'
234
    )
235
    {
236
        Cache::getInstance()->clearCache();
237
        $path = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
238
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
239
        $cmsComponent->storage->getActivityLog()->add($activity . ' document <a href="' . $docLink . '">' . $request::$get[CmsConstants::GET_PARAMETER_SLUG] . '</a>',
240
            $icon);
241
    }
242
243
    /**
244
     * @param $request
245
     * @param CmsComponent $cmsComponent
246
     * @throws \Exception
247
     */
248
    private function createNewDocument($request, $cmsComponent)
249
    {
250
        $path = substr($cmsComponent->storage->getDocuments()->addDocument($request::$post), 1);
251
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
252
        $cmsComponent->storage->getActivityLog()->add('created document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path ' . $request::$get[CmsConstants::GET_PARAMETER_PATH],
253
            'plus');
254
        if (isset($request::$post[CmsConstants::PARAMETER_SAVE_AND_PUBLISH])) {
255
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/publish-document?slug=' . $path);
256
        } else {
257
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
258
        }
259
        exit;
260
    }
261
262
    /**
263
     * @param Request $request
264
     * @param CmsComponent $cmsComponent
265
     */
266
    private function putDocumentTypeOnRequest($request, $cmsComponent)
267
    {
268
        $documentType = $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE],
269
            true);
270
        if ($documentType === null) {
271
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
272
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
273
        }
274
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $documentType);
275
    }
276
277
    /**
278
     * @param $request
279
     * @param CmsComponent $cmsComponent
280
     * @param $documentTypes
281
     */
282
    private function checkDocumentType($request, $cmsComponent, $documentTypes)
283
    {
284
        $docTypesCount = count($documentTypes);
285
        if ($docTypesCount < 1) {
286
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?no-document-types');
287
            exit;
288
        }
289
290
        if ($docTypesCount === 1) {
291
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/new-document?path=' . urlencode($_GET['path']) . '&documentType=' . $documentTypes[0]->slug);
292
            exit;
293
        }
294
    }
295
296
    /**
297
     * @param Request $request
298
     * @param CmsComponent $cmsComponent
299
     * @throws \Exception
300
     */
301
    private function newDocumentRoute($request, $cmsComponent)
302
    {
303
        if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE], $request::$get[CmsConstants::GET_PARAMETER_PATH])) {
304
            $this->createNewDocument($request, $cmsComponent);
305
        }
306
        $this->putDocumentTypeOnRequest($request, $cmsComponent);
307
    }
308
309
    /**
310
     * @param Request $request
311
     * @param CmsComponent $cmsComponent
312
     */
313
    private function selectDocumentTypesRoute($request, $cmsComponent)
314
    {
315
        $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
316
        $this->checkDocumentType($request, $cmsComponent, $documentTypes);
317
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
318
    }
319
320
    /**
321
     * @param Request $request
322
     * @param CmsComponent $cmsComponent
323
     * @throws \Exception
324
     */
325
    protected function saveDocument($request, $cmsComponent)
326
    {
327
        $path = substr($cmsComponent->storage->getDocuments()->saveDocument($request::$post), 1);
328
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
329
        $cmsComponent->storage->getActivityLog()->add('edited document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG],
330
            'pencil');
331
        if (isset($request::$post[CmsConstants::PARAMETER_SAVE_AND_PUBLISH])) {
332
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/publish-document?slug=' . $path);
333
        } else {
334
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
335
        }
336
        exit;
337
    }
338
339
    /**
340
     * @param CmsComponent $cmsComponent
341
     * @param Document $document
342
     */
343
    protected function setDocumentTypeParameter($cmsComponent, $document)
344
    {
345
        $documentType = $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($document->documentTypeSlug,
346
            true);
347
        if ($documentType === null) {
348
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
349
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
350
        }
351
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $documentType);
352
    }
353
354
    /**
355
     * @param $cmsComponent
356
     */
357
    protected function setDocumentFormParameters($cmsComponent)
358
    {
359
        $cmsComponent->subTemplate = 'documents/document-form';
360
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
361
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE,
362
            $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
363
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICKS,
364
            $cmsComponent->storage->getBricks()->getBricks());
365
    }
366
}