xref: /plugin/structpublish/action/banner.php (revision e31c94d7935dccc7709b66e483c744379995197d)
187106851SAnna Dabrowska<?php
287106851SAnna Dabrowska
3*e31c94d7SAndreas Gohruse dokuwiki\plugin\structpublish\meta\Constants;
4c2f8a3c4SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision;
5c2f8a3c4SAnna Dabrowska
687106851SAnna Dabrowska/**
787106851SAnna Dabrowska * Action component responsible for the publish banner
887106851SAnna Dabrowska * attached to struct data of a page
987106851SAnna Dabrowska */
1087106851SAnna Dabrowskaclass action_plugin_structpublish_banner extends DokuWiki_Action_Plugin
1187106851SAnna Dabrowska{
12e394901aSAnna Dabrowska    /** @var \helper_plugin_structpublish_db */
13e394901aSAnna Dabrowska    protected $dbHelper;
14c2f8a3c4SAnna Dabrowska
1587106851SAnna Dabrowska    /**
1687106851SAnna Dabrowska     * @inheritDoc
1787106851SAnna Dabrowska     */
1887106851SAnna Dabrowska    public function register(Doku_Event_Handler $controller)
1987106851SAnna Dabrowska    {
20e394901aSAnna Dabrowska        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'renderBanner');
2187106851SAnna Dabrowska    }
2287106851SAnna Dabrowska
2387106851SAnna Dabrowska    /**
24e394901aSAnna Dabrowska     * Add banner to pages under structpublish control
2587106851SAnna Dabrowska     */
2687106851SAnna Dabrowska    public function renderBanner(Doku_Event $event)
2787106851SAnna Dabrowska    {
28c2f8a3c4SAnna Dabrowska        global $ID;
298d2065f7SAnna Dabrowska        global $INFO;
3040f4519bSAnna Dabrowska        global $REV;
3187106851SAnna Dabrowska
32e394901aSAnna Dabrowska        if ($event->data !== 'show') return;
333449f9ceSAnna Dabrowska
348d2065f7SAnna Dabrowska        $this->dbHelper = plugin_load('helper', 'structpublish_db');
35939e6e3cSAnna Dabrowska
36939e6e3cSAnna Dabrowska        if (!$this->dbHelper->isPublishable()) return;
37939e6e3cSAnna Dabrowska
388d2065f7SAnna Dabrowska        $revision = new Revision($this->dbHelper->getDB(), $ID, $REV ?: $INFO['currentrev']);
39c2f8a3c4SAnna Dabrowska
40e394901aSAnna Dabrowska        echo $this->getBannerHtml($revision);
4187106851SAnna Dabrowska    }
4287106851SAnna Dabrowska
4387106851SAnna Dabrowska    /**
44e394901aSAnna Dabrowska     * @param Revision $revision latest publish data
4587106851SAnna Dabrowska     * @return string
4687106851SAnna Dabrowska     */
47c2f8a3c4SAnna Dabrowska    protected function getBannerHtml($revision)
4887106851SAnna Dabrowska    {
4987106851SAnna Dabrowska        global $ID;
503449f9ceSAnna Dabrowska
51*e31c94d7SAndreas Gohr        $status = $revision->getStatus() ?: Constants::STATUS_DRAFT;
52*e31c94d7SAndreas Gohr        if ($status === Constants::STATUS_PUBLISHED) {
53e7259784SAnna Dabrowska            $publisher = userlink($revision->getUser(), true);
54e7259784SAnna Dabrowska            $publishDate = $revision->getDate();
558d2065f7SAnna Dabrowska        } else {
568d2065f7SAnna Dabrowska            $publisher = userlink($revision->getLatestPublished('user'), true);
578d2065f7SAnna Dabrowska            $publishDate = $revision->getLatestPublished('date');
588d2065f7SAnna Dabrowska        }
59e7259784SAnna Dabrowska
60e7259784SAnna Dabrowska        $version =  '';
61e7259784SAnna Dabrowska        if ($revision->getVersion()) {
628d2065f7SAnna Dabrowska            $version = $revision->getVersion() . " ($publishDate, $publisher)";
638d2065f7SAnna Dabrowska
64*e31c94d7SAndreas Gohr            if ($status !== Constants::STATUS_PUBLISHED) {
658d2065f7SAnna Dabrowska                $version = sprintf(
668d2065f7SAnna Dabrowska                    '<a href="'. wl($ID, ['rev' => $revision->getLatestPublished('revision')]) . ' ">%s</a>',
678d2065f7SAnna Dabrowska                    $version
688d2065f7SAnna Dabrowska                );
698d2065f7SAnna Dabrowska            }
70e7259784SAnna Dabrowska        }
71e7259784SAnna Dabrowska
721b063be2SAnna Dabrowska        $actionForm = $this->formHtml($status);
73e7259784SAnna Dabrowska
74c2f8a3c4SAnna Dabrowska        $html = sprintf(
75c2f8a3c4SAnna Dabrowska            $this->getBannerTemplate(),
76e394901aSAnna Dabrowska            $status,
77e394901aSAnna Dabrowska            $status,
78e7259784SAnna Dabrowska            $version,
793231ebaeSAnna Dabrowska            $actionForm
80c2f8a3c4SAnna Dabrowska        );
8187106851SAnna Dabrowska
8287106851SAnna Dabrowska        return $html;
8387106851SAnna Dabrowska    }
84c2f8a3c4SAnna Dabrowska
851b063be2SAnna Dabrowska    protected function formHtml($status)
86c2f8a3c4SAnna Dabrowska    {
87*e31c94d7SAndreas Gohr        global $ID;
88*e31c94d7SAndreas Gohr        if ($status === Constants::STATUS_PUBLISHED) return '';
891b063be2SAnna Dabrowska
90e394901aSAnna Dabrowska        $form = new dokuwiki\Form\Form();
911b063be2SAnna Dabrowska
92*e31c94d7SAndreas Gohr        if ($status !== Constants::STATUS_APPROVED) {
933231ebaeSAnna Dabrowska            $form->addButton('structpublish[approve]', 'APPROVE')->attr('type', 'submit');
941b063be2SAnna Dabrowska        }
95*e31c94d7SAndreas Gohr
96*e31c94d7SAndreas Gohr
973231ebaeSAnna Dabrowska        $form->addButton('structpublish[publish]', 'PUBLISH')->attr('type', 'submit');
98e394901aSAnna Dabrowska
99e394901aSAnna Dabrowska        return $form->toHTML();
100c2f8a3c4SAnna Dabrowska    }
101c2f8a3c4SAnna Dabrowska
102c2f8a3c4SAnna Dabrowska    protected function getBannerTemplate()
103c2f8a3c4SAnna Dabrowska    {
104c2f8a3c4SAnna Dabrowska        $template = '<div class="plugin-structpublish-banner banner-%s">';
105c2f8a3c4SAnna Dabrowska        $template .= '<div class="plugin-structpublish-status">' . $this->getLang('status') . ': %s</div>';
106e7259784SAnna Dabrowska        $template .= '<div class="plugin-structpublish-version">' . $this->getLang('version') . ': %s</div>';
1073231ebaeSAnna Dabrowska        $template .= '<div class="plugin-structpublish-actions">%s</div>';
108c2f8a3c4SAnna Dabrowska        $template .= '</div>';
109c2f8a3c4SAnna Dabrowska
110c2f8a3c4SAnna Dabrowska        return $template;
111c2f8a3c4SAnna Dabrowska    }
11287106851SAnna Dabrowska}
113