Passed
Push — develop ( 7af1af...b22d40 )
by Jens
02:32
created

DocumentRouting   A

Complexity

Total Complexity 31

Size/Duplication

Total Lines 292
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 292
rs 9.8
c 0
b 0
f 0
wmc 31

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A editDocumentRoute() 0 19 3
A setDocumentTypeParameter() 0 9 2
A putDocumentTypeOnRequest() 0 9 2
A createNewDocument() 0 12 2
A overviewRouting() 0 17 2
A saveDocument() 0 12 2
A newDocumentRoute() 0 6 2
A checkDocumentType() 0 11 3
A selectDocumentTypesRoute() 0 5 1
A documentNewRoute() 0 8 3
A deleteDocumentRoute() 0 7 1
A handleInfoMessages() 0 8 3
A setDocumentFormParameters() 0 8 1
A getBrickRoute() 0 20 3
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\cms\document\PublicationRouting;
16
use CloudControl\Cms\components\CmsComponent;
17
use CloudControl\Cms\search\Search;
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
    );
29
    const GET_PARAMETER_NOT_FOUND = 'not-found';
30
31
    const GET_PARAMETER_FOLDER_DELETE = 'folder-delete';
32
    const GET_PARAMETER_DOCUMENT_DELETE = 'document-delete';
33
    const GET_PARAMETER_NO_DOCUMENT_TYPES = 'no-document-types';
34
35
    private static $infoMessageHandlers = array(
36
        self::GET_PARAMETER_NOT_FOUND => 'notFound',
37
        self::GET_PARAMETER_FOLDER_DELETE => 'folderDelete',
38
        self::GET_PARAMETER_DOCUMENT_DELETE => 'documentDelete',
39
        self::GET_PARAMETER_NO_DOCUMENT_TYPES => 'noDocumentTypes',
40
        PublicationRouting::GET_PARAMETER_PUBLISHED => 'published',
41
        PublicationRouting::GET_PARAMETER_UNPUBLISHED => 'unpublished',
42
    );
43
44
    /**
45
     * DocumentRouting constructor.
46
     * @param $request
47
     * @param $relativeCmsUri
48
     * @param CmsComponent $cmsComponent
49
     * @throws \Exception
50
     */
51
    public function __construct(Request $request, $relativeCmsUri, CmsComponent $cmsComponent)
52
    {
53
        $this->doRouting($request, $relativeCmsUri, $cmsComponent);
54
        new FolderRouting($request, $relativeCmsUri, $cmsComponent);
55
        new PublicationRouting($request, $relativeCmsUri, $cmsComponent);
56
    }
57
58
    /**
59
     * @param $request
60
     * @param CmsComponent $cmsComponent
61
     *
62
     * @throws \Exception
63
     */
64
    protected function documentNewRoute($request, $cmsComponent)
65
    {
66
        if (isset($request::$get[CmsConstants::GET_PARAMETER_PATH])) {
67
            $this->setDocumentFormParameters($cmsComponent);
68
            if (isset($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE])) {
69
                $this->newDocumentRoute($request, $cmsComponent);
70
            } else {
71
                $this->selectDocumentTypesRoute($request, $cmsComponent);
72
            }
73
        }
74
75
    }
76
77
    /**
78
     * @param $request
79
     * @param CmsComponent $cmsComponent
80
     * @throws \Exception
81
     */
82
    protected function editDocumentRoute($request, $cmsComponent)
83
    {
84
        $document = $cmsComponent->storage->getDocuments()->getDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG],
85
            PublicationRouting::GET_PARAMETER_UNPUBLISHED);
86
        if (!$document instanceof Document) {
87
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?not-found');
88
            exit;
89
        }
90
91
        $this->setDocumentFormParameters($cmsComponent);
92
93
        if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::GET_PARAMETER_SLUG])) {
94
            $this->saveDocument($request, $cmsComponent);
95
        }
96
97
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT, $document);
98
99
        $request::$get[CmsConstants::GET_PARAMETER_PATH] = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
100
        $this->setDocumentTypeParameter($cmsComponent, $document);
101
102
103
    }
104
105
    /**
106
     * @param $request
107
     * @param CmsComponent $cmsComponent
108
     * @throws \Exception
109
     */
110
    protected function getBrickRoute($request, $cmsComponent)
111
    {
112
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE,
113
            $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
114
        $cmsComponent->subTemplate = 'documents/brick';
115
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICK,
116
            $cmsComponent->storage->getBricks()->getBrickBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
117
        $cmsComponent->setParameter(CmsConstants::PARAMETER_STATIC,
118
            $request::$get[CmsConstants::PARAMETER_STATIC] === 'true');
119
        if (isset($request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG])) {
120
            $cmsComponent->setParameter(CmsConstants::PARAMETER_MY_BRICK_SLUG,
121
                $request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG]);
122
        }
123
        $result = new \stdClass();
124
        $result->body = $cmsComponent->renderTemplate('documents/brick');
125
        $result->rteList = isset($GLOBALS['rteList']) ? $GLOBALS['rteList'] : array();
126
        ob_clean();
127
        ResponseHeaders::add(ResponseHeaders::HEADER_CONTENT_TYPE, ResponseHeaders::HEADER_CONTENT_TYPE_CONTENT_APPLICATION_JSON);
128
        ResponseHeaders::sendAllHeaders();
129
        die(json_encode($result));
130
    }
131
132
    /**
133
     * @param $request
134
     * @param CmsComponent $cmsComponent
135
     * @throws \Exception
136
     */
