xref: /plugin/combo/action/analytics.php (revision 7c33ecc6528835a8a397d60ee391c0665b39d17c)
1c25e802bSgerardnico<?php
2c25e802bSgerardnico
32c067407Sgerardnicouse ComboStrap\Analytics;
4db974367Sgerardnicouse Combostrap\AnalyticsMenuItem;
5db974367Sgerardnicouse ComboStrap\Auth;
655d4462bSgerardnicouse ComboStrap\LogUtility;
7c25e802bSgerardnicouse ComboStrap\Page;
855d4462bSgerardnicouse ComboStrap\Sqlite;
9c25e802bSgerardnico
10c25e802bSgerardnico/**
11c25e802bSgerardnico * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved.
12c25e802bSgerardnico *
13c25e802bSgerardnico * This source code is licensed under the GPL license found in the
14c25e802bSgerardnico * COPYING  file in the root directory of this source tree.
15c25e802bSgerardnico *
16c25e802bSgerardnico * @license  GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
17c25e802bSgerardnico * @author   ComboStrap <support@combostrap.com>
18c25e802bSgerardnico *
19c25e802bSgerardnico */
20c25e802bSgerardnico
212c067407Sgerardnicorequire_once(__DIR__ . '/../class/'.'Analytics.php');
22db974367Sgerardnicorequire_once(__DIR__ . '/../class/'.'Auth.php');
23db974367Sgerardnicorequire_once(__DIR__ . '/../class/'.'AnalyticsMenuItem.php');
242c067407Sgerardnico
25c25e802bSgerardnico/**
26c25e802bSgerardnico * Class action_plugin_combo_analytics
27c25e802bSgerardnico * Update the analytics data
28c25e802bSgerardnico */
29c25e802bSgerardnicoclass action_plugin_combo_analytics extends DokuWiki_Action_Plugin
30c25e802bSgerardnico{
31c25e802bSgerardnico
32c25e802bSgerardnico
33c25e802bSgerardnico    public function register(Doku_Event_Handler $controller)
34c25e802bSgerardnico    {
352c067407Sgerardnico
36c25e802bSgerardnico        /**
37c42a1196Sgerardnico         * Analytics to refresh because they have lost or gain a backlinks
38c42a1196Sgerardnico         * are done via Sqlite table (The INDEXER_TASKS_RUN gives a way to
39c42a1196Sgerardnico         * manipulate this queue)
40266b617eSgerardnico         *
41266b617eSgerardnico         * There is no need to do it at page write
42266b617eSgerardnico         * https://www.dokuwiki.org/devel:event:io_wikipage_write
43266b617eSgerardnico         * because after the page is written, the page is shown and trigger the index tasks run
44d262537cSgerardnico         *
45d262537cSgerardnico         * We do it after because if there is an error
46d262537cSgerardnico         * We will not stop the Dokuwiki Processing
47c42a1196Sgerardnico         */
48d262537cSgerardnico        $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, 'handle_refresh_analytics', array());
4955d4462bSgerardnico
50db974367Sgerardnico        /**
51db974367Sgerardnico         * Add a icon in the page tools menu
52db974367Sgerardnico         * https://www.dokuwiki.org/devel:event:menu_items_assembly
53db974367Sgerardnico         */
54db974367Sgerardnico        $controller->register_hook('MENU_ITEMS_ASSEMBLY', 'AFTER', $this, 'handle_page_tools');
55db974367Sgerardnico
56c25e802bSgerardnico    }
57c25e802bSgerardnico
5855d4462bSgerardnico    public function handle_refresh_analytics(Doku_Event $event, $param)
5955d4462bSgerardnico    {
6055d4462bSgerardnico
61c42a1196Sgerardnico        /**
62c42a1196Sgerardnico         * Check that the actual page has analytics data
63c42a1196Sgerardnico         * (if there is a cache, it's pretty quick)
64c42a1196Sgerardnico         */
65c42a1196Sgerardnico        global $ID;
66d262537cSgerardnico        Analytics::processAndGetDataAsArray($ID,true);
67c42a1196Sgerardnico
68c42a1196Sgerardnico        /**
69c42a1196Sgerardnico         * Check the analytics to refresh
70c42a1196Sgerardnico         */
7155d4462bSgerardnico        $sqlite = Sqlite::getSqlite();
7255d4462bSgerardnico        $res = $sqlite->query("SELECT ID FROM ANALYTICS_TO_REFRESH");
7355d4462bSgerardnico        if (!$res) {
7455d4462bSgerardnico            LogUtility::msg("There was a problem during the select: {$sqlite->getAdapter()->getDb()->errorInfo()}");
7555d4462bSgerardnico        }
7655d4462bSgerardnico        $rows = $sqlite->res2arr($res,true);
7755d4462bSgerardnico        $sqlite->res_close($res);
7855d4462bSgerardnico        foreach($rows as $row){
7955d4462bSgerardnico            $page = new Page($row['ID']);
80*7c33ecc6Sgerardnico            $page->processAnalytics();
8155d4462bSgerardnico        }
8255d4462bSgerardnico
8355d4462bSgerardnico    }
84db974367Sgerardnico
85db974367Sgerardnico    public function handle_page_tools(Doku_Event $event, $param){
86db974367Sgerardnico
87d262537cSgerardnico        if (!Auth::isWriter()){
88db974367Sgerardnico            return;
89db974367Sgerardnico        }
90db974367Sgerardnico
91db974367Sgerardnico        /**
92db974367Sgerardnico         * The `view` property defines the menu that is currently built
93db974367Sgerardnico         * https://www.dokuwiki.org/devel:menus
94db974367Sgerardnico         * If this is not the page menu, return
95db974367Sgerardnico         */
96db974367Sgerardnico        if($event->data['view'] != 'page') return;
97db974367Sgerardnico
98db974367Sgerardnico        global $INFO;
99db974367Sgerardnico        if(!$INFO['exists']) {
100db974367Sgerardnico            return;
101db974367Sgerardnico        }
102db974367Sgerardnico        array_splice($event->data['items'], -1, 0, array(new AnalyticsMenuItem()));
103db974367Sgerardnico
104db974367Sgerardnico    }
105c25e802bSgerardnico}
106c25e802bSgerardnico
107c25e802bSgerardnico
108c25e802bSgerardnico
109