xref: /plugin/structpublish/helper/publish.php (revision b476f81d46066c318f7a5153cbfadaf4262a2998)
13b7236c0SAnna Dabrowska<?php
23b7236c0SAnna Dabrowska
33b7236c0SAnna Dabrowskause dokuwiki\plugin\struct\meta\Assignments;
43b7236c0SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Constants;
53b7236c0SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision;
63b7236c0SAnna Dabrowska
73b7236c0SAnna Dabrowska/**
83b7236c0SAnna Dabrowska * DokuWiki Plugin structpublish (Helper Component)
93b7236c0SAnna Dabrowska *
103b7236c0SAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
113b7236c0SAnna Dabrowska * @author  Anna Dabrowska <dokuwiki@cosmocode.de>
123b7236c0SAnna Dabrowska */
133b7236c0SAnna Dabrowskaclass helper_plugin_structpublish_publish extends DokuWiki_Plugin
143b7236c0SAnna Dabrowska{
153b7236c0SAnna Dabrowska
163b7236c0SAnna Dabrowska    /** @var helper_plugin_structpublish_db  */
173b7236c0SAnna Dabrowska    protected $dbHelper;
183b7236c0SAnna Dabrowska
193b7236c0SAnna Dabrowska    public function __construct()
203b7236c0SAnna Dabrowska    {
213b7236c0SAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
223b7236c0SAnna Dabrowska    }
233b7236c0SAnna Dabrowska
243b7236c0SAnna Dabrowska    /**
253b7236c0SAnna Dabrowska     * Save publish data
263b7236c0SAnna Dabrowska     *
273b7236c0SAnna Dabrowska     * @param string $action
28a42bec4dSAnna Dabrowska     * @return Revision
293b7236c0SAnna Dabrowska     * @throws Exception
303b7236c0SAnna Dabrowska     */
313b7236c0SAnna Dabrowska    public function saveRevision($action, $newversion = '')
323b7236c0SAnna Dabrowska    {
333b7236c0SAnna Dabrowska        global $ID;
343b7236c0SAnna Dabrowska        global $INFO;
353b7236c0SAnna Dabrowska
363b7236c0SAnna Dabrowska        if (
373b7236c0SAnna Dabrowska            !$this->dbHelper->checkAccess($ID, [$action])
383b7236c0SAnna Dabrowska        ) {
393b7236c0SAnna Dabrowska            throw new \Exception('User may not ' . $action);
403b7236c0SAnna Dabrowska        }
413b7236c0SAnna Dabrowska
42*b476f81dSAnna Dabrowska        $revision = new Revision($ID, $INFO['currentrev']);
433b7236c0SAnna Dabrowska
443b7236c0SAnna Dabrowska        if ($action === Constants::ACTION_PUBLISH) {
453b7236c0SAnna Dabrowska            $revision->setVersion($newversion);
463b7236c0SAnna Dabrowska        }
473b7236c0SAnna Dabrowska        $revision->setUser($_SERVER['REMOTE_USER']);
483b7236c0SAnna Dabrowska        $revision->setStatus(Constants::transitionBy($action));
493b7236c0SAnna Dabrowska        $revision->setTimestamp(time());
503b7236c0SAnna Dabrowska        $revision->save();
513b7236c0SAnna Dabrowska
523b7236c0SAnna Dabrowska        if ($action === Constants::ACTION_PUBLISH) {
533b7236c0SAnna Dabrowska            $this->updateSchemaData();
543b7236c0SAnna Dabrowska        }
55a42bec4dSAnna Dabrowska
56a42bec4dSAnna Dabrowska        return $revision;
573b7236c0SAnna Dabrowska    }
583b7236c0SAnna Dabrowska
593b7236c0SAnna Dabrowska    /**
603b7236c0SAnna Dabrowska     * Set "published" status in all assigned schemas
613b7236c0SAnna Dabrowska     *
623b7236c0SAnna Dabrowska     * @return void
633b7236c0SAnna Dabrowska     */
643b7236c0SAnna Dabrowska    protected function updateSchemaData()
653b7236c0SAnna Dabrowska    {
663b7236c0SAnna Dabrowska        global $ID;
673b7236c0SAnna Dabrowska        global $INFO;
683b7236c0SAnna Dabrowska
693b7236c0SAnna Dabrowska        $schemaAssignments = Assignments::getInstance();
703b7236c0SAnna Dabrowska        $tables = $schemaAssignments->getPageAssignments($ID);
713b7236c0SAnna Dabrowska
723b7236c0SAnna Dabrowska        if (empty($tables)) {
733b7236c0SAnna Dabrowska            return;
743b7236c0SAnna Dabrowska        }
753b7236c0SAnna Dabrowska
763b7236c0SAnna Dabrowska        $sqlite = $this->dbHelper->getDB();
773b7236c0SAnna Dabrowska
783b7236c0SAnna Dabrowska        foreach ($tables as $table) {
79f1c406c2SAnna Dabrowska            // unpublish earlier revisions
80f1c406c2SAnna Dabrowska            $sqlite->query("UPDATE data_$table SET published = 0 WHERE pid = ?", [$ID]);
81f1c406c2SAnna Dabrowska            $sqlite->query("UPDATE multi_$table SET published = 0 WHERE pid = ?", [$ID]);
82f1c406c2SAnna Dabrowska
83f1c406c2SAnna Dabrowska            // publish the current revision
843b7236c0SAnna Dabrowska            $sqlite->query("UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?",
853b7236c0SAnna Dabrowska                [$ID, $INFO['currentrev']]);
863b7236c0SAnna Dabrowska            $sqlite->query("UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?",
873b7236c0SAnna Dabrowska                [$ID, $INFO['currentrev']]);
883b7236c0SAnna Dabrowska        }
893b7236c0SAnna Dabrowska    }
903b7236c0SAnna Dabrowska}
91