Passed
Push — develop ( 4b65e1...8da09c )
by Jens
02:48
created

DocumentRouting::documentRouting()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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