xref: /template/strap/action/qualitymessage.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
108ca4f85Sgerardnico<?php
208ca4f85Sgerardnico
308ca4f85Sgerardnicouse ComboStrap\Analytics;
4a6bf47aaSNickeauuse ComboStrap\Identity;
58aa9d0e6Sgerardnicouse ComboStrap\Message;
608ca4f85Sgerardnicouse ComboStrap\Page;
708ca4f85Sgerardnicouse ComboStrap\PluginUtility;
808ca4f85Sgerardnico
908ca4f85Sgerardnicoif (!defined('DOKU_INC')) die();
1008ca4f85Sgerardnicoif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
1108ca4f85Sgerardnico
1208ca4f85Sgerardnico
13*37748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
1408ca4f85Sgerardnico
1508ca4f85Sgerardnico/**
1608ca4f85Sgerardnico *
1708ca4f85Sgerardnico * Show a quality message
1808ca4f85Sgerardnico *
1908ca4f85Sgerardnico *
2008ca4f85Sgerardnico *
2108ca4f85Sgerardnico */
2208ca4f85Sgerardnicoclass action_plugin_combo_qualitymessage extends DokuWiki_Action_Plugin
2308ca4f85Sgerardnico{
2408ca4f85Sgerardnico
2508ca4f85Sgerardnico    // a class can not start with a number
2608ca4f85Sgerardnico    const QUALITY_BOX_CLASS = "quality-message";
2708ca4f85Sgerardnico
28aa3cb38fSgerardnico    /**
29aa3cb38fSgerardnico     * The quality rules that will not show
30aa3cb38fSgerardnico     * up in the messages
31aa3cb38fSgerardnico     */
32aa3cb38fSgerardnico    const CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING = "excludedQualityRulesFromDynamicMonitoring";
335f891b7eSNickeau    /**
345f891b7eSNickeau     * Disable the message totally
355f891b7eSNickeau     */
365f891b7eSNickeau    const CONF_DISABLE_QUALITY_MONITORING = "disableDynamicQualityMonitoring";
37aa3cb38fSgerardnico
38eee76a3dSgerardnico    /**
39eee76a3dSgerardnico     * Key in the frontmatter that disable the message
40eee76a3dSgerardnico     */
41eee76a3dSgerardnico    const DISABLE_INDICATOR = "dynamic_quality_monitoring";
42eee76a3dSgerardnico
4308ca4f85Sgerardnico
4408ca4f85Sgerardnico    function __construct()
4508ca4f85Sgerardnico    {
4608ca4f85Sgerardnico        // enable direct access to language strings
4708ca4f85Sgerardnico        // ie $this->lang
4808ca4f85Sgerardnico        $this->setupLocale();
4908ca4f85Sgerardnico    }
5008ca4f85Sgerardnico
5108ca4f85Sgerardnico
5208ca4f85Sgerardnico    function register(Doku_Event_Handler $controller)
5308ca4f85Sgerardnico    {
5408ca4f85Sgerardnico
555f891b7eSNickeau        if(!$this->getConf(self::CONF_DISABLE_QUALITY_MONITORING)) {
5608ca4f85Sgerardnico            $controller->register_hook(
5708ca4f85Sgerardnico                'TPL_ACT_RENDER',
5808ca4f85Sgerardnico                'BEFORE',
5908ca4f85Sgerardnico                $this,
6008ca4f85Sgerardnico                '_displayQualityMessage',
6108ca4f85Sgerardnico                array()
6208ca4f85Sgerardnico            );
635f891b7eSNickeau        }
6408ca4f85Sgerardnico
6508ca4f85Sgerardnico
6608ca4f85Sgerardnico    }
6708ca4f85Sgerardnico
6808ca4f85Sgerardnico
6908ca4f85Sgerardnico    /**
7008ca4f85Sgerardnico     * Main function; dispatches the visual comment actions
7108ca4f85Sgerardnico     * @param   $event Doku_Event
7208ca4f85Sgerardnico     */
7308ca4f85Sgerardnico    function _displayQualityMessage(&$event, $param)
7408ca4f85Sgerardnico    {
7508ca4f85Sgerardnico        if ($event->data == 'show') {
76d262537cSgerardnico
77d262537cSgerardnico            /**
78d262537cSgerardnico             * Quality is just for the writers
79d262537cSgerardnico             */
80a6bf47aaSNickeau            if (!Identity::isWriter()) {
81d262537cSgerardnico                return;
82d262537cSgerardnico            }
83d262537cSgerardnico
84ef295d81Sgerardnico            $note = $this->createQualityNote(PluginUtility::getPageId(), $this);
85d262537cSgerardnico            if ($note != null) {
86531e725cSNickeau                ptln($note->toHtml());
87d262537cSgerardnico            }
88d262537cSgerardnico        }
89d262537cSgerardnico
90d262537cSgerardnico    }
91d262537cSgerardnico
92d262537cSgerardnico    /**
93d262537cSgerardnico     * @param $pageId
94d262537cSgerardnico     * @param $plugin - Plugin
958aa9d0e6Sgerardnico     * @return Message|null
96d262537cSgerardnico     */
97ef295d81Sgerardnico    static public function createQualityNote($pageId, $plugin)
98d262537cSgerardnico    {
9985e82846SNickeau        $page = Page::createPageFromId($pageId);
100aa3cb38fSgerardnico
101531e725cSNickeau        if ($page->isSlot()) {
102aa3cb38fSgerardnico            return null;
103aa3cb38fSgerardnico        }
1049b9e6d1fSgerardnico
105eee76a3dSgerardnico        if (!$page->isQualityMonitored()) {
106eee76a3dSgerardnico            return null;
107eee76a3dSgerardnico        }
108eee76a3dSgerardnico
10985e82846SNickeau        if ($page->exists()) {
11008ca4f85Sgerardnico            $analytics = $page->getAnalyticsFromFs();
111aa3cb38fSgerardnico            $rules = $analytics[Analytics::QUALITY][Analytics::RULES];
11208ca4f85Sgerardnico
113e68157ebSgerardnico
114e68157ebSgerardnico            /**
115e68157ebSgerardnico             * We may got null
116e68157ebSgerardnico             * array_key_exists() expects parameter 2 to be array,
117e68157ebSgerardnico             * null given in /opt/www/datacadamia.com/lib/plugins/combo/action/qualitymessage.php on line 113
118e68157ebSgerardnico             */
119e68157ebSgerardnico            if ($rules==null){
120e68157ebSgerardnico                return null;
121e68157ebSgerardnico            }
122e68157ebSgerardnico
123aa3cb38fSgerardnico            /**
124aa3cb38fSgerardnico             * If there is no info, nothing to show
125aa3cb38fSgerardnico             */
126aa3cb38fSgerardnico            if (!array_key_exists(Analytics::INFO, $rules)) {
127aa3cb38fSgerardnico                return null;
128aa3cb38fSgerardnico            }
129aa3cb38fSgerardnico
130aa3cb38fSgerardnico            /**
131aa3cb38fSgerardnico             * The error info
132aa3cb38fSgerardnico             */
133aa3cb38fSgerardnico            $qualityInfoRules = $rules[Analytics::INFO];
134aa3cb38fSgerardnico
135aa3cb38fSgerardnico            /**
136aa3cb38fSgerardnico             * Excluding the excluded rules
137aa3cb38fSgerardnico             */
138aa3cb38fSgerardnico            global $conf;
139aa3cb38fSgerardnico            $excludedRulesConf = $conf['plugin'][PluginUtility::PLUGIN_BASE_NAME][self::CONF_EXCLUDED_QUALITY_RULES_FROM_DYNAMIC_MONITORING];
140aa3cb38fSgerardnico            $excludedRules = preg_split("/,/", $excludedRulesConf);
141aa3cb38fSgerardnico            foreach ($excludedRules as $excludedRule) {
142aa3cb38fSgerardnico                if (array_key_exists($excludedRule, $qualityInfoRules)) {
143aa3cb38fSgerardnico                    unset($qualityInfoRules[$excludedRule]);
14408ca4f85Sgerardnico                }
14508ca4f85Sgerardnico            }
14608ca4f85Sgerardnico
14708ca4f85Sgerardnico            if (sizeof($qualityInfoRules) > 0) {
14808ca4f85Sgerardnico
14908ca4f85Sgerardnico                $qualityScore = $analytics[Analytics::QUALITY][renderer_plugin_combo_analytics::SCORING][renderer_plugin_combo_analytics::SCORE];
1508aa9d0e6Sgerardnico                $message = new Message($plugin);
151d262537cSgerardnico                $message->addContent("<p>Well played, you got a " . PluginUtility::getUrl("quality:score", "quality score") . " of {$qualityScore} !</p>");
152722648eaSgerardnico                if ($page->isLowQualityPage()) {
153722648eaSgerardnico                    $analytics = $page->getAnalyticsFromFs(true);
154722648eaSgerardnico                    $mandatoryFailedRules = $analytics[Analytics::QUALITY][Analytics::FAILED_MANDATORY_RULES];
155722648eaSgerardnico                    $rulesUrl = PluginUtility::getUrl("quality:rule", "rules");
156722648eaSgerardnico                    $lqPageUrl = PluginUtility::getUrl("low_quality_page", "low quality page");
157722648eaSgerardnico                    $message->addContent("<div class='alert alert-info'>This is a {$lqPageUrl} because it has failed the following mandatory {$rulesUrl}:");
158722648eaSgerardnico                    $message->addContent("<ul style='margin-bottom: 0'>");
159fa5961eaSgerardnico                    /**
160fa5961eaSgerardnico                     * A low quality page should have
161fa5961eaSgerardnico                     * failed mandatory rules
162fa5961eaSgerardnico                     * but due to the asycn nature, sometimes
163fa5961eaSgerardnico                     * we don't have an array
164fa5961eaSgerardnico                     */
165fa5961eaSgerardnico                    if (is_array($mandatoryFailedRules)) {
166722648eaSgerardnico                        foreach ($mandatoryFailedRules as $mandatoryFailedRule) {
167ef295d81Sgerardnico                            $message->addContent("<li>" . PluginUtility::getUrl("quality:rule#list", $mandatoryFailedRule) . "</li>");
168722648eaSgerardnico                        }
169fa5961eaSgerardnico                    }
170722648eaSgerardnico                    $message->addContent("</ul>");
171722648eaSgerardnico                    $message->addContent("</div>");
172722648eaSgerardnico                }
17308ca4f85Sgerardnico                $message->addContent("<p>You can still win a couple of points.</p>");
17408ca4f85Sgerardnico                $message->addContent("<ul>");
17508ca4f85Sgerardnico                foreach ($qualityInfoRules as $qualityRule => $qualityInfo) {
17608ca4f85Sgerardnico                    $message->addContent("<li>");
17708ca4f85Sgerardnico                    $message->addContent($qualityInfo);
17808ca4f85Sgerardnico                    $message->addContent("</li>");
17908ca4f85Sgerardnico                }
18008ca4f85Sgerardnico                $message->addContent("</ul>");
18108ca4f85Sgerardnico
182d262537cSgerardnico                $message->setSignatureCanonical("quality:dynamic_monitoring");
183d262537cSgerardnico                $message->setSignatureName("Quality Dynamic Monitoring Feature");
1848aa9d0e6Sgerardnico                $message->setType(Message::TYPE_CLASSIC);
18508ca4f85Sgerardnico                $message->setClass(self::QUALITY_BOX_CLASS);
186d262537cSgerardnico                return $message;
18708ca4f85Sgerardnico
18808ca4f85Sgerardnico
18908ca4f85Sgerardnico            }
19008ca4f85Sgerardnico        }
191d262537cSgerardnico        return null;
19208ca4f85Sgerardnico    }
19308ca4f85Sgerardnico
19408ca4f85Sgerardnico
19508ca4f85Sgerardnico}
196