Jelajahi Sumber

Merge branch 'release/0.6.6'

Olivier Massot 2 tahun lalu
induk
melakukan
f234087615

+ 1 - 1
.gitlab-ci.yml

@@ -9,7 +9,7 @@ before_script:
   - php -r "if (hash_file('SHA384', 'composer-setup.php') === file_get_contents('installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
   - php composer-setup.php
   - php -r "unlink('composer-setup.php'); unlink('installer.sig');"
-  - pecl -q install xdebug
+  - pecl -q install xdebug-3.1.5
   - docker-php-ext-enable xdebug
   - echo xdebug.mode=coverage >> /usr/local/etc/php/conf.d/xdebug.ini
 

+ 0 - 16
doc/installation.md

@@ -66,22 +66,6 @@ Pour tout mettre à jour:
     php composer.phar update
 
 
-### Synchroniser les données depuis prod-front sur preprod
-
-
-    ssh -A exploitation@preprod
-
-    # databases
-    cd ~/clonedb
-    python3.8 clonedb.py typo3
-    
-    # files
-    rsync -av --delete exploitation@prod-front:/var/www/typo3/config/sites/ /var/www/typo3/config/sites/
-    rsync -av --delete exploitation@prod-front:/var/www/typo3/public/fileadmin/ /var/www/typo3/public/fileadmin/
-    
-    rsync -av --delete exploitation@prod-front:/var/www/typo3/archive/ /var/www/typo3/archive/
-
-
 ### Mettre en mode maintenance
 
 Pour mettre une instance Typo3 en mode maintenance, accéder au serveur en ssh et éditer le .htaccess:

+ 27 - 6
ot_admin/Classes/Command/ScanCommand.php

@@ -8,6 +8,8 @@ use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Console\Style\SymfonyStyle;
+use Twig\Environment;
+use Twig\Loader\FilesystemLoader;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Object\ObjectManager;
 
