Passed
Push — develop ( 0d45b7...4b65e1 )
by Jens
03:01
created

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