xref: /plugin/structpublish/action/publish.php (revision 22101782b1ef713771c3abb5494f1f67e45d7826)
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
11c2f8a3c4SAnna Dabrowska    /**
12c2f8a3c4SAnna Dabrowska     * @inheritDoc
13c2f8a3c4SAnna Dabrowska     */
14c2f8a3c4SAnna Dabrowska    public function register(Doku_Event_Handler $controller)
15c2f8a3c4SAnna Dabrowska    {
161b063be2SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleApprove');
17c2f8a3c4SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePublish');
18c2f8a3c4SAnna Dabrowska    }
19c2f8a3c4SAnna Dabrowska
20c2f8a3c4SAnna Dabrowska    public function handlePublish(Doku_Event $event)
21c2f8a3c4SAnna Dabrowska    {
22c2f8a3c4SAnna Dabrowska        if ($event->data != 'show') return;
23e394901aSAnna Dabrowska
24939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
25939e6e3cSAnna Dabrowska
26e394901aSAnna Dabrowska        global $INPUT;
27e394901aSAnna Dabrowska        $in = $INPUT->arr('structpublish');
28e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_PUBLISH])) {
29e394901aSAnna Dabrowska            return;
30e394901aSAnna Dabrowska        }
31e394901aSAnna Dabrowska
325c2215e8SAndreas Gohr        if(checkSecurityToken()) {
335c2215e8SAndreas Gohr            $this->saveRevision(Constants::STATUS_PUBLISHED, $INPUT->str('version'));
348680d162SAnna Dabrowska            $this->updateSchemaData();
355c2215e8SAndreas Gohr        }
36c2f8a3c4SAnna Dabrowska    }
371b063be2SAnna Dabrowska
381b063be2SAnna Dabrowska    public function handleApprove(Doku_Event $event)
391b063be2SAnna Dabrowska    {
401b063be2SAnna Dabrowska        if ($event->data != 'show') return;
411b063be2SAnna Dabrowska
42939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
43939e6e3cSAnna Dabrowska
441b063be2SAnna Dabrowska        global $INPUT;
451b063be2SAnna Dabrowska        $in = $INPUT->arr('structpublish');
46e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_APPROVE])) {
471b063be2SAnna Dabrowska            return;
481b063be2SAnna Dabrowska        }
491b063be2SAnna Dabrowska
505c2215e8SAndreas Gohr        if(checkSecurityToken()) {
51e31c94d7SAndreas Gohr            $this->saveRevision(Constants::STATUS_APPROVED);
528680d162SAnna Dabrowska        }
535c2215e8SAndreas Gohr    }
548680d162SAnna Dabrowska
558680d162SAnna Dabrowska    /**
568680d162SAnna Dabrowska     * Save publish data
578680d162SAnna Dabrowska     *
588680d162SAnna Dabrowska     * @param string $status
598680d162SAnna Dabrowska     * @return void
608680d162SAnna Dabrowska     */
615c2215e8SAndreas Gohr    protected function saveRevision($status, $newversion='')
628680d162SAnna Dabrowska    {
631b063be2SAnna Dabrowska        global $ID;
641b063be2SAnna Dabrowska        global $INFO;
658680d162SAnna Dabrowska
668680d162SAnna Dabrowska        // FIXME prevent bumping an already published revision
67939e6e3cSAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
681b063be2SAnna Dabrowska        $revision = new Revision($sqlite, $ID, $INFO['currentrev']);
691b063be2SAnna Dabrowska
70e31c94d7SAndreas Gohr        if ($status === Constants::STATUS_PUBLISHED) {
715c2215e8SAndreas Gohr            $revision->setVersion($newversion);
728680d162SAnna Dabrowska        }
738680d162SAnna Dabrowska        $revision->setUser($_SERVER['REMOTE_USER']);
748680d162SAnna Dabrowska        $revision->setStatus($status);
75*22101782SAndreas Gohr        $revision->setTimestamp(time());
761b063be2SAnna Dabrowska        $revision->save();
771b063be2SAnna Dabrowska    }
788680d162SAnna Dabrowska
798680d162SAnna Dabrowska    /**
808680d162SAnna Dabrowska     * Set "published" status in all assigned schemas
818680d162SAnna Dabrowska     *
828680d162SAnna Dabrowska     * @return void
838680d162SAnna Dabrowska     */
848680d162SAnna Dabrowska    protected function updateSchemaData()
858680d162SAnna Dabrowska    {
868680d162SAnna Dabrowska        global $ID;
878680d162SAnna Dabrowska        global $INFO;
888680d162SAnna Dabrowska
898680d162SAnna Dabrowska        $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance();
908680d162SAnna Dabrowska        $tables = $schemaAssignments->getPageAssignments($ID);
918680d162SAnna Dabrowska
928680d162SAnna Dabrowska        if (empty($tables)) return;
938680d162SAnna Dabrowska
948680d162SAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
958680d162SAnna Dabrowska
968680d162SAnna Dabrowska        foreach ($tables as $table) {
978680d162SAnna Dabrowska            // TODO unpublish earlier revisions
988680d162SAnna Dabrowska            $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
998680d162SAnna Dabrowska            $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
1008680d162SAnna Dabrowska        }
1018680d162SAnna Dabrowska    }
102c2f8a3c4SAnna Dabrowska}
103