137
    protected function deleteDocumentRoute($request, $cmsComponent)
138
    {
139
        $cmsComponent->storage->getDocuments()->deleteDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
140
        $cmsComponent->storage->getActivityLog()->add('deleted document /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG],
141
            'trash');
142
        header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?document-delete');
143
        exit;
144
    }
145
146
147
148
    /**
149
     * @param CmsComponent $cmsComponent
150
     * @param Request $request
151
     * @throws \Exception
152
     */
153
    protected function overviewRouting($request, $cmsComponent)
154
    {
155
        $cmsComponent->subTemplate = 'documents';
156
157
        $path = isset($request::$get['path']) ? $request::$get['path'] : '/';
158
159
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENTS,
160
            $cmsComponent->storage->getDocuments()->getDocumentsWithState($path));
161
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
162
        $cmsComponent->setParameter('path', $path);
163
164
        $documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
165
        $indexer = new Search($cmsComponent->storage);
166
        $indexedDocuments = $indexer->getIndexedDocuments();
167
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
168
169
        $this->handleInfoMessages($cmsComponent);
170
    }
171
172
    /**
173
     * @param CmsComponent $cmsComponent
174
     * @internal param Request $request
175
     */
176
    private function handleInfoMessages($cmsComponent)
177
    {
178
        $getParameters = array_keys($_GET);
179
        $infoMessageKeys = array_keys(self::$infoMessageHandlers);
180
        foreach ($getParameters as $parameter) {
181
            if (in_array($parameter, $infoMessageKeys, true)) {
182
                $method = self::$infoMessageHandlers[$parameter];
183
                InfoMessagesHandler::$method($cmsComponent);
184
            }
185
        }
186
    }
187
188
189
190
    /**
191
     * @param $request
192
     * @param CmsComponent $cmsComponent
193
     * @throws \Exception
194
     */
195
    private function createNewDocument($request, $cmsComponent)
196
    {
197
        $path = substr($cmsComponent->storage->getDocuments()->addDocument($request::$post), 1);
198
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
199
        $cmsComponent->storage->getActivityLog()->add('created document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path ' . $request::$get[CmsConstants::GET_PARAMETER_PATH],
200
            'plus');
201
        if (isset($request::$post[CmsConstants::PARAMETER_SAVE_AND_PUBLISH])) {
202
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/publish-document?slug=' . $path);
203
        } else {
204
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
205
        }
206
        exit;
207
    }
208
209
    /**
210
     * @param Request $request
211
     * @param CmsComponent $cmsComponent
212
     */
213
    private function putDocumentTypeOnRequest($request, $cmsComponent)
214
    {
215
        $documentType = $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE],
216
            true);
217
        if ($documentType === null) {
218
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
219
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
220
        }
221
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $documentType);
222
    }
223
224
    /**
225
     * @param $request
226
     * @param CmsComponent $cmsComponent
227
     * @param $documentTypes
228
     */
229
    private function checkDocumentType($request, $cmsComponent, $documentTypes)
230
    {
231
        $docTypesCount = count($documentTypes);
232
        if ($docTypesCount < 1) {
233
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?no-document-types');
234
            exit;
235
        }
236
237
        if ($docTypesCount === 1) {
238
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/new-document?path=' . urlencode($_GET['path']) . '&documentType=' . $documentTypes[0]->slug);
239
            exit;
240
        }
241
    }
242
243
    /**
244
     * @param Request $request
245
     * @param CmsComponent $cmsComponent
246
     * @throws \Exception
247
     */
248
    private function newDocumentRoute($request, $cmsComponent)
249
    {
250
        if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE], $request::$get[CmsConstants::GET_PARAMETER_PATH])) {
251
            $this->createNewDocument($request, $cmsComponent);
252
        }
253
        $this->putDocumentTypeOnRequest($request, $cmsComponent);
254
    }
255
256
    /**
257
     * @param Request $request
258
     * @param CmsComponent $cmsComponent
259
     */
260
    private function selectDocumentTypesRoute($request, $cmsComponent)
261
    {
262
        $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
263
        $this->checkDocumentType($request, $cmsComponent, $documentTypes);
264
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
265
    }
266
267
    /**
268
     * @param Request $request
269
     * @param CmsComponent $cmsComponent
270
     * @throws \Exception
271
     */
272
    protected function saveDocument($request, $cmsComponent)
273
    {
274
        $path = substr($cmsComponent->storage->getDocuments()->saveDocument($request::$post), 1);
275
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
276
        $cmsComponent->storage->getActivityLog()->add('edited document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG],
277
            'pencil');
278
        if (isset($request::$post[CmsConstants::PARAMETER_SAVE_AND_PUBLISH])) {
279
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/publish-document?slug=' . $path);
280
        } else {
281
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?path=' . $this->getReturnPath($request));
282
        }
283
        exit;
284
    }
285
286
    /**
287
     * @param CmsComponent $cmsComponent
288
     * @param Document $document
289
     */
290
    protected function setDocumentTypeParameter($cmsComponent, $document)
291
    {
292
        $documentType = $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($document->documentTypeSlug,
293
            true);
294
        if ($documentType === null) {
295
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
296
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
297
        }
298
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $documentType);
299
    }
300
301
    /**
302
     * @param CmsComponent $cmsComponent
303
     */
304
    protected function setDocumentFormParameters($cmsComponent)
305
    {
306
        $cmsComponent->subTemplate = 'documents/document-form';
307
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
308
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE,
309
            $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
310
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICKS,
311
            $cmsComponent->storage->getBricks()->getBricks());
312
    }
313
}