xref: /plugin/structpublish/action/publish.php (revision b5c0ae7febc990942ee75e92fdd8f62e4ac0b1c6)
1c2f8a3c4SAnna Dabrowska<?php
2c2f8a3c4SAnna Dabrowska
3e31c94d7SAndreas Gohruse dokuwiki\plugin\structpublish\meta\Constants;
4c2f8a3c4SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision;
5c2f8a3c4SAnna Dabrowska
6c2f8a3c4SAnna Dabrowskaclass action_plugin_structpublish_publish extends DokuWiki_Action_Plugin
7c2f8a3c4SAnna Dabrowska{
8939e6e3cSAnna Dabrowska    /** @var \helper_plugin_structpublish_db */
9939e6e3cSAnna Dabrowska    protected $dbHelper;
10c2f8a3c4SAnna Dabrowska
118b0ba635SAndreas Gohr    /** @inheritDoc */
12c2f8a3c4SAnna Dabrowska    public function register(Doku_Event_Handler $controller)
13c2f8a3c4SAnna Dabrowska    {
141b063be2SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleApprove');
15c2f8a3c4SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePublish');
16c2f8a3c4SAnna Dabrowska    }
17c2f8a3c4SAnna Dabrowska
188b0ba635SAndreas Gohr    /**
198b0ba635SAndreas Gohr     * Handle the publish button and version field
208b0ba635SAndreas Gohr     *
218b0ba635SAndreas Gohr     * @param Doku_Event $event
228b0ba635SAndreas Gohr     * @return void
238b0ba635SAndreas Gohr     */
24c2f8a3c4SAnna Dabrowska    public function handlePublish(Doku_Event $event)
25c2f8a3c4SAnna Dabrowska    {
26*b5c0ae7fSAndreas Gohr        if ($event->data != 'show') {
27*b5c0ae7fSAndreas Gohr            return;
28*b5c0ae7fSAndreas Gohr        }
29e394901aSAnna Dabrowska
30939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
31939e6e3cSAnna Dabrowska
32e394901aSAnna Dabrowska        global $INPUT;
33e394901aSAnna Dabrowska        $in = $INPUT->arr('structpublish');
34e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_PUBLISH])) {
35e394901aSAnna Dabrowska            return;
36e394901aSAnna Dabrowska        }
37e394901aSAnna Dabrowska
385c2215e8SAndreas Gohr        if (checkSecurityToken()) {
395c2215e8SAndreas Gohr            $this->saveRevision(Constants::STATUS_PUBLISHED, $INPUT->str('version'));
408680d162SAnna Dabrowska            $this->updateSchemaData();
415c2215e8SAndreas Gohr        }
42c2f8a3c4SAnna Dabrowska    }
431b063be2SAnna Dabrowska
448b0ba635SAndreas Gohr    /**
458b0ba635SAndreas Gohr     * Handle the approve button
468b0ba635SAndreas Gohr     *
478b0ba635SAndreas Gohr     * @param Doku_Event $event
488b0ba635SAndreas Gohr     * @return void
498b0ba635SAndreas Gohr     */
501b063be2SAnna Dabrowska    public function handleApprove(Doku_Event $event)
511b063be2SAnna Dabrowska    {
52*b5c0ae7fSAndreas Gohr        if ($event->data != 'show') {
53*b5c0ae7fSAndreas Gohr            return;
54*b5c0ae7fSAndreas Gohr        }
551b063be2SAnna Dabrowska
56939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
57939e6e3cSAnna Dabrowska
581b063be2SAnna Dabrowska        global $INPUT;
591b063be2SAnna Dabrowska        $in = $INPUT->arr('structpublish');
60e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_APPROVE])) {
611b063be2SAnna Dabrowska            return;
621b063be2SAnna Dabrowska        }
631b063be2SAnna Dabrowska
645c2215e8SAndreas Gohr        if (checkSecurityToken()) {
65e31c94d7SAndreas Gohr            $this->saveRevision(Constants::STATUS_APPROVED);
668680d162SAnna Dabrowska        }
675c2215e8SAndreas Gohr    }
688680d162SAnna Dabrowska
698680d162SAnna Dabrowska    /**
708680d162SAnna Dabrowska     * Save publish data
718680d162SAnna Dabrowska     *
728680d162SAnna Dabrowska     * @param string $status
738680d162SAnna Dabrowska     * @return void
748680d162SAnna Dabrowska     */
755c2215e8SAndreas Gohr    protected function saveRevision($status, $newversion = '')
768680d162SAnna Dabrowska    {
771b063be2SAnna Dabrowska        global $ID;
781b063be2SAnna Dabrowska        global $INFO;
798680d162SAnna Dabrowska
80*b5c0ae7fSAndreas Gohr        if (
81*b5c0ae7fSAndreas Gohr            $status === Constants::STATUS_PUBLISHED &&
82*b5c0ae7fSAndreas Gohr            !$this->dbHelper->checkAccess($ID, [Constants::ACTION_PUBLISH])
83*b5c0ae7fSAndreas Gohr        ) {
84*b5c0ae7fSAndreas Gohr            throw new \Exception('User may not publish');
85*b5c0ae7fSAndreas Gohr        }
86*b5c0ae7fSAndreas Gohr
87*b5c0ae7fSAndreas Gohr        if (
88*b5c0ae7fSAndreas Gohr            $status === Constants::STATUS_APPROVED &&
89*b5c0ae7fSAndreas Gohr            !$this->dbHelper->checkAccess($ID, [Constants::ACTION_APPROVE])
90*b5c0ae7fSAndreas Gohr        ) {
91*b5c0ae7fSAndreas Gohr            throw new \Exception('User may not approve');
92*b5c0ae7fSAndreas Gohr        }
93*b5c0ae7fSAndreas Gohr
948680d162SAnna Dabrowska        // FIXME prevent bumping an already published revision
95939e6e3cSAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
961b063be2SAnna Dabrowska        $revision = new Revision($sqlite, $ID, $INFO['currentrev']);
971b063be2SAnna Dabrowska
98e31c94d7SAndreas Gohr        if ($status === Constants::STATUS_PUBLISHED) {
995c2215e8SAndreas Gohr            $revision->setVersion($newversion);
1008680d162SAnna Dabrowska        }
1018680d162SAnna Dabrowska        $revision->setUser($_SERVER['REMOTE_USER']);
1028680d162SAnna Dabrowska        $revision->setStatus($status);
10322101782SAndreas Gohr        $revision->setTimestamp(time());
1041b063be2SAnna Dabrowska        $revision->save();
1051b063be2SAnna Dabrowska    }
1068680d162SAnna Dabrowska
1078680d162SAnna Dabrowska    /**
1088680d162SAnna Dabrowska     * Set "published" status in all assigned schemas
1098680d162SAnna Dabrowska     *
1108680d162SAnna Dabrowska     * @return void
1118680d162SAnna Dabrowska     */
1128680d162SAnna Dabrowska    protected function updateSchemaData()
1138680d162SAnna Dabrowska    {
1148680d162SAnna Dabrowska        global $ID;
1158680d162SAnna Dabrowska        global $INFO;
1168680d162SAnna Dabrowska
1178680d162SAnna Dabrowska        $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance();
1188680d162SAnna Dabrowska        $tables = $schemaAssignments->getPageAssignments($ID);
1198680d162SAnna Dabrowska
120*b5c0ae7fSAndreas Gohr        if (empty($tables)) {
121*b5c0ae7fSAndreas Gohr            return;
122*b5c0ae7fSAndreas Gohr        }
1238680d162SAnna Dabrowska
1248680d162SAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
1258680d162SAnna Dabrowska
1268680d162SAnna Dabrowska        foreach ($tables as $table) {
1278680d162SAnna Dabrowska            // TODO unpublish earlier revisions
128*b5c0ae7fSAndreas Gohr            $sqlite->query("UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?",
129*b5c0ae7fSAndreas Gohr                [$ID, $INFO['currentrev']]);
130*b5c0ae7fSAndreas Gohr            $sqlite->query("UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?",
131*b5c0ae7fSAndreas Gohr                [$ID, $INFO['currentrev']]);
1328680d162SAnna Dabrowska        }
1338680d162SAnna Dabrowska    }
134c2f8a3c4SAnna Dabrowska}
135