Passed
Push — develop ( c8d7ff...6557e2 )
by Jens
04:24
created

DocumentRouting::getReturnPath()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 5
rs 9.4285
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
181
        $path = isset($request::$get['path']) ? $request::$get['path'] : '/';
182
183
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENTS,
184
            $cmsComponent->storage->getDocuments()->getDocumentsWithState($path));
185
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
186
        $cmsComponent->setParameter('path', $path);
187
188
        $documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
189
        $indexer = new Search($cmsComponent->storage);
190
        $indexedDocuments = $indexer->getIndexedDocuments();
191
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
192
193
        $this->handleInfoMessages($cmsComponent);
194
    }
195
196
    /**
197
     * @param CmsComponent $cmsComponent
198
     * @internal param Request $request
199
     */
200
    private function handleInfoMessages($cmsComponent)
201
    {
202
        $getParameters = array_keys($_GET);
203
        $infoMessageKeys = array_keys(self::$infoMessageHandlers);
204
        foreach ($getParameters as $parameter) {
205
            if (in_array($parameter, $infoMessageKeys, true)) {
206
                $method = self::$infoMessageHandlers[$parameter];
207
                InfoMessagesHandler::$method($cmsComponent);
208
            }
209
        }
210
    }
211
212
    /**
213
     * @param $request
214
     * @param CmsComponent $cmsComponent
215
     * @param string $param
216
     */
217
    private function doAfterPublishRedirect($request, $cmsComponent, $param = 'published')
218
    {
219
        if ($cmsComponent->autoUpdateSearchIndex) {
220
            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]) . '&path=' . $this->getReturnPath($request)));
221
        } else {
222
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?' . $param . '=' . urlencode($request::$get[CmsConstants::GET_PARAMETER_SLUG]) . '&path=' . $this->getReturnPath($request));
223
        }
224
        exit;
225
    }
226
227
    /**
228
     * @param $request
229
     * @param CmsComponent $cmsComponent
230
     * @param string $icon
231
     * @param string $activity
232
     */
233
    private function clearCacheAndLogActivity(
234
        $request,
235
        $cmsComponent,
236
        $icon = 'check-circle-o',
237
        $activity = 'published'
238
    )
239
    {
240
        Cache::getInstance()->clearCache();
241
        $path = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
242
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
243
        $cmsComponent->storage->getActivityLog()->add($activity . ' document <a href="' . $docLink . '">' . $request::$get[CmsConstants::GET_PARAMETER_SLUG] . '</a>',
244
            $icon);
245
    }
246
247
    /**
248
     * @param $request
249
     * @param CmsComponent $cmsComponent
250
     * @throws \Exception
251
     */
252
    private function createNewDocument($request, $cmsComponent)
253
    {
254
        $path = substr($cmsComponent->storage->getDocuments()->addDocument($request::$post), 1);
255
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
256
        $cmsComponent->storage->getActivityLog()->add('created document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path ' . $request::$get[CmsConstants::GET_PARAMETER_PATH],
257
            'plus');
258
        if (isset($request::$post[CmsConstants::PARAMETER_SAVE_AND_PUBLISH])) {
259
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/publish-document?slug=' . $path);
260
        } else {
261
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
262
        }
263
        exit;
264
    }
265
266
    /**
267
     * @param Request $request
268
     * @param CmsComponent $cmsComponent
269
     */
270
    private function putDocumentTypeOnRequest($request, $cmsComponent)
271
    {
272
        $documentType = $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE],
273
            true);
274
        if ($documentType === null) {
275
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
276
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
277
        }
278
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $documentType);
279
    }
280
281
    /**
282
     * @param $request
283
     * @param CmsComponent $cmsComponent
284
     * @param $documentTypes
285
     */
286
    private function checkDocumentType($request, $cmsComponent, $documentTypes)
287
    {
288
        $docTypesCount = count($documentTypes);
289
        if ($docTypesCount < 1) {
290
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?no-document-types');
291
            exit;
292
        }
293
294
        if ($docTypesCount === 1) {
295
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/new-document?path=' . urlencode($_GET['path']) . '&documentType=' . $documentTypes[0]->slug);
296
            exit;
297
        }
298
    }
299
300
    /**
301
     * @param Request $request
302
     * @param CmsComponent $cmsComponent
303
     * @throws \Exception
304
     */
305
    private function newDocumentRoute($request, $cmsComponent)
306
    {
307
        if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE], $request::$get[CmsConstants::GET_PARAMETER_PATH])) {
308
            $this->createNewDocument($request, $cmsComponent);
309
        }
310
        $this->putDocumentTypeOnRequest($request, $cmsComponent);
311
    }
312
313
    /**
314
     * @param Request $request
315
     * @param CmsComponent $cmsComponent
316
     */
317
    private function selectDocumentTypesRoute($request, $cmsComponent)
318
    {
319
        $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
320
        $this->checkDocumentType($request, $cmsComponent, $documentTypes);
321
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
322
    }
323
324
    /**
325
     * @param Request $request
326
     * @param CmsComponent $cmsComponent
327
     * @throws \Exception
328
     */
329
    protected function saveDocument($request, $cmsComponent)
330
    {
331
        $path = substr($cmsComponent->storage->getDocuments()->saveDocument($request::$post), 1);
332
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
333
        $cmsComponent->storage->getActivityLog()->add('edited document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG],
334
            'pencil');
335
        if (isset($request::$post[CmsConstants::PARAMETER_SAVE_AND_PUBLISH])) {
336
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/publish-document?slug=' . $path);
337
        } else {
338
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?path=' . $this->getReturnPath($request));
339
        }
340
        exit;
341
    }
342
343
    /**
344
     * @param CmsComponent $cmsComponent
345
     * @param Document $document
346
     */
347
    protected function setDocumentTypeParameter($cmsComponent, $document)
348
    {
349
        $documentType = $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($document->documentTypeSlug,
350
            true);
351
        if ($documentType === null) {
352
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
353
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
354
        }
355
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $documentType);
356
    }
357
358
    /**
359
     * @param $cmsComponent
360
     */
361
    protected function setDocumentFormParameters($cmsComponent)
362
    {
363
        $cmsComponent->subTemplate = 'documents/document-form';
364
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
365
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE,
366
            $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
367
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICKS,
368
            $cmsComponent->storage->getBricks()->getBricks());
369
    }
370
371
    /**
372
     * @param $request
373
     * @return string
374
     */
375
    protected function getReturnPath($request)
376
    {
377
        $returnPathParts = explode('/', $request::$get['slug']);
378
        array_pop($returnPathParts);
379
        return '/' . implode('/', $returnPathParts);
380
    }
381
}