xref: /plugin/structpublish/action/publish.php (revision e31c94d7935dccc7709b66e483c744379995197d)
1c2f8a3c4SAnna Dabrowska<?php
2c2f8a3c4SAnna Dabrowska
3*e31c94d7SAndreas 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');
28*e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_PUBLISH])) {
29e394901aSAnna Dabrowska            return;
30e394901aSAnna Dabrowska        }
31e394901aSAnna Dabrowska
32*e31c94d7SAndreas Gohr        $this->saveRevision(Constants::STATUS_PUBLISHED);
33c2f8a3c4SAnna Dabrowska
348680d162SAnna Dabrowska        $this->updateSchemaData();
35c2f8a3c4SAnna Dabrowska
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');
46*e31c94d7SAndreas Gohr        if (!$in || !isset($in[Constants::ACTION_APPROVE])) {
471b063be2SAnna Dabrowska            return;
481b063be2SAnna Dabrowska        }
491b063be2SAnna Dabrowska
50*e31c94d7SAndreas Gohr        $this->saveRevision(Constants::STATUS_APPROVED);
518680d162SAnna Dabrowska    }
528680d162SAnna Dabrowska
538680d162SAnna Dabrowska    /**
548680d162SAnna Dabrowska     * Save publish data
558680d162SAnna Dabrowska     *
568680d162SAnna Dabrowska     * @param string $status
578680d162SAnna Dabrowska     * @return void
588680d162SAnna Dabrowska     */
598680d162SAnna Dabrowska    protected function saveRevision($status)
608680d162SAnna Dabrowska    {
611b063be2SAnna Dabrowska        global $ID;
621b063be2SAnna Dabrowska        global $INFO;
638680d162SAnna Dabrowska
648680d162SAnna Dabrowska        // FIXME prevent bumping an already published revision
65939e6e3cSAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
661b063be2SAnna Dabrowska        $revision = new Revision($sqlite, $ID, $INFO['currentrev']);
671b063be2SAnna Dabrowska
688680d162SAnna Dabrowska        // TODO do not autoincrement version, make it a string
69*e31c94d7SAndreas Gohr        if ($status === Constants::STATUS_PUBLISHED) {
708680d162SAnna Dabrowska            $revision->setVersion($revision->getVersion() + 1);
718680d162SAnna Dabrowska        }
728680d162SAnna Dabrowska        $revision->setUser($_SERVER['REMOTE_USER']);
738680d162SAnna Dabrowska        $revision->setStatus($status);
748680d162SAnna Dabrowska        $revision->setDate(time());
751b063be2SAnna Dabrowska        $revision->save();
761b063be2SAnna Dabrowska    }
778680d162SAnna Dabrowska
788680d162SAnna Dabrowska    /**
798680d162SAnna Dabrowska     * Set "published" status in all assigned schemas
808680d162SAnna Dabrowska     *
818680d162SAnna Dabrowska     * @return void
828680d162SAnna Dabrowska     */
838680d162SAnna Dabrowska    protected function updateSchemaData()
848680d162SAnna Dabrowska    {
858680d162SAnna Dabrowska        global $ID;
868680d162SAnna Dabrowska        global $INFO;
878680d162SAnna Dabrowska
888680d162SAnna Dabrowska        $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance();
898680d162SAnna Dabrowska        $tables = $schemaAssignments->getPageAssignments($ID);
908680d162SAnna Dabrowska
918680d162SAnna Dabrowska        if (empty($tables)) return;
928680d162SAnna Dabrowska
938680d162SAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
948680d162SAnna Dabrowska
958680d162SAnna Dabrowska        foreach ($tables as $table) {
968680d162SAnna Dabrowska            // TODO unpublish earlier revisions
978680d162SAnna Dabrowska            $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
988680d162SAnna Dabrowska            $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
998680d162SAnna Dabrowska        }
1008680d162SAnna Dabrowska    }
101c2f8a3c4SAnna Dabrowska}
102