Passed
Push — master ( f61691...1918f3 )
by Jens
07:18
created

DocumentRouting::documentNewRoute()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 28
Code Lines 23

Duplication

Lines 7
Ratio 25 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 23
c 1
b 0
f 0
nc 5
nop 2
dl 7
loc 28
rs 8.439
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\components\cms\document\FolderRouting;
13
use CloudControl\Cms\components\CmsComponent;
14
use CloudControl\Cms\search\Search;
15
use CloudControl\Cms\storage\Document;
16
17
class DocumentRouting implements CmsRouting
18
{
19
    /**
20
     * DocumentRouting constructor.
21
     * @param $request
22
     * @param $relativeCmsUri
23
     * @param CmsComponent $cmsComponent
24
     */
25
    public function __construct(Request $request, $relativeCmsUri, CmsComponent $cmsComponent)
26
    {
27
        if ($relativeCmsUri == '/documents') {
28
            $this->overviewRouting($cmsComponent, $request);
29
        }
30
        $this->documentRouting($request, $relativeCmsUri, $cmsComponent);
31
        new FolderRouting($request, $relativeCmsUri, $cmsComponent);
32
    }
33
34
35
    /**
36
     * @param Request $request
37
     * @param string $relativeCmsUri
38
     * @param CmsComponent $cmsComponent
39
     * @throws \Exception
40
     */
41
    private function documentRouting($request, $relativeCmsUri, $cmsComponent)
42
    {
43
        if ($relativeCmsUri == '/documents/new-document' && isset($request::$get[CmsConstants::GET_PARAMETER_PATH])) {
44
            $this->documentNewRoute($request, $cmsComponent);
45
        } elseif (isset($request::$get[CmsConstants::GET_PARAMETER_SLUG])) {
46
            switch ($relativeCmsUri) {
47
                case '/documents/edit-document': $this->editDocumentRoute($request, $cmsComponent); break;
48
                case '/documents/get-brick': $this->getBrickRoute($request, $cmsComponent); break;
49
                case '/documents/delete-document': $this->deleteDocumentRoute($request, $cmsComponent); break;
50
                case '/documents/publish-document': $this->publishDocumentRoute($request, $cmsComponent); break;
51
                case '/documents/unpublish-document': $this->unpublishDocumentRoute($request, $cmsComponent); break;
52
            }
53
        }
54
    }
55
56
    /**
57
     * @param $request
58
     * @param CmsComponent $cmsComponent
59
     *
60
     * @throws \Exception
61
     */
62
    private function documentNewRoute($request, $cmsComponent)
63
    {
64
        $cmsComponent->subTemplate = 'documents/document-form';
65
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
66
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE, $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
67
        if (isset($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE])) {
68 View Code Duplication
            if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE], $request::$get[CmsConstants::GET_PARAMETER_PATH])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
69
                $path = substr($cmsComponent->storage->getDocuments()->addDocument($request::$post), 1);
70
                $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
71
                $cmsComponent->storage->getActivityLog()->add('created document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path ' . $request::$get[CmsConstants::GET_PARAMETER_PATH], 'plus');
72
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
73
                exit;
74
            }
75
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($request::$get[CmsConstants::PARAMETER_DOCUMENT_TYPE], true));
76
            $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICKS, $cmsComponent->storage->getBricks()->getBricks());
77
        } else {
78
            $documentTypes = $cmsComponent->storage->getDocumentTypes()->getDocumentTypes();
79
            $docTypesCount = count($documentTypes);
80
            if ($docTypesCount < 1) {
81
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?no-document-types');
82
                exit;
83
            } elseif ($docTypesCount == 1) {
84
                header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/new-document?path=' . urlencode($_GET['path']) . '&documentType=' . $documentTypes[0]->slug);
85
                exit;
86
            }
87
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPES, $documentTypes);
88
        }
89
    }
90
91
    /**
92
     * @param $request
93
     * @param CmsComponent $cmsComponent
94
     */
95
    private function editDocumentRoute($request, $cmsComponent)
96
    {
97
        $cmsComponent->subTemplate = 'documents/document-form';
98
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
99
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE, $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
100 View Code Duplication
        if (isset($request::$post[CmsConstants::POST_PARAMETER_TITLE], $request::$get[CmsConstants::GET_PARAMETER_SLUG])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
101
            $path = substr($cmsComponent->storage->getDocuments()->saveDocument($request::$post), 1);
102
            $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
103
            $cmsComponent->storage->getActivityLog()->add('edited document <a href="' . $docLink . '">' . $request::$post[CmsConstants::POST_PARAMETER_TITLE] . '</a> in path /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG], 'pencil');
104
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents');
105
            exit;
106
        }
107
        $document = $cmsComponent->storage->getDocuments()->getDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG], 'unpublished');
108
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT, $document);
109
110
        $request::$get[CmsConstants::GET_PARAMETER_PATH] = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
111
        if ($document instanceof Document) {
112
            $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENT_TYPE, $cmsComponent->storage->getDocumentTypes()->getDocumentTypeBySlug($document->documentTypeSlug, true));
113
        } else {
114
            header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?not-found');
115
            exit;
116
        }
117
118
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICKS, $cmsComponent->storage->getBricks()->getBricks());
119
    }
120
121
    /**
122
     * @param $request
123
     * @param CmsComponent $cmsComponent
124
     */
125
    private function getBrickRoute($request, $cmsComponent)
