xref: /plugin/structpublish/action/publish.php (revision 8b0ba635402b9a3b9717898c9e08f6ff65eb73f7)
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
11*8b0ba635SAndreas 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
18*8b0ba635SAndreas Gohr    /**
19*8b0ba635SAndreas Gohr     * Handle the publish button and version field
20*8b0ba635SAndreas Gohr     *
21*8b0ba635SAndreas Gohr     * @param Doku_Event $event
22*8b0ba635SAndreas Gohr     * @return void
23*8b0ba635SAndreas Gohr     */
24c2f8a3c4SAnna Dabrowska    public function handlePublish(Doku_Event $event)
25c2f8a3c4SAnna Dabrowska    {
26c2f8a3c4SAnna Dabrowska        if ($event->data != 'show') return;
27e394901aSAnna Dabrowska
28939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
29939e6e3cSAnna Dabrowska
30e394901aSAnna Dabrowska        global $INPUT;
31e394901aSAnna Dabrowska        $in = $INPUT->arr('structpublish');
32e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_PUBLISH])) {
33e394901aSAnna Dabrowska            return;
34e394901aSAnna Dabrowska        }
35e394901aSAnna Dabrowska
365c2215e8SAndreas Gohr        if(checkSecurityToken()) {
375c2215e8SAndreas Gohr            $this->saveRevision(Constants::STATUS_PUBLISHED, $INPUT->str('version'));
388680d162SAnna Dabrowska            $this->updateSchemaData();
395c2215e8SAndreas Gohr        }
40c2f8a3c4SAnna Dabrowska    }
411b063be2SAnna Dabrowska
42*8b0ba635SAndreas Gohr    /**
43*8b0ba635SAndreas Gohr     * Handle the approve button
44*8b0ba635SAndreas Gohr     *
45*8b0ba635SAndreas Gohr     * @param Doku_Event $event
46*8b0ba635SAndreas Gohr     * @return void
47*8b0ba635SAndreas Gohr     */
481b063be2SAnna Dabrowska    public function handleApprove(Doku_Event $event)
491b063be2SAnna Dabrowska    {
501b063be2SAnna Dabrowska        if ($event->data != 'show') return;
511b063be2SAnna Dabrowska
52939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
53939e6e3cSAnna Dabrowska
541b063be2SAnna Dabrowska        global $INPUT;
551b063be2SAnna Dabrowska        $in = $INPUT->arr('structpublish');
56e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_APPROVE])) {
571b063be2SAnna Dabrowska            return;
581b063be2SAnna Dabrowska        }
591b063be2SAnna Dabrowska
605c2215e8SAndreas Gohr        if(checkSecurityToken()) {
61e31c94d7SAndreas Gohr            $this->saveRevision(Constants::STATUS_APPROVED);
628680d162SAnna Dabrowska        }
635c2215e8SAndreas Gohr    }
648680d162SAnna Dabrowska
658680d162SAnna Dabrowska    /**
668680d162SAnna Dabrowska     * Save publish data
678680d162SAnna Dabrowska     *
68*8b0ba635SAndreas Gohr     * @todo check user role
698680d162SAnna Dabrowska     * @param string $status
708680d162SAnna Dabrowska     * @return void
718680d162SAnna Dabrowska     */
725c2215e8SAndreas Gohr    protected function saveRevision($status, $newversion='')
738680d162SAnna Dabrowska    {
741b063be2SAnna Dabrowska        global $ID;
751b063be2SAnna Dabrowska        global $INFO;
768680d162SAnna Dabrowska
778680d162SAnna Dabrowska        // FIXME prevent bumping an already published revision
78939e6e3cSAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
791b063be2SAnna Dabrowska        $revision = new Revision($sqlite, $ID, $INFO['currentrev']);
801b063be2SAnna Dabrowska
81e31c94d7SAndreas Gohr        if ($status === Constants::STATUS_PUBLISHED) {
825c2215e8SAndreas Gohr            $revision->setVersion($newversion);
838680d162SAnna Dabrowska        }
848680d162SAnna Dabrowska        $revision->setUser($_SERVER['REMOTE_USER']);
858680d162SAnna Dabrowska        $revision->setStatus($status);
8622101782SAndreas Gohr        $revision->setTimestamp(time());
871b063be2SAnna Dabrowska        $revision->save();
881b063be2SAnna Dabrowska    }
898680d162SAnna Dabrowska
908680d162SAnna Dabrowska    /**
918680d162SAnna Dabrowska     * Set "published" status in all assigned schemas
928680d162SAnna Dabrowska     *
938680d162SAnna Dabrowska     * @return void
948680d162SAnna Dabrowska     */
958680d162SAnna Dabrowska    protected function updateSchemaData()
968680d162SAnna Dabrowska    {
978680d162SAnna Dabrowska        global $ID;
988680d162SAnna Dabrowska        global $INFO;
998680d162SAnna Dabrowska
1008680d162SAnna Dabrowska        $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance();
1018680d162SAnna Dabrowska        $tables = $schemaAssignments->getPageAssignments($ID);
1028680d162SAnna Dabrowska
1038680d162SAnna Dabrowska        if (empty($tables)) return;
1048680d162SAnna Dabrowska
1058680d162SAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
1068680d162SAnna Dabrowska
1078680d162SAnna Dabrowska        foreach ($tables as $table) {
1088680d162SAnna Dabrowska            // TODO unpublish earlier revisions
1098680d162SAnna Dabrowska            $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
1108680d162SAnna Dabrowska            $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
1118680d162SAnna Dabrowska        }
1128680d162SAnna Dabrowska    }
113c2f8a3c4SAnna Dabrowska}
114