Browse Source

fix the bug when disabling/enabling and add better error handling;
refactoring

Olivier Massot 5 years ago
parent
commit
c2ea393185

+ 35 - 68
ot_stats/Classes/Controller/OtStatsController.php

@@ -2,12 +2,14 @@
 
 namespace Opentalent\OtStats\Controller;
 
-use Opentalent\OtCore\Exception\NoSiteSelected;
+use Opentalent\OtCore\Cache\OtCacheManager;
+use Opentalent\OtCore\Controller\SelectedSiteController;
+use Opentalent\OtCore\Logging\OtLogger;
+use Opentalent\OtCore\Messaging\FlashMessageService;
 use Opentalent\OtStats\Domain\Repository\MatomoWebsiteRepository;
 use Opentalent\OtStats\Settings\StatsSettingsRepository;
-use Opentalent\OtCore\Page\OtPageRepository;
+use TYPO3\CMS\Core\Messaging\AbstractMessage;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
 use TYPO3\CMS\Extbase\Mvc\Exception\StopActionException;
 
 /**
@@ -15,58 +17,52 @@ use TYPO3\CMS\Extbase\Mvc\Exception\StopActionException;
  *
  * @author olivier.massot
  */
-class OtStatsController extends ActionController {
+class OtStatsController extends SelectedSiteController {
 
     /**
      * Index action (default action)
      * Displays the customizer page on the backend
      */
     public function indexAction() {
-
-        // Get the current page uid
-        try {
-            $rootUid = $this->getCurrentRootUidOrAbort();
-        } catch (NoSiteSelected $e) {
-            $this->view->assign('pageSelected', 0);
-            return;
-        }
-
-        $this->view->assign('pageSelected', 1);
-        $this->view->assign('rootPage', $rootUid);
-
+        $this->view->assign('rootPage', $this->currentRootUid);
         $statsSettingsRepository = GeneralUtility::makeInstance(StatsSettingsRepository::class);
-        $matomoId = $statsSettingsRepository->getMatomoSiteId($rootUid);
+        $matomoId = $statsSettingsRepository->getMatomoSiteId($this->currentRootUid);
 
-        $statsActivated = ($matomoId !== null);
-        $this->view->assign('statsActivated', (int)$statsActivated);
-        if (!$statsActivated) {
-            return;
+        if ($matomoId == null) {
+            $this->forward('askForActivationConfirmation');
         }
-
         $this->view->assign('matomoSiteId', (int)$matomoId);
     }
 
+    /**
+     * Display a confirmation page before enabling the stats module
+     */
+    public function askForActivationConfirmationAction() {}
+
+    /**
+     * Display a confirmation page before disabling the stats module
+     */
+    public function askForDeactivationConfirmationAction() {
+        $this->view->assign('rootUid', $this->currentRootUid);
+    }
+
     /**
      * Creates a matomo site record if none exists and
      * save its id
      */
     public function enableStatsAction() {
-        // Get the current page uid
-        try {
-            $rootUid = $this->getCurrentRootUidOrAbort();
-        } catch (NoSiteSelected $e) {
-            $this->forward('index');
-        }
-
         $matomoRepository = GeneralUtility::makeInstance(MatomoWebsiteRepository::class);
 
         try {
-            $matomoRepository->createFor($rootUid);
+            $matomoRepository->createFor($this->currentRootUid);
         } catch (\RuntimeException $e) {
-            $this->view->assign(
-                'errorMsg',
-                "Une erreur s'est produite lors de l'opération, veuillez contacter un administrateur"
+            OtLogger::error("OtStats - " . $e);
+            $this->addFlashMessage(
+                "Une erreur s'est produite lors de l'opération, veuillez contacter un administrateur.",
+                '',
+                AbstractMessage::ERROR
             );
+            $this->forward('askForActivationConfirmation');
         }
         $this->forward('index');
     }
@@ -86,42 +82,13 @@ class OtStatsController extends ActionController {
         try {
             $matomoRepository->disableFor($rootUid);
         } catch (\RuntimeException $e) {
-            $this->view->assign(
-                'errorMsg',
-                "Une erreur s'est produite lors de l'opération, veuillez contacter un administrateur"
+            OtLogger::error("OtStats - " . $e);
+            $this->addFlashMessage(
+                "Une erreur s'est produite lors de l'opération, veuillez contacter un administrateur.",
+                '',
+                AbstractMessage::ERROR
             );
         }
-        $this->forward('index');
-    }
-
-    /**
-     * Display a confirmation page
-     */
-    public function confirmDeletionAction() {
-        try {
-            $rootUid = $this->getCurrentRootUidOrAbort();
-        } catch (NoSiteSelected $e) {
-            $this->forward('index');
-        }
-        $this->view->assign('rootUid', $rootUid);
-    }
-
-    /**
-     * Return the root uid of the currently selected website if any,
-     * or throw a NoSiteSelected exception
-     *
-     * @return int|mixed
-     * @throws NoSiteSelected
-     */
-    private function getCurrentRootUidOrAbort() {
-        $rootUid = (int)GeneralUtility::_GP('id');
-
-        $otPageRepository = GeneralUtility::makeInstance(OtPageRepository::class);
-        $rootPage = $otPageRepository->getRootPageFor($rootUid);
-        $rootUid = $rootPage['uid'] ?? 0;
-        if (!$rootUid > 0) {
-            throw new NoSiteSelected();
-        }
-        return $rootUid;
+        $this->forward('askForActivationConfirmation');
     }
 }

+ 1 - 1
ot_stats/Classes/Domain/Repository/MatomoWebsiteRepository.php

@@ -154,7 +154,7 @@ class MatomoWebsiteRepository
         $existingMatomoSite = $this->findByUri($uri);
         if ($existingMatomoSite) {
             // Verify that the names match (just to be sure)
-            if (!$existingMatomoSite->getName() != $title) {
+            if ($existingMatomoSite->getName() != $title) {
                 throw new \RuntimeException('A website with this URL has already been registered: ' . $uri);
             }
             $matomoSiteId = $existingMatomoSite->getId();

+ 15 - 1
ot_stats/Classes/Settings/StatsSettingsRepository.php

@@ -2,6 +2,9 @@
 
 namespace Opentalent\OtStats\Settings;
 
+use PDO;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Frontend\Page\PageRepository;
 
 /**
@@ -20,6 +23,17 @@ class StatsSettingsRepository extends PageRepository
      */
     public function getMatomoSiteId(int $rootPageUid) {
         $rootPage = $this->getPage($rootPageUid);
-        return $rootPage['tx_opentalent_matomo_id'];
+
+        // Set up a connection to the typo3 DB
+        $cnnPool = GeneralUtility::makeInstance(ConnectionPool::class);
+
+        $queryBuilder = $cnnPool->getQueryBuilderForTable('pages');
+        $matomoId = $queryBuilder
+                        ->select('tx_opentalent_matomo_id')
+                        ->from('pages')
+                        ->where($queryBuilder->expr()->eq('uid', $rootPageUid))
+                        ->execute()
+                        ->fetchColumn(0);
+        return $matomoId;
     }
 }

+ 1 - 0
ot_stats/Resources/Private/Layouts/Backend/Default.html

@@ -2,5 +2,6 @@
 
 <f:be.container includeCssFiles="{ot_core: '{f:uri.resource(path:\'assets/Backend/style/ot_be_module.css\', extensionName:\'ot_core\')}',
                                   ot_stats: '{f:uri.resource(path:\'assets/Backend/style/ot_stats.css\')}'}">
+    <f:flashMessages />
     <f:render section="content" />
 </f:be.container>

+ 29 - 0
ot_stats/Resources/Private/Templates/OtStats/AskForActivationConfirmation.html

@@ -0,0 +1,29 @@
+<f:layout name="Backend/Default" />
+
+<f:section name="content">
+
+    <div class="ot-be-module ot-stats">
+        <div class="statsConfirmationPanel">
+            <p>
+                Le suivi des statistiques d'utilisation n'est pas encore activé.
+                Pour l'activer, cliquez sur le bouton ci-dessous.
+            </p>
+            <p class="warning">
+                <b>Attention:</b> La loi européenne impose de demander l'accord des
+                utilisateurs avant l'installation de cookies de suivi. Dès lors que le suivi sera activé,
+                une bannière sera présentée à chaque nouveau visiteur pour lui demander son accord
+                quand à l'utilisation ou non de cookies de suivi.
+            </p>
+            <i style="margin-bottom: 12px;"></i>
+
+            <f:link.action
+                    action="enableStats"
+                    title="select"
+                    class="ot-btn"
+            >
+                Activer le suivi de l'utilisation
+            </f:link.action>
+        </div>
+    </div>
+
+</f:section>

+ 62 - 104
ot_stats/Resources/Private/Templates/OtStats/Index.html

@@ -4,111 +4,69 @@
 <f:layout name="Backend/Default" />
 
 <f:section name="content">
-
     <div class="ot-be-module ot-stats">
-        <p class="warning">{errorMsg}</p>
-
-        <f:if condition="{pageSelected}>0">
-            <f:then>
-                <h3>Statistiques d'utilisation</h3>
-
-                <f:if condition="{statsActivated}">
-                    <f:then>
-                        <div id="matomoReport">
-
-                            <h4>Récapitulatif des visites</h4>
-                            <div class="reportSection">
-
-                                <div class="reportSubSection">
-                                    <f:comment><!-- Real time visits--></f:comment>
-                                    <div class="widgetIframe" id="realTimeVisits"><iframe width="450" height="320" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Live&actionToWidgetize=widget&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-
-                                    <f:comment><!-- Last visits graph--></f:comment>
-                                    <div class="widgetIframe" id="lastVisitsGraph"><iframe width="450" height="260" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&forceView=1&viewDataTable=graphEvolution&disableLink=0&widget=1&moduleToWidgetize=VisitsSummary&actionToWidgetize=getEvolutionGraph&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-                                </div>
-
-                                <f:comment><!-- Visits Summary --></f:comment>
-                                <div class="widgetIframe" id="visitsSummary"><iframe width="450" height="600" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&forceView=1&viewDataTable=sparklines&disableLink=0&widget=1&moduleToWidgetize=VisitsSummary&actionToWidgetize=get&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-                            </div>
-
-                            <h4>Répartition géographique et horaire</h4>
-                            <div class="reportSection">
-                                <f:comment><!-- By weekday --></f:comment>
-                                <div class="widgetIframe" id="visitsByWeekday"><iframe width="500" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=VisitTime&actionToWidgetize=getByDayOfWeek&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-
-                                <f:comment><!-- By local hour --></f:comment>
-                                <div class="widgetIframe" id="visitsByHour"><iframe width="500" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=VisitTime&actionToWidgetize=getByDayOfWeek&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-
-                                <f:comment><!-- Map --></f:comment>
-                                <div class="widgetIframe" id="visitsMap"><iframe width="400" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=UserCountryMap&actionToWidgetize=visitorMap&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-                            </div>
-
-                            <h4>Supports et référents</h4>
-                            <div class="reportSection">
-                                <f:comment><!-- Refferers --></f:comment>
-                                <div class="widgetIframe" id="visitsRefferers"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Referrers&actionToWidgetize=getAll&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-
-                                <f:comment><!-- By web-browsers   --></f:comment>
-                                <div class="widgetIframe" id="visitsByBrowsers"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=DevicesDetection&actionToWidgetize=getBrowsers&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-                            </div>
-
-                            <h4>Comportements des visiteurs</h4>
-                            <div class="reportSection">
-                                <f:comment><!-- By page   --></f:comment>
-                                <div class="widgetIframe" id="visitsByPage"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Actions&actionToWidgetize=getPageUrls&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-
-                                <f:comment><!-- By entry page   --></f:comment>
-                                <div class="widgetIframe" id="visitorsEntryPoints"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Actions&actionToWidgetize=getEntryPageUrls&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-
-                                <f:comment><!-- By visits duration   --></f:comment>
-                                <div class="widgetIframe" id="visitsByDuration"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=VisitorInterest&actionToWidgetize=getNumberOfVisitsPerVisitDuration&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
-                            </div>
-
-                            <div class="reportFooter">
-                                <f:link.action
-                                        action="confirmDeletion"
-                                        title="select"
-                                        id="disableLink"
-                                        class="warning"
-                                >
-                                    Désactiver le suivi de l'utilisation
-                                </f:link.action>
-                            </div>
-
-                        </div>
-                    </f:then>
-                    <f:else>
-                        <div class="statsConfirmationPanel">
-                            <p>
-                                Le suivi des statistiques d'utilisation n'est pas encore activé.
-                                Pour l'activer, cliquez sur le bouton ci-dessous.
-                            </p>
-                            <p class="warning">
-                                <b>Attention:</b> La loi européenne impose de demander l'accord des
-                                utilisateurs avant l'installation de cookies de suivi. Dès lors que le suivi sera activé,
-                                une bannière sera présentée à chaque nouveau visiteur pour lui demander son accord
-                                quand à l'utilisation ou non de cookies de suivi.
-                            </p>
-                            <i style="margin-bottom: 12px;"></i>
-
-                            <f:link.action
-                                    action="enableStats"
-                                    title="select"
-                                    class="ot-btn"
-                            >
-                                Activer le suivi de l'utilisation
-                            </f:link.action>
-                        </div>
-
-                    </f:else>
-                </f:if>
-            </f:then>
-            <f:else>
-                <div class="no-page-warning">
-                    <f:comment><!-- No page selected --></f:comment>
-                    <f:translate key="noPageSelected" extensionName="ot_core" />
+        <h3>Statistiques d'utilisation</h3>
+        <div id="matomoReport">
+
+            <h4>Récapitulatif des visites</h4>
+            <div class="reportSection">
+
+                <div class="reportSubSection">
+                    <f:comment><!-- Real time visits--></f:comment>
+                    <div class="widgetIframe" id="realTimeVisits"><iframe width="450" height="320" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Live&actionToWidgetize=widget&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+
+                    <f:comment><!-- Last visits graph--></f:comment>
+                    <div class="widgetIframe" id="lastVisitsGraph"><iframe width="450" height="260" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&forceView=1&viewDataTable=graphEvolution&disableLink=0&widget=1&moduleToWidgetize=VisitsSummary&actionToWidgetize=getEvolutionGraph&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
                 </div>
-            </f:else>
-        </f:if>
+
+                <f:comment><!-- Visits Summary --></f:comment>
+                <div class="widgetIframe" id="visitsSummary"><iframe width="450" height="600" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&forceView=1&viewDataTable=sparklines&disableLink=0&widget=1&moduleToWidgetize=VisitsSummary&actionToWidgetize=get&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+            </div>
+
+            <h4>Répartition géographique et horaire</h4>
+            <div class="reportSection">
+                <f:comment><!-- By weekday --></f:comment>
+                <div class="widgetIframe" id="visitsByWeekday"><iframe width="500" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=VisitTime&actionToWidgetize=getByDayOfWeek&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+
+                <f:comment><!-- By local hour --></f:comment>
+                <div class="widgetIframe" id="visitsByHour"><iframe width="500" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=VisitTime&actionToWidgetize=getByDayOfWeek&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+
+                <f:comment><!-- Map --></f:comment>
+                <div class="widgetIframe" id="visitsMap"><iframe width="400" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=UserCountryMap&actionToWidgetize=visitorMap&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+            </div>
+
+            <h4>Supports et référents</h4>
+            <div class="reportSection">
+                <f:comment><!-- Refferers --></f:comment>
+                <div class="widgetIframe" id="visitsRefferers"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Referrers&actionToWidgetize=getAll&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+
+                <f:comment><!-- By web-browsers   --></f:comment>
+                <div class="widgetIframe" id="visitsByBrowsers"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=DevicesDetection&actionToWidgetize=getBrowsers&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+            </div>
+
+            <h4>Comportements des visiteurs</h4>
+            <div class="reportSection">
+                <f:comment><!-- By page   --></f:comment>
+                <div class="widgetIframe" id="visitsByPage"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Actions&actionToWidgetize=getPageUrls&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+
+                <f:comment><!-- By entry page   --></f:comment>
+                <div class="widgetIframe" id="visitorsEntryPoints"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=Actions&actionToWidgetize=getEntryPageUrls&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+
+                <f:comment><!-- By visits duration   --></f:comment>
+                <div class="widgetIframe" id="visitsByDuration"><iframe width="360" height="450" src="https://stats.2iopenservice.com/index.php?module=Widgetize&action=iframe&disableLink=0&widget=1&moduleToWidgetize=VisitorInterest&actionToWidgetize=getNumberOfVisitsPerVisitDuration&idSite=5&period=month&date=today&disableLink=1&widget=1" scrolling="yes" frameborder="0" marginheight="0" marginwidth="0"></iframe></div>
+            </div>
+
+            <div class="reportFooter">
+                <f:link.action
+                        action="askForDeactivationConfirmation"
+                        title="select"
+                        id="disableLink"
+                        class="warning"
+                >
+                    Désactiver le suivi de l'utilisation
+                </f:link.action>
+            </div>
+
+        </div>
     </div>
 </f:section>

+ 2 - 2
ot_stats/ext_tables.php

@@ -16,11 +16,11 @@ call_user_func(
                 'otstats', // Submodule key
                 'after:OtTemplatingOtcustomizer', // Position
                 array(
-                    'OtStats' => 'index,enableStats,disableStats,confirmDeletion',
+                    'OtStats' => 'index,askForActivationConfirmation,askForDeactivationConfirmation,enableStats,disableStats'
                 ),
                 array(
                     'access' => 'user,group',
-                    'icon' => 'EXT:ot_stats/Resources/Public/Icons/Extension_white.png',
+                    'icon' => 'EXT:ot_stats/Resources/Public/Icons/pie-chart.png',
                     'labels' => 'LLL:EXT:ot_stats/Resources/Private/Language/locallang_mod.xlf',
                 )
             );