126
    {
127
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SMALLEST_IMAGE, $cmsComponent->storage->getImageSet()->getSmallestImageSet()->slug);
128
        $cmsComponent->subTemplate = 'documents/brick';
129
        $cmsComponent->setParameter(CmsConstants::PARAMETER_BRICK, $cmsComponent->storage->getBricks()->getBrickBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
130
        $cmsComponent->setParameter(CmsConstants::PARAMETER_STATIC, $request::$get[CmsConstants::PARAMETER_STATIC] === 'true');
131
        if (isset($request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG])) {
132
            $cmsComponent->setParameter(CmsConstants::PARAMETER_MY_BRICK_SLUG, $request::$get[CmsConstants::PARAMETER_MY_BRICK_SLUG]);
133
        }
134
        $result = new \stdClass();
135
        $result->body = $cmsComponent->renderTemplate('documents/brick');
136
        $result->rteList = isset($GLOBALS['rteList']) ? $GLOBALS['rteList'] : array();
137
        ob_clean();
138
        header(CmsConstants::CONTENT_TYPE_APPLICATION_JSON);
139
        die(json_encode($result));
140
    }
141
142
    /**
143
     * @param $request
144
     * @param CmsComponent $cmsComponent
145
     */
146 View Code Duplication
    private function deleteDocumentRoute($request, $cmsComponent)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
147
    {
148
        $cmsComponent->storage->getDocuments()->deleteDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
149
        $cmsComponent->storage->getActivityLog()->add('deleted document /' . $request::$get[CmsConstants::GET_PARAMETER_SLUG], 'trash');
150
        header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?document-delete');
151
        exit;
152
    }
153
154
    /**
155
     * @param $request
156
     * @param CmsComponent $cmsComponent
157
     */
158 View Code Duplication
    private function publishDocumentRoute($request, $cmsComponent)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
159
    {
160
        $cmsComponent->storage->getDocuments()->publishDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
161
        $path = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
162
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
163
        $cmsComponent->storage->getActivityLog()->add('published document <a href="' . $docLink . '">' . $request::$get[CmsConstants::GET_PARAMETER_SLUG] . '</a>', 'check-circle-o');
164
        header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?published=' . htmlentities($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
165
        exit;
166
    }
167
168
    /**
169
     * @param $request
170
     * @param CmsComponent $cmsComponent
171
     */
172 View Code Duplication
    private function unpublishDocumentRoute($request, $cmsComponent)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
173
    {
174
        $cmsComponent->storage->getDocuments()->unpublishDocumentBySlug($request::$get[CmsConstants::GET_PARAMETER_SLUG]);
175
        $path = $request::$get[CmsConstants::GET_PARAMETER_SLUG];
176
        $docLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents/edit-document?slug=' . $path;
177
        $cmsComponent->storage->getActivityLog()->add('unpublished document <a href="' . $docLink . '">' . $request::$get[CmsConstants::GET_PARAMETER_SLUG] . '</a>', 'times-circle-o');
178
        header('Location: ' . $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/documents?unpublished=' . htmlentities($request::$get[CmsConstants::GET_PARAMETER_SLUG]));
179
        exit;
180
    }
181
182
    /**
183
     * @param CmsComponent $cmsComponent
184
     * @param Request $request
185
     */
186
    private function overviewRouting($cmsComponent, $request)
187
    {
188
        $cmsComponent->subTemplate = 'documents';
189
        $cmsComponent->setParameter(CmsConstants::PARAMETER_DOCUMENTS, $cmsComponent->storage->getDocuments()->getDocumentsWithState());
190
        $cmsComponent->setParameter(CmsConstants::PARAMETER_MAIN_NAV_CLASS, CmsConstants::PARAMETER_DOCUMENTS);
191
192
        $documentCount = $cmsComponent->storage->getDocuments()->getTotalDocumentCount();
193
        $indexer = new Search($cmsComponent->storage);
194
        $indexedDocuments = $indexer->getIndexedDocuments();
195
        $cmsComponent->setParameter(CmsConstants::PARAMETER_SEARCH_NEEDS_UPDATE, $documentCount !== $indexedDocuments);
196
197
        $this->handleInfoMessages($cmsComponent, $request);
198
    }
199
200
    /**
201
     * @param CmsComponent $cmsComponent
202
     * @param Request $request
203
     */
204
    private function handleInfoMessages($cmsComponent, $request)
205
    {
206
        if (isset($_GET['not-found'])) {
207
            $cmsComponent->setParameter('infoMessage', 'Document could not be found. It might have been removed.');
208
            $cmsComponent->setParameter('infoMessageClass', 'error');
209
        } elseif (isset($_GET['published'])) {
210
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-check-circle-o"></i> Document ' . $_GET['published'] . ' published');
211
        } elseif (isset($_GET['unpublished'])) {
212
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-times-circle-o"></i> Document ' . $_GET['unpublished'] . ' unpublished');
213
        } elseif (isset($_GET['folder-delete'])) {
214
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-trash"></i> Folder deleted');
215
        } elseif (isset($_GET['document-delete'])) {
216
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-trash"></i> Document deleted');
217
        } elseif (isset($_GET['no-document-types'])) {
218
            $documentTypesLink = $request::$subfolders . $cmsComponent->getParameter(CmsConstants::PARAMETER_CMS_PREFIX) . '/configuration/document-types/new';
219
            $cmsComponent->setParameter('infoMessage', '<i class="fa fa-exclamation-circle"></i> No document types defined yet. Please do so first, <a href="' . $documentTypesLink . '">here</a>.');
220
        }
221
    }
222
}