Issues (55)

src/components/cms/DocumentRouting.php (1 issue)

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