@@ -28,10 +30,15 @@ class ScanCommand extends Command
     protected function configure()
     {
         $this
-            ->setName("ot:scan")
+            ->setName("ot:site:scan")
             ->setDescription("Scan the typo3 DB")
             ->setHelp("This CLI command performs a full scan on the Typo3 db.")
             ->addOption(
+                'deep',
+                'd',
+            InputOption::VALUE_NONE,
+            'Performs a deeper scan, with more control operations'
+            )->addOption(
                 'report',
                 'r',
                 InputOption::VALUE_OPTIONAL,
@@ -49,11 +56,13 @@ class ScanCommand extends Command
      */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
+        $deep = $input->getOption('deep');
+
         $io = new SymfonyStyle($input, $output);
 
         // instanciate twig loader
-        $loader = new \Twig\Loader\FilesystemLoader(dirname(__FILE__) . '/../../templates');
-        $twig = new \Twig\Environment($loader);
+        $loader = new FilesystemLoader(__DIR__ . '/../../templates');
+        $twig = new Environment($loader);
 
         // evaluate the report path
         $report_path = $input->getOption('report');
@@ -61,21 +70,33 @@ class ScanCommand extends Command
             $report_path = getcwd() . '/scan_report.html';
         } else {
             $info = pathinfo($report_path);
-            if ($info['extension'] != 'html') {
+            if ($info['extension'] !== 'html') {
                 $report_path .= '.html';
             }
         }
 
         // perform the scan
         $scanController = GeneralUtility::makeInstance(ObjectManager::class)->get(ScanController::class);
-        $scan = $scanController->scanAllAction(true);
+
+        $progressBar = $io->createProgressBar();
+        $progressBar->display();
+
+        $scan = $scanController->scanAllAction(
+            $deep,
+            function ($i, $total) use ($progressBar) {
+                $progressBar->setProgress($i);
+                if ($total !== $progressBar->getMaxSteps()) {
+                    $progressBar->setMaxSteps($total);
+                }
+            }
+        );
 
         // render the twig template
         $template = $twig->load('scan_report.twig');
 
         $html_report = $template->render(['scan' => $scan]);
 
-        $f = fopen($report_path, 'w+');
+        $f = fopen($report_path, 'wb+');
         try {
             fwrite($f, $html_report);
             $io->success(sprintf("Report file was created at: " . $report_path));

+ 11 - 1
ot_admin/Classes/Controller/ScanController.php

@@ -19,9 +19,10 @@ class ScanController extends ActionController
      *
      * @param bool $fullScan If true, a 'warnings' entry will be added to the result of each site status,
      *                        and a full scan of the website pages will be performed.
+     * @param callable|null $progressCallback Expects a function that takes 2 parameters : the current step, and the max
      * @return ScanReport
      */
-    public function scanAllAction(bool $fullScan = false): ScanReport
+    public function scanAllAction(bool $fullScan = false, ?callable $progressCallback = null): ScanReport
     {
         $organizationRepository = GeneralUtility::makeInstance(ObjectManager::class)->get(OrganizationRepository::class);
         $siteController = GeneralUtility::makeInstance(ObjectManager::class)->get(SiteController::class);
@@ -29,10 +30,19 @@ class ScanController extends ActionController
         $report = new ScanReport();
 
         $organizationsCollection = $organizationRepository->getAll();
+        $i = 0;
+        $total = count($organizationsCollection->getMembers());
+
         foreach ($organizationsCollection->getMembers() as $organization) {
+            $i++;
+
             $status = $siteController->getSiteStatusAction($organization->getId(), $fullScan);
 
             $report->setResultFor($organization->getId(), $status);
+
+            if ($progressCallback !== null) {
+                $progressCallback($i, $total);
+            }
         }
 
         return $report;

+ 20 - 4
ot_admin/Classes/Controller/SiteController.php

@@ -45,6 +45,7 @@ class SiteController extends ActionController
     private const TEMPLATE_NEWS = "OpenTalent.OtTemplating->news";
     private const TEMPLATE_MEMBERS = "OpenTalent.OtTemplating->members";
     private const TEMPLATE_MEMBERSCA = "OpenTalent.OtTemplating->membersCa";
+    private const TEMPLATE_STRUCTUREDETAILS = "OpenTalent.OtTemplating->structureDetails";
     private const TEMPLATE_LEGAL = "OpenTalent.OtTemplating->legal";
 
     // Pages dokType values
@@ -322,6 +323,15 @@ class SiteController extends ActionController
                 self::TEMPLATE_MEMBERSCA
             );
 
+            // > 'Présentation > Informations Pratiques' page
+            $this->insertPage(
+                $websiteUid,
+                $this->createdPagesIndex['/presentation'],
+                'Informations Pratiques',
+                '/informations-pratiques',
+                self::TEMPLATE_STRUCTUREDETAILS
+            );
+
             if ($isNetwork) {
                 // > 'Présentation > Les sociétés adhérentes' page
                 $this->insertPage(
@@ -594,7 +604,7 @@ class SiteController extends ActionController
                 ->set('TSconfig', $tsconfig)
                 ->execute();
 
-            // Setup user and group rights
+            // Setup users and group rights
             $this->setBeUserPerms($organizationId, false, $beGroupUid, $beUserUid);
 
             // Try to commit the result
@@ -714,6 +724,9 @@ class SiteController extends ActionController
                 ->where($queryBuilder->expr()->eq('uid', $website['uid']))
                 ->execute();
 
+            // Reset the backend users and group permissions
+            $this->setBeUserPerms($organizationId, true);
+
             // Try to commit the result
             $commitSuccess = $this->connectionPool->getConnectionByName('Default')->commit();
             if (!$commitSuccess) {
@@ -1342,6 +1355,7 @@ class SiteController extends ActionController
      *   - STATUS_EXISTING_DELETED
      *   - STATUS_EXISTING_HIDDEN
      *   - STATUS_EXISTING_WITH_WARNINGS
+     *   - STATUS_EXISTING_WITH_CRITICAL_ERRORS
      *
      * @param int $organizationId the organization's id whom site cache should be cleared
      * @param bool $fullScan If true, a 'warnings' entry will be added to the result, and a full scan of
@@ -1359,6 +1373,8 @@ class SiteController extends ActionController
             $siteInfos = $this->getSiteInfosAction($organizationId);
         } catch (NoSuchWebsiteException $e) {
             return new SiteStatus($organizationId, SiteStatus::STATUS_NO_SUCH_WEBSITE);
+        } catch(\Throwable $e) {
+            return new SiteStatus($organizationId, SiteStatus::STATUS_EXISTING_WITH_CRITICAL_ERRORS);
         }
 
         if ($siteInfos->isDeleted()) {
@@ -2375,9 +2391,9 @@ class SiteController extends ActionController
             ->orWhere("path LIKE '%form_definitions/" . $organizationId . "/'");
         $statement = $queryBuilder->execute();
         $rows = $statement->fetchAllAssociative() ?: [];
-        $files = [];
+        $fileMounts = [];
         foreach ($rows as $row) {
-            $files[] = $row['uid'];
+            $fileMounts[] = $row['uid'];
         }
 
         $mainGroup = self::IS_PRODUCT_PREMIUM[$userData['product']] ? self::BEGROUP_EDITOR_PREMIUM : self::BEGROUP_EDITOR_STANDARD;
@@ -2388,7 +2404,7 @@ class SiteController extends ActionController
             'deleted' => 0,
             'subgroup' => $mainGroupUid,
             'db_mountpoints' => $rootUid,
-            'file_mountPoints' => implode(',', $files),
+            'file_mountPoints' => implode(',', $fileMounts),
             'file_permissions' => 'readFolder,writeFolder,addFolder,renameFolder,moveFolder,deleteFolder,readFile,writeFile,addFile,renameFile,replaceFile,moveFile,copyFile,deleteFile',
             'groupMods' => '',   // inherited from the base EditorsGroup
             'pagetypes_select' => '',   // inherited from the base EditorsGroup

+ 2 - 0
ot_admin/Classes/Domain/Entity/SiteStatus.php

@@ -14,6 +14,7 @@ class SiteStatus
     const STATUS_EXISTING_DELETED = 2;
     const STATUS_EXISTING_HIDDEN = 3;
     const STATUS_EXISTING_WITH_WARNINGS = 4;
+    const STATUS_EXISTING_WITH_CRITICAL_ERRORS = 1;
 
     const STATUSES = [
         self::STATUS_UNKNOWN => 'Unknown',
@@ -22,6 +23,7 @@ class SiteStatus
         self::STATUS_EXISTING_DELETED => 'Existing, deleted',
         self::STATUS_EXISTING_HIDDEN => 'Existing, hidden',
         self::STATUS_EXISTING_WITH_WARNINGS => 'Existing with warnings',
+        self::STATUS_EXISTING_WITH_CRITICAL_ERRORS => 'Existing with critical error(s)',
     ];
 
     /**

+ 6 - 10
ot_admin/Classes/Http/ApiController.php

@@ -22,16 +22,12 @@ class ApiController implements LoggerAwareInterface
     use LoggerAwareTrait;
 
     const ALLOWED_IPS = [
-        '/^127\.0\.0\.[0-1]$/',
-        '/^localhost$/',
-        '/^10\.8\.0\.\d{1,3}$/',
-        '/^141\.94\.117\.38$/',   // prod-front
-        '/^141\.94\.117\.40$/',   // prod-back
-        '/^141\.94\.117\.42$/',   // test
-        '/^141\.94\.117\.44$/',    // preprod
-        '/^172\.1[6-9]\.\d{1,3}\.\d{1,3}$/',  // local (docker)
-        '/^172\.2[0-9]\.\d{1,3}\.\d{1,3}$/',  // local (docker)
-        '/^172\.3[0-1]\.\d{1,3}\.\d{1,3}$/'  // local (docker)
+        '/^127\.0\.0\.[0-1]$/', // Localhost
+        '/^localhost$/',  // Localhost
+        '/^10\.8\.0\.\d{1,3}$/', // 10.8.0.[0-255] - VPN
+        '/^141\.94\.117\.((3[3-9])|(4\d)|(5\d)|(6[0-1]))$/',   // 141.94.117.[33-61] - Opentalent hosts public ips
+        '/^172\.16\.0.\d{1,3}$/',   // 172.16.0.[0-255] - Opentalent hosts private ips
+        '/^172\.20\.\d{1,3}\.\d{1,3}$/',  // 172.20.[0-255].[0-255] - Docker
     ];
 
     /**

+ 1 - 1
ot_admin/Configuration/Commands.php

@@ -40,7 +40,7 @@ return [
     'ot:redirection:remove' => [
         'class' => Opentalent\OtAdmin\Command\RemoveRedirectionCommand::class
     ],
-    'ot:scan' => [
+    'ot:site:scan' => [
         'class' => Opentalent\OtAdmin\Command\ScanCommand::class
     ],
     'ot:regen-config-files' => [

+ 2 - 2
ot_admin/Configuration/Services.yaml

@@ -69,6 +69,6 @@ services:
 
   Opentalent\OtAdmin\Command\ScanCommand:
     tags:
-      - name: 'ot:scan'
-        command: 'ot:scan'
+      - name: 'ot:site:scan'
+        command: 'ot:site:scan'
         schedulable: true

+ 8 - 7
ot_core/Classes/Domain/Repository/BaseApiRepository.php

@@ -13,9 +13,9 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  */
 abstract class BaseApiRepository
 {
-    const URI_TRAILING_PART = '';
-    const HYDRA_TYPE = '';
-    const DEFAULT_ITEMS_PER_PAGE = 8;
+    protected const URI_TRAILING_PART = '';
+    protected const HYDRA_TYPE = '';
+    protected const DEFAULT_ITEMS_PER_PAGE = 8;
 
     protected $apiService;
 
@@ -30,7 +30,8 @@ abstract class BaseApiRepository
      * [FOR TESTS ONLY]
      * @param OpentalentApiService $apiService
      */
-    protected function injectOpentalentApiService(OpentalentApiService $apiService) {
+    protected function injectOpentalentApiService(OpentalentApiService $apiService): void
+    {
         $this->apiService = $apiService;
     }
 
@@ -40,7 +41,7 @@ abstract class BaseApiRepository
      * @param array $record
      * @return object
      */
-    abstract protected function memberToObject(array $record);
+    abstract protected function memberToObject(array $record): ?object;
 
     /**
      * Send a request to the API and
@@ -51,7 +52,7 @@ abstract class BaseApiRepository
      * @return object
      * @throws ApiRequestException
      */
-    protected function getApiFirstRecord($params = [], ?string $forceUri = null)
+    protected function getApiFirstRecord(array $params = [], ?string $forceUri = null): object
     {
         $params['page'] = '1';
         $params['totalItems'] = '1';
@@ -89,7 +90,7 @@ abstract class BaseApiRepository
         if (is_array($body['hydra:member'])) {
             foreach ($body['hydra:member'] as $record) {
                 $instance = $this->memberToObject($record);
-                if ($instance != null) {
+                if ($instance !== null) {
                     $members[] = $instance;
                 }
             }

+ 1 - 1
ot_core/Classes/Domain/Repository/DonorRepository.php

@@ -51,7 +51,7 @@ class DonorRepository extends BaseApiRepository
      * @param $record
      * @return Donor|null
      */
-    protected function memberToObject(array $record) {
+    protected function memberToObject(array $record): ?Donor {
         if ($record['@type'] != $this::HYDRA_TYPE) {
             return null;
         }

+ 1 - 1
ot_core/Classes/Domain/Repository/EventRepository.php

@@ -152,7 +152,7 @@ class EventRepository extends BaseApiRepository
      * @return Event|null
      * @throws Exception
      */
-    protected function memberToObject(array $record) {
+    protected function memberToObject(array $record): ?Event {
         if ($record['@type'] != $this::HYDRA_TYPE) {
             return null;
         }

+ 1 - 1
ot_core/Classes/Domain/Repository/FederationStructureRepository.php

@@ -44,7 +44,7 @@ class FederationStructureRepository extends BaseApiRepository
      * @param array $record
      * @return FederationStructure|null
      */
-    protected function memberToObject(array $record) {
+    protected function memberToObject(array $record): ?FederationStructure {
         if ($record['@type'] != $this::HYDRA_TYPE) {
             return null;
         }

+ 1 - 1
ot_core/Classes/Domain/Repository/MemberRepository.php

@@ -35,7 +35,7 @@ class MemberRepository extends BaseApiRepository
      * @return Member|null
      * @throws \Exception
      */
-    protected function memberToObject(array $record) {
+    protected function memberToObject(array $record): ?Member {
         if ($record['@type'] != $this::HYDRA_TYPE) {
             return null;
         }

+ 11 - 11
ot_core/Classes/Domain/Repository/OrganizationRepository.php

@@ -2,14 +2,13 @@
 
 namespace Opentalent\OtCore\Domain\Repository;
 
-use GuzzleHttp\Exception\GuzzleException;
 use Opentalent\OtCore\Domain\Model\Organization;
 use Opentalent\OtCore\Exception\ApiRequestException;
 
 class OrganizationRepository extends BaseApiRepository
 {
-    const URI_TRAILING_PART = '/api/public/organizations';
-    const HYDRA_TYPE = 'PortailOrganization';
+    protected const URI_TRAILING_PART = '/api/public/organizations';
+    protected const HYDRA_TYPE = 'PortailOrganization';
 
     /**
      * Get the organization by Id
@@ -18,12 +17,12 @@ class OrganizationRepository extends BaseApiRepository
      * @return object
      * @throws ApiRequestException
      */
-    public function findById($id): object
+    public function findById(int $id): object
     {
         $params = [];
         $params['filter[where][id]'] = $id;
         $organization = $this->getApiFirstRecord($params);
-        if ($organization == null) {
+        if ($organization === null) {
             throw new ApiRequestException('Organization with id ' . $id . ' does not exist');
         }
         return $organization;
@@ -37,12 +36,12 @@ class OrganizationRepository extends BaseApiRepository
      * @throws \Exception
      * @throws ApiRequestException
      */
-    public function findByName($name): object
+    public function findByName(string $name): object
     {
         $params = [];
         $params['filter[where][name]'] = $name;
         $organization = $this->getApiFirstRecord($params);
-        if($organization == null) {
+        if($organization === null) {
             throw new ApiRequestException('Organization with name "' . $name . '" does not exist');
         }
         return $organization;
@@ -57,7 +56,7 @@ class OrganizationRepository extends BaseApiRepository
      * @return ApiPagedCollection
      * @throws ApiRequestException
      */
-    public function findChildrenById(int $id, $searchParams = [], $page = 1): ApiPagedCollection
+    public function findChildrenById(int $id, array $searchParams = [], int $page = 1): ApiPagedCollection
     {
         $params = [];
         $params['parentId'] = $id;
@@ -86,11 +85,12 @@ class OrganizationRepository extends BaseApiRepository
     /**
      * Returns an Organization object from an Api record
      *
-     * @param $record
+     * @param array $record
      * @return Organization|null
      */
-    protected function memberToObject(array $record) {
-        if ($record['@type'] != $this::HYDRA_TYPE) {
+    protected function memberToObject(array $record): ?Organization
+    {
+        if ($record['@type'] !== $this::HYDRA_TYPE) {
             return null;
         }
 

+ 4 - 4
ot_core/Tests/Unit/Domain/Repository/BaseApiRepositoryTest.php

@@ -12,8 +12,8 @@ use Opentalent\OtCore\Exception\ApiRequestException;
  * @package Opentalent\OtCore\Tests\Unit\Domain\Repository
  */
 class ConcreteBaseApiRepository extends BaseApiRepository {
-    protected function memberToObject(array $member) { return $member; }
-    public function getApiFirstRecord($params = [], $forceUri = null) { return parent::getApiFirstRecord($params, $forceUri); }
+    protected function memberToObject(array $record): ?object { return (object)$record; }
+    public function getApiFirstRecord(array $params = [], $forceUri = null): object { return parent::getApiFirstRecord($params, $forceUri); }
     public function getApiRecords($params = [], $forceUri = null): ApiPagedCollection { return parent::getApiRecords($params, $forceUri); }
 }
 
@@ -35,7 +35,7 @@ class BaseApiRepositoryTest extends AbstractApiRepositoryTestCase
 
         $actual = $this->repository->getApiFirstRecord($params, $base_uri);
 
-        $this->assertEquals('PortailOrganization', $actual['@type']);
+        $this->assertEquals('PortailOrganization', $actual->{'@type'});
     }
 
     /**
@@ -52,6 +52,6 @@ class BaseApiRepositoryTest extends AbstractApiRepositoryTestCase
 
         $actual = $this->repository->getApiRecords($params, $base_uri);
 
-        $this->assertEquals('PortailOrganization', $actual->getMembers()[0]['@type']);
+        $this->assertEquals('PortailOrganization', $actual->getMembers()[0]->{'@type'});
     }
 }

+ 8 - 8
ot_core/Tests/Unit/Website/OtPageRepositoryTest.php

@@ -75,8 +75,8 @@ class OtPageRepositoryTest extends UnitTestCase
         $root_uid = 200;
         $root_page = $this->pageFixtures->getByUid($root_uid);
 
-        $this->pageRepository->getPage($page_uid, true)->shouldBeCalled()->willReturn($page);
-        $this->pageRepository->getPage($root_uid, true)->shouldBeCalled()->willReturn($root_page);
+        $this->pageRepository->getPage_noCheck($page_uid)->shouldBeCalled()->willReturn($page);
+        $this->pageRepository->getPage_noCheck($root_uid)->shouldBeCalled()->willReturn($root_page);
         $this->injectProphecies();
 
         // Test
@@ -97,7 +97,7 @@ class OtPageRepositoryTest extends UnitTestCase
         $root_uid = 200;
         $root_page = $this->pageFixtures->getByUid($root_uid);
 
-        $this->pageRepository->getPage($root_uid, true)->shouldBeCalled()->willReturn($root_page);
+        $this->pageRepository->getPage_noCheck($root_uid)->shouldBeCalled()->willReturn($root_page);
         $this->injectProphecies();
 
         // Test
@@ -118,8 +118,8 @@ class OtPageRepositoryTest extends UnitTestCase
         $page_uid = 100;
         $page = $this->pageFixtures->getByUid($page_uid);
 
-        $this->pageRepository->getPage($page_uid, true)->shouldBeCalled()->willReturn($page);
-        $this->pageRepository->getPage(0, true)->shouldBeCalled()->willReturn([]);
+        $this->pageRepository->getPage_noCheck($page_uid)->shouldBeCalled()->willReturn($page);
+        $this->pageRepository->getPage_noCheck(0)->shouldBeCalled()->willReturn([]);
         $this->injectProphecies();
 
         // Test
@@ -245,7 +245,7 @@ class OtPageRepositoryTest extends UnitTestCase
 
         $page = $this->pageFixtures->getByUid($page_uid);
 
-        $this->pageRepository->getPage($page_uid, true)->willReturn($page);
+        $this->pageRepository->getPage_noCheck($page_uid)->willReturn($page);
         $this->otPageRepository->injectPageRepository($this->pageRepository->reveal());
 
         // Test
@@ -270,8 +270,8 @@ class OtPageRepositoryTest extends UnitTestCase
         $root_uid = 200;
         $root_page = $this->pageFixtures->getByUid($root_uid);
 
-        $this->pageRepository->getPage($page_uid, true)->shouldBeCalled()->willReturn($page);
-        $this->pageRepository->getPage($root_uid, true)->shouldBeCalled()->willReturn($root_page);
+        $this->pageRepository->getPage_noCheck($page_uid)->shouldBeCalled()->willReturn($page);
+        $this->pageRepository->getPage_noCheck($root_uid)->shouldBeCalled()->willReturn($root_page);
         $this->injectProphecies();
 
         $GLOBALS['_POST'] = ['id' => $page_uid];

+ 5 - 1
ot_core/composer.json

@@ -22,7 +22,11 @@
     },
     "config": {
         "vendor-dir": ".Build/vendor",
-        "bin-dir": ".Build/bin"
+        "bin-dir": ".Build/bin",
+        "allow-plugins": {
+            "typo3/class-alias-loader": true,
+            "typo3/cms-composer-installers": true
+        }
     },
     "autoload": {
         "psr-4": {

+ 1 - 1
ot_core/ext_emconf.php

@@ -18,7 +18,7 @@ $EM_CONF[$_EXTKEY] = [
     'uploadfolder' => 0,
     'createDirs' => '',
     'clearCacheOnLoad' => 0,
-    'version' => '0.6.5',
+    'version' => '0.6.6',
     'constraints' => [
         'depends' => [
             'typo3' => '8.7.0-10.4.99',

+ 0 - 3
ot_templating/Resources/Private/Partials/Modern/Header.html

@@ -4,9 +4,6 @@
 
 <f:comment><!--<f:render partial="Modern/Preloader" />--></f:comment>
 
-<f:comment><!-- Render the matomo integration code --></f:comment>
-<f:comment><!--<f:render partial="Classic/Matomo" />--></f:comment>
-
 <header id="header" class="header default fullWidth">
 
     <f:comment><!-- Render the no-script warning box defined in partial/NoScriptWarning.html--></f:comment>