/
check_in.php
151 lines (139 loc) · 5.75 KB
/
check_in.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
namespace Concrete\Controller\Panel\Page;
use Concrete\Controller\Backend\UserInterface\Page as BackendInterfacePageController;
use Concrete\Core\Form\Service\Widget\DateTime;
use Concrete\Core\Support\Facade\Config;
use Concrete\Core\User\User;
use Permissions;
use CollectionVersion;
use Loader;
use Page;
use Concrete\Core\Workflow\Request\ApprovePageRequest as ApprovePagePageWorkflowRequest;
use PageEditResponse;
use Concrete\Core\Http\ResponseFactoryInterface;
class CheckIn extends BackendInterfacePageController
{
protected $viewPath = '/panels/page/check_in';
// we need this extra because this controller gets called by another page
// and that page needs to know how to submit it.
protected $controllerActionPath = '/ccm/system/panels/page/check_in';
public function canAccess()
{
return $this->permissions->canApprovePageVersions() || $this->permissions->canEditPageContents();
}
public function on_start()
{
parent::on_start();
if ($this->page) {
$v = CollectionVersion::get($this->page, "RECENT");
$this->set('publishDate', $v->getPublishDate());
$this->set('publishErrors', $this->checkForPublishing());
}
}
protected function checkForPublishing()
{
$c = $this->page;
// verify this page type has all the items necessary to be approved.
$e = Loader::helper('validation/error');
if ($c->isPageDraft()) {
if (!$c->getPageDraftTargetParentPageID()) {
$e->add(t('You haven\'t chosen where to publish this page.'));
}
}
$pagetype = $c->getPageTypeObject();
if (is_object($pagetype)) {
$validator = $pagetype->getPageTypeValidatorObject();
$e->add($validator->validatePublishDraftRequest($c));
}
if ($c->isPageDraft() && !$e->has()) {
$targetParentID = $c->getPageDraftTargetParentPageID();
if ($targetParentID) {
$tp = Page::getByID($targetParentID, 'ACTIVE');
$pp = new Permissions($tp);
if (!is_object($tp) || $tp->isError()) {
$e->add(t('Invalid target page.'));
} else {
if (!$pp->canAddSubCollection($pagetype)) {
$e->add(
t(
'You do not have permissions to add a page of this type in the selected location.'
)
);
}
}
}
}
return $e;
}
public function submit()
{
if ($this->validateAction()) {
$comments = $this->request->request('comments');
$comments = is_string($comments) ? trim($comments) : '';
if ($comments === '' && $this->app->make('config')->get('concrete.misc.require_version_comments')) {
$rf = $this->app->make(ResponseFactoryInterface::class);
return $rf->create(t('Please specify the version comments'), 400);
}
$c = $this->page;
$u = new User();
$v = CollectionVersion::get($c, "RECENT");
$v->setComment($comments);
$pr = new PageEditResponse();
if (($this->request->request->get('action') == 'publish'
|| $this->request->request->get('action') == 'schedule')
&& $this->permissions->canApprovePageVersions()
) {
$e = $this->checkForPublishing();
$pr->setError($e);
if (!$e->has()) {
$pkr = new ApprovePagePageWorkflowRequest();
$pkr->setRequestedPage($c);
$pkr->setRequestedVersionID($v->getVersionID());
$pkr->setRequesterUserID($u->getUserID());
$u->unloadCollectionEdit($c);
if ($this->request->request->get('action') == 'schedule') {
$dateTime = new DateTime();
$publishDateTime = $dateTime->translate('check-in-scheduler');
$pkr->scheduleVersion($publishDateTime);
}
if ($c->isPageDraft()) {
$pagetype = $c->getPageTypeObject();
$pagetype->publish($c, $pkr);
} else {
$pkr->trigger();
}
}
} else {
if ($this->request->request->get('action') == 'discard') {
if ($c->isPageDraft() && $this->permissions->canDeletePage()) {
$u = new User();
$cID = $u->getPreviousFrontendPageID();
$this->page->delete();
$pr->setRedirectURL(DIR_REL . '/' . DISPATCHER_FILENAME . '?cID=' . $cID);
$pr->outputJSON();
} else {
if ($v->canDiscard()) {
$v->discard();
}
}
} else {
$v->removeNewStatus();
}
}
$nc = Page::getByID($c->getCollectionID(), $v->getVersionID());
$u->unloadCollectionEdit();
$pr->setRedirectURL(Loader::helper('navigation')->getLinkToCollection($nc, true));
$pr->outputJSON();
}
}
protected function validateAction()
{
if (parent::validateAction()) {
if ($this->permissions->canEditPageContents() || $this->permissions->canEditPageProperties(
) || $this->permissions->canApprovePageVersions()
) {
return true;
}
}
}
}