xref: /plugin/structpublish/action/publish.php (revision 8680d16276c6d8a1666ee7f099ed91af854eb71e)
1c2f8a3c4SAnna Dabrowska<?php
2c2f8a3c4SAnna Dabrowska
3c2f8a3c4SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision;
4c2f8a3c4SAnna Dabrowska
5c2f8a3c4SAnna Dabrowskaclass action_plugin_structpublish_publish extends DokuWiki_Action_Plugin
6c2f8a3c4SAnna Dabrowska{
7939e6e3cSAnna Dabrowska    /** @var \helper_plugin_structpublish_db */
8939e6e3cSAnna Dabrowska    protected $dbHelper;
9c2f8a3c4SAnna Dabrowska
10c2f8a3c4SAnna Dabrowska    /**
11c2f8a3c4SAnna Dabrowska     * @inheritDoc
12c2f8a3c4SAnna Dabrowska     */
13c2f8a3c4SAnna Dabrowska    public function register(Doku_Event_Handler $controller)
14c2f8a3c4SAnna Dabrowska    {
151b063be2SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleApprove');
16c2f8a3c4SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePublish');
17c2f8a3c4SAnna Dabrowska    }
18c2f8a3c4SAnna Dabrowska
19c2f8a3c4SAnna Dabrowska    public function handlePublish(Doku_Event $event)
20c2f8a3c4SAnna Dabrowska    {
21c2f8a3c4SAnna Dabrowska        if ($event->data != 'show') return;
22e394901aSAnna Dabrowska
23939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
24939e6e3cSAnna Dabrowska
25e394901aSAnna Dabrowska        global $INPUT;
26e394901aSAnna Dabrowska        $in = $INPUT->arr('structpublish');
27939e6e3cSAnna Dabrowska        if (!$in || !isset($in[$this->dbHelper::ACTION_PUBLISH])) {
28e394901aSAnna Dabrowska            return;
29e394901aSAnna Dabrowska        }
30e394901aSAnna Dabrowska
31*8680d162SAnna Dabrowska        $this->saveRevision(Revision::STATUS_PUBLISHED);
32c2f8a3c4SAnna Dabrowska
33*8680d162SAnna Dabrowska        $this->updateSchemaData();
34c2f8a3c4SAnna Dabrowska
35c2f8a3c4SAnna Dabrowska    }
361b063be2SAnna Dabrowska
371b063be2SAnna Dabrowska    public function handleApprove(Doku_Event $event)
381b063be2SAnna Dabrowska    {
391b063be2SAnna Dabrowska        if ($event->data != 'show') return;
401b063be2SAnna Dabrowska
41939e6e3cSAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
42939e6e3cSAnna Dabrowska
431b063be2SAnna Dabrowska        global $INPUT;
441b063be2SAnna Dabrowska        $in = $INPUT->arr('structpublish');
45939e6e3cSAnna Dabrowska        if (!$in || !isset($in[$this->dbHelper::ACTION_APPROVE])) {
461b063be2SAnna Dabrowska            return;
471b063be2SAnna Dabrowska        }
481b063be2SAnna Dabrowska
49*8680d162SAnna Dabrowska        $this->saveRevision(Revision::STATUS_APPROVED);
50*8680d162SAnna Dabrowska    }
51*8680d162SAnna Dabrowska
52*8680d162SAnna Dabrowska    /**
53*8680d162SAnna Dabrowska     * Save publish data
54*8680d162SAnna Dabrowska     *
55*8680d162SAnna Dabrowska     * @param string $status
56*8680d162SAnna Dabrowska     * @return void
57*8680d162SAnna Dabrowska     */
58*8680d162SAnna Dabrowska    protected function saveRevision($status)
59*8680d162SAnna Dabrowska    {
601b063be2SAnna Dabrowska        global $ID;
611b063be2SAnna Dabrowska        global $INFO;
62*8680d162SAnna Dabrowska
63*8680d162SAnna Dabrowska        // FIXME prevent bumping an already published revision
64939e6e3cSAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
651b063be2SAnna Dabrowska        $revision = new Revision($sqlite, $ID, $INFO['currentrev']);
661b063be2SAnna Dabrowska
67*8680d162SAnna Dabrowska        // TODO do not autoincrement version, make it a string
68*8680d162SAnna Dabrowska        if ($status === Revision::STATUS_PUBLISHED) {
69*8680d162SAnna Dabrowska            $revision->setVersion($revision->getVersion() + 1);
70*8680d162SAnna Dabrowska        }
71*8680d162SAnna Dabrowska        $revision->setUser($_SERVER['REMOTE_USER']);
72*8680d162SAnna Dabrowska        $revision->setStatus($status);
73*8680d162SAnna Dabrowska        $revision->setDate(time());
741b063be2SAnna Dabrowska        $revision->save();
751b063be2SAnna Dabrowska    }
76*8680d162SAnna Dabrowska
77*8680d162SAnna Dabrowska    /**
78*8680d162SAnna Dabrowska     * Set "published" status in all assigned schemas
79*8680d162SAnna Dabrowska     *
80*8680d162SAnna Dabrowska     * @return void
81*8680d162SAnna Dabrowska     */
82*8680d162SAnna Dabrowska    protected function updateSchemaData()
83*8680d162SAnna Dabrowska    {
84*8680d162SAnna Dabrowska        global $ID;
85*8680d162SAnna Dabrowska        global $INFO;
86*8680d162SAnna Dabrowska
87*8680d162SAnna Dabrowska        $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance();
88*8680d162SAnna Dabrowska        $tables = $schemaAssignments->getPageAssignments($ID);
89*8680d162SAnna Dabrowska
90*8680d162SAnna Dabrowska        if (empty($tables)) return;
91*8680d162SAnna Dabrowska
92*8680d162SAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
93*8680d162SAnna Dabrowska
94*8680d162SAnna Dabrowska        foreach ($tables as $table) {
95*8680d162SAnna Dabrowska            // TODO unpublish earlier revisions
96*8680d162SAnna Dabrowska            $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
97*8680d162SAnna Dabrowska            $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]);
98*8680d162SAnna Dabrowska        }
99*8680d162SAnna Dabrowska    }
100c2f8a3c4SAnna Dabrowska}
101