瀏覽代碼

clean up ot_templating files and doc

Olivier Massot 5 年之前
父節點
當前提交
121c0b699e
共有 62 個文件被更改,包括 436 次插入404 次删除
  1. 4 5
      README.md
  2. 1 0
      composer.json
  3. 0 1
      ot_templating/.gitignore
  4. 41 14
      ot_templating/Classes/Domain/Repository/BaseApiRepository.php
  5. 17 3
      ot_templating/Classes/Domain/Repository/DonorRepository.php
  6. 31 10
      ot_templating/Classes/Domain/Repository/EventRepository.php
  7. 20 1
      ot_templating/Classes/Domain/Repository/MemberRepository.php
  8. 21 9
      ot_templating/Classes/Domain/Repository/OrganizationRepository.php
  9. 38 0
      ot_templating/Classes/Exception/ApiRequestException.php
  10. 8 0
      ot_templating/Classes/Readme.md
  11. 16 9
      ot_templating/Classes/Utilities/OtPageRepository.php
  12. 13 4
      ot_templating/Classes/ViewHelpers/Donors/GetAllViewHelper.php
  13. 14 4
      ot_templating/Classes/ViewHelpers/Events/GetAllViewHelper.php
  14. 13 4
      ot_templating/Classes/ViewHelpers/Events/GetByIdViewHelper.php
  15. 13 2
      ot_templating/Classes/ViewHelpers/Events/GetNextViewHelper.php
  16. 0 8
      ot_templating/Classes/ViewHelpers/EventsPage/.idea/EventsPage.iml
  17. 0 6
      ot_templating/Classes/ViewHelpers/EventsPage/.idea/misc.xml
  18. 0 8
      ot_templating/Classes/ViewHelpers/EventsPage/.idea/modules.xml
  19. 0 6
      ot_templating/Classes/ViewHelpers/EventsPage/.idea/vcs.xml
  20. 0 50
      ot_templating/Classes/ViewHelpers/EventsPage/.idea/workspace.xml
  21. 10 10
      ot_templating/Classes/ViewHelpers/EventsPage/GetIdViewHelper.php
  22. 5 7
      ot_templating/Classes/ViewHelpers/EventsPage/GetUriViewHelper.php
  23. 21 8
      ot_templating/Classes/ViewHelpers/GetPageUidViewHelper.php
  24. 7 4
      ot_templating/Classes/ViewHelpers/LoginFailedViewHelper.php
  25. 14 4
      ot_templating/Classes/ViewHelpers/Members/GetAllCaViewHelper.php
  26. 14 4
      ot_templating/Classes/ViewHelpers/Members/GetAllViewHelper.php
  27. 12 3
      ot_templating/Classes/ViewHelpers/Organizations/GetByIdViewHelper.php
  28. 13 4
      ot_templating/Classes/ViewHelpers/Organizations/GetChildrenViewHelper.php
  29. 11 3
      ot_templating/Classes/ViewHelpers/Request/GetArgumentViewHelper.php
  30. 12 4
      ot_templating/Classes/ViewHelpers/Request/GetParameterViewHelper.php
  31. 6 7
      ot_templating/Classes/ViewHelpers/RootPage/GetIdViewHelper.php
  32. 7 7
      ot_templating/Classes/ViewHelpers/RootPage/GetUriViewHelper.php
  33. 0 101
      ot_templating/Configuration/ExtensionBuilder/settings.yaml
  34. 0 35
      ot_templating/Configuration/FlexForms/Registration.xml
  35. 1 0
      ot_templating/Configuration/Form/CustomFormSetup.yaml
  36. 1 1
      ot_templating/Configuration/TCA/Overrides/pages.php
  37. 0 39
      ot_templating/ExtensionBuilder.json
  38. 20 10
      ot_templating/Readme.md
  39. 5 0
      ot_templating/Resources/Private/Forms/Readme.md
  40. 4 0
      ot_templating/Resources/Private/Language/Readme.md
  41. 2 0
      ot_templating/Resources/Private/Layouts/Readme.md
  42. 3 0
      ot_templating/Resources/Private/Partials/Readme.md
  43. 2 3
      ot_templating/Resources/Private/Readme.md
  44. 3 0
      ot_templating/Resources/Private/Templates/Readme.md
  45. 二進制
      ot_templating/Resources/Public/Icons/relation.gif
  46. 二進制
      ot_templating/Resources/Public/Icons/tx_otwidgets_domain_model_event.gif
  47. 二進制
      ot_templating/Resources/Public/Icons/tx_otwidgets_domain_model_organization.gif
  48. 二進制
      ot_templating/Resources/Public/Icons/tx_widgets_domain_model_event.gif
  49. 二進制
      ot_templating/Resources/Public/Icons/tx_widgets_domain_model_organization.gif
  50. 2 3
      ot_templating/Resources/Public/Readme.md
  51. 5 0
      ot_templating/Resources/Public/assets/Readme.md
  52. 二進制
      ot_templating/Resources/Public/media/IMG-20181024-WA0054.jpg
  53. 二進制
      ot_templating/Resources/Public/media/IMG-20181024-WA0056.jpg
  54. 二進制
      ot_templating/Resources/Public/media/STARMANIA_-_JCDEROUIN_-_012017__174_.jpg
  55. 二進制
      ot_templating/Resources/Public/media/csm_Concert-Orchestre-d_Harmonie-de-Cluses-25-Janvier-2020_3641__50d08767a7.jpg
  56. 二進制
      ot_templating/Resources/Public/media/csm_MUSIQUE_FAUCIGNY_181FESTIVAL_ST_GERVAIS_2017-06-25-1321_af76cd8c7c.jpg
  57. 二進制
      ot_templating/Resources/Public/media/csm_bandeau_3_96d936ab63.jpg
  58. 二進制
      ot_templating/Resources/Public/media/csm_bandeauohc_1bd35fe9ee.jpg
  59. 0 2
      ot_templating/ext_emconf.php
  60. 2 1
      ot_templating/ext_localconf.php
  61. 2 0
      ot_templating/ext_tables.php
  62. 2 0
      ot_templating/ext_tables.sql

+ 4 - 5
README.md

@@ -2,22 +2,21 @@
 
 ### Pré-requis:
 
-* php 7.4
-* Typo3 v9.5-10.3 (en mode composer)
+* php 7.2
+* Typo3 v9.5-10.4 (en mode composer)
 
 ### Les extensions
 
-Pour plus d'information sur chaque extension, consultez les readme de chacunbe d'elles. 
+Pour plus d'information sur chaque extension, consultez les readme de chacune d'elles. 
 
 ### Pour les installer
 
 1. Copier les répertoires des extensions dans le sous-répertoire `public/typo3conf/ext/` 
 du répertoire de l'application typo3
-2. Ajouter les lignes suivantes au fichier `composer.json` de l'application:
+2. Ajouter les lignes suivantes au fichier `composer.json` de l'application :
 
     	"autoload": {
     		"psr-4": {
-    			"Opentalent\\OtWidgets\\": "public/typo3conf/ext/ot_widgets/Classes",
     			"Opentalent\\OtConnect\\": "public/typo3conf/ext/ot_connect/Classes",
     			"Opentalent\\OtTemplating\\": "public/typo3conf/ext/ot_templating/Classes"
     		}

+ 1 - 0
composer.json

@@ -31,6 +31,7 @@
 		"typo3/cms-t3editor": "^9.5",
 		"typo3/cms-tstemplate": "^9.5",
 		"typo3/cms-viewpage": "^9.5",
+		"typo3/cms-lowlevel": "^9.5",
 		"fluidtypo3/flux": "^9.4",
 		"fluidtypo3/vhs": "^6.0",
 		"georgringer/news": "^8.3",

+ 0 - 1
ot_templating/.gitignore

@@ -1 +0,0 @@
-/vendor/

+ 41 - 14
ot_templating/Classes/Domain/Repository/BaseApiRepository.php

@@ -4,11 +4,12 @@ namespace Opentalent\OtTemplating\Domain\Repository;
 
 use GuzzleHttp\Client;
 use GuzzleHttp\Exception\GuzzleException;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use Psr\Http\Message\ResponseInterface;
 use TYPO3\CMS\Extbase\Persistence\Repository;
 
 /**
- *  Base class for repositories based on the opentalent API
+ *  Base class for repositories based on the Opentalent API
  *
  */
 abstract class BaseApiRepository extends Repository
@@ -16,7 +17,7 @@ abstract class BaseApiRepository extends Repository
     const BASE_URI = 'https://api.opentalent.fr/api/';
     const HYDRA_TYPE = '';
     const HTTP_METHOD = 'GET';
-    const ITEMS_PER_PAGE = 1001;
+    const ITEMS_PER_PAGE = 999;
 
     private $client;
 
@@ -32,7 +33,7 @@ abstract class BaseApiRepository extends Repository
      * @param string $uri
      * @param array $params
      * @return ResponseInterface
-     * @throws GuzzleException
+     * @throws ApiRequestException
      */
     protected function get($uri, $params = [])
     {
@@ -40,27 +41,39 @@ abstract class BaseApiRepository extends Repository
         if (!empty($params)) {
             $uri = $uri . '&' . http_build_query($params);
         }
-        return $this->client->request(
-            static::HTTP_METHOD,
-            $uri);
+        try {
+            return $this->client->request(static::HTTP_METHOD, $uri);
+        } catch (GuzzleException $e) {
+            throw ApiRequestException::from_exception($e);
+        }
     }
 
     /**
+     * Send a request to the API and returns
+     * the response's body as a string
+     *
      * @param string $uri
      * @param array $params
      * @return string
-     * @throws GuzzleException
+     * @throws ApiRequestException
      */
     protected function getBody($uri, $params = [])
     {
-        return (string)$this->get($uri, $params)->getBody();
+        try {
+            return (string)$this->get($uri, $params)->getBody();
+        } catch (GuzzleException $e) {
+            throw ApiRequestException::from_exception($e);
+        }
     }
 
     /**
+     * Send a request to the API and
+     * returns the Json response as an array
+     *
      * @param string $uri
      * @param array $params
      * @return array
-     * @throws GuzzleException
+     * @throws ApiRequestException
      */
     protected function getJson($uri, $params = [])
     {
@@ -68,32 +81,46 @@ abstract class BaseApiRepository extends Repository
     }
 
     /**
+     * Send a request to the API and
+     * returns the records as an array (members)
+     *
      * @param string $uri
      * @param array $params
      * @return array
-     * @throws GuzzleException
+     * @throws ApiRequestException
      */
     protected function getApiRecords($uri, $params = []) {
-        $data = $this->getJson($uri, $params);
+        try {
+            $data = $this->getJson($uri, $params);
+        } catch (GuzzleException $e) {
+            throw ApiRequestException::from_exception($e);
+        }
 
         if($data->{'@type'} == 'hydra:PagedCollection') {
             $records = $data->{'hydra:member'};
         } else if ($data->{'@type'} == $this::HYDRA_TYPE) {
             $records = [$data];
         } else {
-            throw new \Exception('Invalid API reponse');
+            throw new ApiRequestException('The API response has an unexpected format');
         }
         return $records;
     }
 
     /**
+     * Send a request to the API and
+     * returns the first record (member)
+     *
      * @param string $uri
      * @param array $params
      * @return array
-     * @throws GuzzleException
+     * @throws ApiRequestException
      */
     protected function getApiFirstRecord($uri, $params = []) {
-        $records = $this->getApiRecords($uri, $params);
+        try {
+            $records = $this->getApiRecords($uri, $params);
+        } catch (GuzzleException $e) {
+            throw ApiRequestException::from_exception($e);
+        }
         return $records[0];
     }
 }

+ 17 - 3
ot_templating/Classes/Domain/Repository/DonorRepository.php

@@ -3,18 +3,26 @@
 namespace Opentalent\OtTemplating\Domain\Repository;
 
 use Opentalent\OtTemplating\Domain\Model\Donor;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 
 class DonorRepository extends BaseApiRepository
 {
     CONST URI = BaseApiRepository::BASE_URI . 'public/donors';
     const HYDRA_TYPE = 'PortailDonor';
 
+    /**
+     * Returns a Donor object from an Api record
+     *
+     * @param $record
+     * @return Donor|null
+     */
     private function donorFromJson($record) {
         if ($record->{'@type'} != $this::HYDRA_TYPE) {
             return null;
         }
         $donor = new Donor();
-        $donor->setId(end(explode('/', $record->{'@id'})));
+        $a = explode('/', $record->{'@id'});
+        $donor->setId(end($a));
         $donor->setOrganizationId($record->{'organizationId'});
         $donor->setName($record->{'name'});
         $donor->setEmail($record->{'email'});
@@ -27,6 +35,12 @@ class DonorRepository extends BaseApiRepository
         return $donor;
     }
 
+    /**
+     * Returns an array of Donor objects from an array of Api records
+     *
+     * @param $records
+     * @return array
+     */
     private function donorsFromJson($records) {
         $donors = [];
         foreach ($records as $record) {
@@ -40,7 +54,7 @@ class DonorRepository extends BaseApiRepository
      *
      * @param int $organizationId The id of the organization
      * @return array              Donors
-     * @throws \Exception
+     * @throws ApiRequestException
      */
     public function findByOrganizationId(int $organizationId) {
         $params = [];
@@ -55,7 +69,7 @@ class DonorRepository extends BaseApiRepository
      *
      * @param int $organizationId The id of the organization
      * @return array              Donors
-     * @throws \Exception
+     * @throws ApiRequestException
      */
     public function findParentsByOrganizationId(int $organizationId) {
         $params = [];

+ 31 - 10
ot_templating/Classes/Domain/Repository/EventRepository.php

@@ -2,19 +2,28 @@
 
 namespace Opentalent\OtTemplating\Domain\Repository;
 
+use Exception;
 use Opentalent\OtTemplating\Domain\Model\Event;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 
 class EventRepository extends BaseApiRepository
 {
     CONST URI = BaseApiRepository::BASE_URI . 'public/events';
     const HYDRA_TYPE = 'PortailEvent';
 
+    /**
+     * Returns an Event object from an Api record
+     * @param array $record A record as returned by $this->getApiRecords
+     * @return Event|null
+     * @throws Exception
+     */
     private function eventFromJson($record) {
         if ($record->{'@type'} != $this::HYDRA_TYPE) {
             return null;
         }
         $event = new Event();
-        $event->setId(end(explode('/', $record->{'@id'})));
+        $a = explode('/', $record->{'@id'});
+        $event->setId(end($a));
         $event->setOrganizationId($record->{'organizationId'});
         $event->setSubdomain($record->{'subDomain'});
         $event->setName($record->{'name'});
@@ -49,6 +58,13 @@ class EventRepository extends BaseApiRepository
         return $event;
     }
 
+    /**
+     * Returns an array of Event objects from an array of Api records
+     *
+     * @param array $records An array of records as returned by $this->getApiRecords
+     * @return array
+     * @throws Exception
+     */
     private function eventsFromJson($records) {
         $events = [];
         foreach ($records as $record) {
@@ -62,11 +78,12 @@ class EventRepository extends BaseApiRepository
      *
      * @param int $id The id of the event
      * @return Event         Event
-     * @throws \Exception
+     * @throws ApiRequestException
+     * @throws Exception
      */
     public function findById($id) {
         $params = [];
-        $record = $this->getApiFirstRecord($this::URI . '/' . $id);
+        $record = $this->getApiFirstRecord($this::URI . '/' . $id, $params);
         return $this->eventFromJson($record);
     }
 
@@ -77,8 +94,9 @@ class EventRepository extends BaseApiRepository
      * @param \Datetime $fromDate Only return events with ending date posterior or equal to this date (leave null for disable the filter)
      * @param \Datetime $toDate Only return events with starting date anterior or equal to this date (leave null for disable the filter)
      * @param int $limit Limit the number of results returned (-1 to disable the limitation)
-     * @return array                        Events
-     * @throws \Exception
+     * @return array Events
+     * @throws ApiRequestException
+     * @throws Exception
      */
     public function findByOrganizationId(int $organizationId, $fromDate = null, $toDate = null, $limit = -1) {
         $params = [];
@@ -108,7 +126,8 @@ class EventRepository extends BaseApiRepository
      * @param \Datetime $toDate Only return events with starting date anterior or equal to this date (leave null for disable the filter)
      * @param int $limit Limit the number of results returned (-1 to disable the limitation)
      * @return array                        Events
-     * @throws \Exception
+     * @throws ApiRequestException
+     * @throws Exception
      */
     public function findParentsByOrganizationId(int $organizationId, $fromDate = null, $toDate = null, $limit = -1) {
         $params = [];
@@ -136,11 +155,12 @@ class EventRepository extends BaseApiRepository
      * Get the events of the organization's parents
      *
      * @param int $organizationId The id of the organization
-     * @param \Datetime $fromDate Only return events with ending date posterior or equal to this date (leave null for disable the filter)
-     * @param \Datetime $toDate Only return events with starting date anterior or equal to this date (leave null for disable the filter)
+     * @param \Datetime|null $fromDate Only return events with ending date posterior or equal to this date (leave null for disable the filter)
+     * @param \Datetime|null $toDate Only return events with starting date anterior or equal to this date (leave null for disable the filter)
      * @param int $limit Limit the number of results returned (-1 to disable the limitation)
      * @return array                        Events
-     * @throws \Exception
+     * @throws ApiRequestException
+     * @throws Exception
      */
     public function findChildrenByOrganizationId(int $organizationId, $fromDate = null, $toDate = null, $limit = -1) {
         $params = [];
@@ -170,7 +190,8 @@ class EventRepository extends BaseApiRepository
      * @param int $organizationId The id of the organization
      * @param array $searchParams Search arguments
      * @return array                        Events
-     * @throws \Exception
+     * @throws ApiRequestException
+     * @throws Exception
      */
     public function searchBy(int $organizationId, $searchParams = []) {
         $params = [];

+ 20 - 1
ot_templating/Classes/Domain/Repository/MemberRepository.php

@@ -2,7 +2,9 @@
 
 namespace Opentalent\OtTemplating\Domain\Repository;
 
+use GuzzleHttp\Exception\GuzzleException;
 use Opentalent\OtTemplating\Domain\Model\Member;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 
 class MemberRepository extends BaseApiRepository
 {
@@ -11,13 +13,21 @@ class MemberRepository extends BaseApiRepository
     const HYDRA_TYPE = 'PortailMemberBySpeciality';
     const HYDRA_TYPE_CA = 'PortailMemberByRole';
 
+    /**
+     * Returns a Member object from an Api record
+     *
+     * @param $record
+     * @return Member|null
+     * @throws \Exception
+     */
     private function memberFromJson($record) {
         if ($record->{'@type'} != $this::HYDRA_TYPE &&
             $record->{'@type'} != $this::HYDRA_TYPE_CA) {
             return null;
         }
         $member = new Member();
-        $member->setId(end(explode('/', $record->{'@id'})));
+        $a = explode('/', $record->{'@id'});
+        $member->setId(end($a));
         $member->setOrganizationId((int)$record->{'organizationId'});
         $member->setGender($record->{'gender'});
         $member->setGivenName($record->{'givenName'});
@@ -41,6 +51,13 @@ class MemberRepository extends BaseApiRepository
         return $member;
     }
 
+    /**
+     * Returns an array of Member objects from an array of Api records
+     *
+     * @param $records
+     * @return array
+     * @throws \Exception
+     */
     private function membersFromJson($records) {
         $members = [];
         foreach ($records as $record) {
@@ -54,7 +71,9 @@ class MemberRepository extends BaseApiRepository
      * If $only_ca is true, returns only the members onf the CA
      *
      * @param int $organizationId The id of the organization
+     * @param bool $only_ca If true, returns the CA members instead of all the members
      * @return array              Members
+     * @throws ApiRequestException
      * @throws \Exception
      */
     public function findByOrganizationId(int $organizationId, bool $only_ca = false) {

+ 21 - 9
ot_templating/Classes/Domain/Repository/OrganizationRepository.php

@@ -2,21 +2,28 @@
 
 namespace Opentalent\OtTemplating\Domain\Repository;
 
+use GuzzleHttp\Exception\GuzzleException;
 use Opentalent\OtTemplating\Domain\Model\Organization;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 
 class OrganizationRepository extends BaseApiRepository
 {
     CONST URI = BaseApiRepository::BASE_URI . 'public/organizations';
     const HYDRA_TYPE = 'PortailOrganization';
 
+    /**
+     * Returns an Organization object from an Api record
+     *
+     * @param $record
+     * @return Organization|null
+     */
     private function organizationFromJson($record) {
         if ($record->{'@type'} != $this::HYDRA_TYPE) {
             return null;
         }
         $organization = new Organization();
-        // TODO: intégrer l'id à la réponse de l'API pour éviter le parsing
-        $array = explode('/', $record->{'@id'});
-        $organization->setId(end($array));
+        $a = explode('/', $record->{'@id'});
+        $organization->setId(end($a));
         $organization->setSubdomain($record->{'subDomain'});
         $organization->setName($record->{'name'});
         $organization->setSlug($record->{'slug'});
@@ -36,6 +43,12 @@ class OrganizationRepository extends BaseApiRepository
         return $organization;
     }
 
+    /**
+     * Returns an array of Organization objects from an array of Api records
+     *
+     * @param $records
+     * @return array
+     */
     private function organizationsFromJson($records) {
         $organizations = [];
         foreach ($records as $record) {
@@ -49,8 +62,7 @@ class OrganizationRepository extends BaseApiRepository
      *
      * @param int $id The id of the organization
      * @return Organization
-     * @throws \Exception
-     * @throws \GuzzleHttp\Exception\GuzzleException
+     * @throws ApiRequestException
      */
     public function findById($id) {
         $params = [];
@@ -58,7 +70,7 @@ class OrganizationRepository extends BaseApiRepository
         $record = $this->getApiFirstRecord($this::URI, $params);
         $organization = $this->organizationFromJson($record);
         if($organization == null) {
-            throw new \Exception('Organization with id ' . $id . ' does not exist');
+            throw new ApiRequestException('Organization with id ' . $id . ' does not exist');
         }
         return $organization;
     }
@@ -69,7 +81,7 @@ class OrganizationRepository extends BaseApiRepository
      * @param string name          The name of the organization
      * @return Organization
      * @throws \Exception
-     * @throws \GuzzleHttp\Exception\GuzzleException
+     * @throws ApiRequestException
      */
     public function findByName($name)
     {
@@ -87,9 +99,9 @@ class OrganizationRepository extends BaseApiRepository
      * Get the organization's child structures by id
      *
      * @param int $id The id of the organization
+     * @param array $searchParams An array of parameters which will be passed to the Api request as URI parameters
      * @return array
-     * @throws \Exception
-     * @throws \GuzzleHttp\Exception\GuzzleException
+     * @throws ApiRequestException
      */
     public function findChildrenById($id, $searchParams = [])
     {

+ 38 - 0
ot_templating/Classes/Exception/ApiRequestException.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace Opentalent\OtTemplating\Exception;
+
+use Exception;
+
+/**
+ * Class ApiRequestException
+ *
+ * An ApiRequestException is raised when a request to the
+ * Opentalent Api did not return a valid answer.
+ *
+ * @package Opentalent\OtTemplating\Exception
+ */
+class ApiRequestException extends Exception
+{
+    /**
+     * ApiRequestException constructor.
+     *
+     * @param $message
+     * @param int $code
+     * @param Exception|null $previous
+     */
+    public function __construct($message, $code = 0, Exception $previous = null) {
+        parent::__construct($message, $code, $previous);
+    }
+
+    /**
+     * Construction from other exception
+     *
+     * @param Exception $e
+     * @return ApiRequestException
+     */
+    public static function from_exception(Exception $e) {
+        return new ApiRequestException($e->getMessage(), $e->getCode(), $e->getPrevious());
+    }
+
+}

+ 8 - 0
ot_templating/Classes/Readme.md

@@ -0,0 +1,8 @@
+# Classes
+
+Ce répertoire contient toutes les classes PHP créés pour l'extension: viewhelpers, repositories, models...
+
+* Domain contient les repositories et les models
+* Exception contient les exceptions custom
+* Utilities fournit des utilitaires utilisables par les autres classes
+* Viewhelpers contient les viewhelpers (surprise!) qui sont utilisés dans les templates fluid de l'extension

+ 16 - 9
ot_templating/Classes/Page/OtPageRepository.php → ot_templating/Classes/Utilities/OtPageRepository.php

@@ -1,28 +1,35 @@
 <?php
 
-
-namespace Opentalent\OtTemplating\Page;
-
+namespace Opentalent\OtTemplating\Utilities;
 
 use TYPO3\CMS\Frontend\Page\PageRepository;
 
+/**
+ * Class OtPageRepository
+ *
+ * Provides some useful methods to query typo3 pages
+ *
+ * @package Opentalent\OtTemplating\Page
+ */
 class OtPageRepository extends PageRepository
 {
-
     /**
      * Recursively returns all the subpages of the given page
      *
      * @param $pageId
-     * @param string $fields
-     * @param string $sortField
-     * @param string $additionalWhereClause
-     * @param bool $checkShortcuts
      * @return array
      */
     public function getAllSubpagesForPage($pageId) {
         $subpages = [];
 
-        $stack = $this->getSubpagesForPages([$pageId], '*', 'sorting', '', false);
+        $stack = $this->getSubpagesForPages(
+            [$pageId],
+            '*',
+            'sorting',
+            '',
+            false
+        );
+
         foreach ($stack as $page) {
             $subpages[] = $page;
             $children = $this->getAllSubpagesForPage($page['uid']);

+ 13 - 4
ot_templating/Classes/ViewHelpers/Donors/GetAllViewHelper.php

@@ -4,11 +4,12 @@ namespace Opentalent\OtTemplating\ViewHelpers\Donors;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\DonorRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- *   This view helper provides an array named according to the 'as' variable
- *   and which contains all the donors of the structure
+ *   This view helper give access to an array named according to the 'as' variable
+ *   and which contains all the donors of the given structure
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
@@ -29,11 +30,15 @@ class GetAllViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\DonorRepository
+     * @var DonorRepository
      *
      */
     protected $donorRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -58,7 +63,11 @@ class GetAllViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
+     * @throws ApiRequestException
      */
     public function render()
     {
@@ -80,7 +89,7 @@ class GetAllViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\DonorRepository $donorRepository
+     * @param DonorRepository $donorRepository
      */
     public function injectDonorRepository(DonorRepository $donorRepository)
     {

+ 14 - 4
ot_templating/Classes/ViewHelpers/Events/GetAllViewHelper.php

@@ -4,11 +4,12 @@ namespace Opentalent\OtTemplating\ViewHelpers\Events;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\EventRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- *   This view helper provides an array named according to the 'as' variable
- *   and which contains the next events of the structure
+ *   This view helper give access to an array named according to the 'as' variable
+ *   and containing all the upcoming events of the structure
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
@@ -22,6 +23,7 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetAllViewHelper extends AbstractViewHelper {
 
     use TemplateVariableViewHelperTrait;
+
     /**
      * >> Required to prevent typo3 to escape the html output
      * @var boolean
@@ -29,11 +31,15 @@ class GetAllViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\EventRepository
+     * @var EventRepository
      *
      */
     protected $eventRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -51,7 +57,11 @@ class GetAllViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
+     * @throws ApiRequestException
      */
     public function render()
     {
@@ -82,7 +92,7 @@ class GetAllViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\EventRepository $eventRepository
+     * @param EventRepository $eventRepository
      */
     public function injectEventRepository(EventRepository $eventRepository)
     {

+ 13 - 4
ot_templating/Classes/ViewHelpers/Events/GetByIdViewHelper.php

@@ -4,10 +4,11 @@ namespace Opentalent\OtTemplating\ViewHelpers\Events;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\EventRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- *   This view helper return the Event object matching the given id
+ *   This view helper returns the Event object matching the given id
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
@@ -21,6 +22,7 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetByIdViewHelper extends AbstractViewHelper {
 
     use TemplateVariableViewHelperTrait;
+
     /**
      * >> Required to prevent typo3 to escape the html output
      * @var boolean
@@ -28,11 +30,14 @@ class GetByIdViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\EventRepository
-     *
+     * @var EventRepository
      */
     protected $eventRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -50,7 +55,11 @@ class GetByIdViewHelper extends AbstractViewHelper {
     }
 
     /**
+     *  -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
+     * @throws ApiRequestException
      */
     public function render()
     {
@@ -63,7 +72,7 @@ class GetByIdViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\EventRepository $eventRepository
+     * @param EventRepository $eventRepository
      */
     public function injectEventRepository(EventRepository $eventRepository)
     {

+ 13 - 2
ot_templating/Classes/ViewHelpers/Events/GetNextViewHelper.php

@@ -5,6 +5,7 @@ namespace Opentalent\OtTemplating\ViewHelpers\Events;
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use FluidTYPO3\Vhs\Utility\ErrorUtility;
 use Opentalent\OtTemplating\Domain\Repository\EventRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -25,6 +26,7 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetNextViewHelper extends AbstractViewHelper {
 
     use TemplateVariableViewHelperTrait;
+
     /**
      * >> Required to prevent typo3 to escape the html output
      * @var boolean
@@ -32,11 +34,15 @@ class GetNextViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\EventRepository
+     * @var EventRepository
      *
      */
     protected $eventRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -82,7 +88,12 @@ class GetNextViewHelper extends AbstractViewHelper {
     }
 
     /**
+     *  -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
+     * @throws ApiRequestException
+     * @throws \Exception
      */
     public function render()
     {
@@ -130,7 +141,7 @@ class GetNextViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\EventRepository $eventRepository
+     * @param EventRepository $eventRepository
      */
     public function injectEventRepository(EventRepository $eventRepository)
     {

+ 0 - 8
ot_templating/Classes/ViewHelpers/EventsPage/.idea/EventsPage.iml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="WEB_MODULE" version="4">
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$" />
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>

+ 0 - 6
ot_templating/Classes/ViewHelpers/EventsPage/.idea/misc.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="JavaScriptSettings">
-    <option name="languageLevel" value="ES6" />
-  </component>
-</project>

+ 0 - 8
ot_templating/Classes/ViewHelpers/EventsPage/.idea/modules.xml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/EventsPage.iml" filepath="$PROJECT_DIR$/.idea/EventsPage.iml" />
-    </modules>
-  </component>
-</project>

+ 0 - 6
ot_templating/Classes/ViewHelpers/EventsPage/.idea/vcs.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$/../../../../../../.." vcs="Git" />
-  </component>
-</project>

+ 0 - 50
ot_templating/Classes/ViewHelpers/EventsPage/.idea/workspace.xml

@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ChangeListManager">
-    <list default="true" id="31a9b4b5-cc6d-44ee-bab1-2d268817374e" name="Default Changelist" comment="">
-      <change beforePath="$PROJECT_DIR$/../../../../../LocalConfiguration.php" beforeDir="false" afterPath="$PROJECT_DIR$/../../../../../LocalConfiguration.php" afterDir="false" />
-    </list>
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="ComposerSettings">
-    <execution />
-  </component>
-  <component name="Git.Settings">
-    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../../../../../../.." />
-  </component>
-  <component name="ProjectId" id="1d24WKsMsz9DsRsn9Mc7MxK6acW" />
-  <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
-  <component name="ProjectViewState">
-    <option name="hideEmptyMiddlePackages" value="true" />
-    <option name="showLibraryContents" value="true" />
-  </component>
-  <component name="PropertiesComponent">
-    <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
-    <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
-    <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/../../../../../../../../docker" />
-  </component>
-  <component name="TYPO3Settings" version="201.5.4" />
-  <component name="TaskManager">
-    <task active="true" id="Default" summary="Default task">
-      <changelist id="31a9b4b5-cc6d-44ee-bab1-2d268817374e" name="Default Changelist" comment="" />
-      <created>1591609884476</created>
-      <option name="number" value="Default" />
-      <option name="presentableId" value="Default" />
-      <updated>1591609884476</updated>
-    </task>
-    <servers />
-  </component>
-  <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="2" />
-  </component>
-  <component name="WindowStateProjectService">
-    <state x="743" y="286" width="424" height="488" key="FileChooserDialogImpl" timestamp="1591609905436">
-      <screen x="0" y="27" width="1920" height="1002" />
-    </state>
-    <state x="743" y="286" width="424" height="488" key="FileChooserDialogImpl/0.27.1920.1002/1920.0.1280.1024@0.27.1920.1002" timestamp="1591609905436" />
-  </component>
-</project>

+ 10 - 10
ot_templating/Classes/ViewHelpers/EventsPage/GetIdViewHelper.php

@@ -2,14 +2,15 @@
 
 namespace Opentalent\OtTemplating\ViewHelpers\EventsPage;
 
-use Opentalent\OtTemplating\Page\OtPageRepository;
+use Closure;
+use Opentalent\OtTemplating\Utilities\OtPageRepository;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- * Viewhelper to retrieve the Id of the current site events page
- * The events page is the first page found which has the template 'OpenTalent.OtTemplating->events'
- * Return null if no such page is found
+ * Retrieves and returns the uid of the events' page of the current site
+ * The events page is the first page found with the template 'OpenTalent.OtTemplating->events'
+ * Returns null if no such page is found
  *
  * Call it in fluid templates with:
  *
@@ -22,19 +23,18 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetIdViewHelper extends AbstractViewHelper
 {
 
-    public function initializeArguments()
-    {
-    }
-
     /**
+     *  -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
-     * @param \Closure $renderChildrenClosure
+     * @param Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
      * @return int|null
      */
     public static function renderStatic(
         array $arguments,
-        \Closure $renderChildrenClosure,
+        Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
         $rootId = \Opentalent\OtTemplating\ViewHelpers\RootPage\GetIdViewHelper::renderStatic(

+ 5 - 7
ot_templating/Classes/ViewHelpers/EventsPage/GetUriViewHelper.php

@@ -6,8 +6,8 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- * Viewhelper to retrieve the Uri to the current site events page
- * The events page is the first page found which has the template 'OpenTalent.OtTemplating->events'
+ * Retrieves and returns the Uri to the events page of the current site
+ * The events page is the first page found with the template 'OpenTalent.OtTemplating->events'
  * Return an empty string if no such page is found
  *
  * Call it in fluid templates with:
@@ -20,12 +20,10 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  */
 class GetUriViewHelper extends AbstractViewHelper
 {
-
-    public function initializeArguments()
-    {
-    }
-
     /**
+     *  -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
      * @param \Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext

+ 21 - 8
ot_templating/Classes/ViewHelpers/GetPageUidViewHelper.php

@@ -3,15 +3,16 @@
 namespace Opentalent\OtTemplating\ViewHelpers;
 
 
-use Opentalent\OtTemplating\Page\OtPageRepository;
-use Psr\Http\Message\ServerRequestInterface;
+use Closure;
+use Opentalent\OtTemplating\Utilities\OtPageRepository;
+use Opentalent\OtTemplating\ViewHelpers\RootPage\GetIdViewHelper;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- * Return the uid of the page with the given slug
+ * Returns the uid of the page with the given slug
  * if it exists in the current website,
- * else return null
+ * else returns null
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
@@ -22,23 +23,35 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetPageUidViewHelper extends AbstractViewHelper
 {
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
-        $this->registerArgument('slug', 'string', 'The slug of the researched page', true);
+        $this->registerArgument(
+            'slug',
+            'string',
+            'The slug of the researched page',
+            true
+        );
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
-     * @param \Closure $renderChildrenClosure
+     * @param Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
      * @return int|null
      */
     public static function renderStatic(
         array $arguments,
-        \Closure $renderChildrenClosure,
+        Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
-        $rootId = \Opentalent\OtTemplating\ViewHelpers\RootPage\GetIdViewHelper::renderStatic(
+        $rootId = GetIdViewHelper::renderStatic(
             $arguments,
             $renderChildrenClosure,
             $renderingContext

+ 7 - 4
ot_templating/Classes/ViewHelpers/LoginFailedViewHelper.php

@@ -4,12 +4,12 @@
 namespace Opentalent\OtTemplating\ViewHelpers;
 
 
-use Psr\Http\Message\ServerRequestInterface;
+use Closure;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- * Return true if a login attempt failed
+ * Returns true if a login attempt just failed
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
@@ -21,14 +21,17 @@ class LoginFailedViewHelper extends AbstractViewHelper
 {
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
-     * @param \Closure $renderChildrenClosure
+     * @param Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
      * @return int|null
      */
     public static function renderStatic(
         array $arguments,
-        \Closure $renderChildrenClosure,
+        Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
         $loginFailure = $GLOBALS['TSFE']->fe_user->loginFailure;

+ 14 - 4
ot_templating/Classes/ViewHelpers/Members/GetAllCaViewHelper.php

@@ -7,7 +7,7 @@ use Opentalent\OtTemplating\Domain\Repository\MemberRepository;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- *   This view helper provides an array named according to the 'as' variable
+ *   This view helper give access to an array named according to the 'as' variable
  *   and which contains the CA members of the structure classed by role
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
@@ -22,6 +22,7 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetAllCaViewHelper extends AbstractViewHelper {
 
     use TemplateVariableViewHelperTrait;
+
     /**
      * >> Required to prevent typo3 to escape the html output
      * @var boolean
@@ -29,11 +30,15 @@ class GetAllCaViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\MemberRepository
+     * @var MemberRepository
      *
      */
     protected $memberRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -59,7 +64,12 @@ class GetAllCaViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     * @throws \Opentalent\OtTemplating\Exception\ApiRequestException
      */
     public function render()
     {
@@ -116,7 +126,7 @@ class GetAllCaViewHelper extends AbstractViewHelper {
                 $membersByMission[$mission] = [];
             }
 
-            // Put members into their categorie(s)
+            // Put members into their categories
             foreach ($members as $member) {
                 if (array_key_exists($member->getMission(), $membersByMission)) {
                     array_push($membersByMission[$member->getMission()], $member);
@@ -132,7 +142,7 @@ class GetAllCaViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\MemberRepository $memberRepository
+     * @param MemberRepository $memberRepository
      */
     public function injectMemberRepository(MemberRepository $memberRepository)
     {

+ 14 - 4
ot_templating/Classes/ViewHelpers/Members/GetAllViewHelper.php

@@ -4,11 +4,12 @@ namespace Opentalent\OtTemplating\ViewHelpers\Members;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\MemberRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- *   This view helper provides an array named according to the 'as' variable
- *   and which contains the members of the structure classed by intrument
+ *   This view helper give access to an array named according to the 'as' variable
+ *   and which contains the members of the structure, eventually grouped by instruments
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
@@ -22,6 +23,7 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetAllViewHelper extends AbstractViewHelper {
 
     use TemplateVariableViewHelperTrait;
+
     /**
      * >> Required to prevent typo3 to escape the html output
      * @var boolean
@@ -29,11 +31,15 @@ class GetAllViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\MemberRepository
+     * @var MemberRepository
      *
      */
     protected $memberRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -59,7 +65,11 @@ class GetAllViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
+     * @throws ApiRequestException
      */
     public function render()
     {
@@ -119,7 +129,7 @@ class GetAllViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\MemberRepository $memberRepository
+     * @param MemberRepository $memberRepository
      */
     public function injectMemberRepository(MemberRepository $memberRepository)
     {

+ 12 - 3
ot_templating/Classes/ViewHelpers/Organizations/GetByIdViewHelper.php

@@ -4,6 +4,7 @@ namespace Opentalent\OtTemplating\ViewHelpers\Organizations;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\OrganizationRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
@@ -21,6 +22,7 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetByIdViewHelper extends AbstractViewHelper {
 
     use TemplateVariableViewHelperTrait;
+
     /**
      * >> Required to prevent typo3 to escape the html output
      * @var boolean
@@ -28,11 +30,15 @@ class GetByIdViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\OrganizationRepository
+     * @var OrganizationRepository
      *
      */
     protected $organizationRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -50,8 +56,11 @@ class GetByIdViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
-     * @throws \Exception
+     * @throws ApiRequestException
      */
     public function render()
     {
@@ -64,7 +73,7 @@ class GetByIdViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\OrganizationRepository $organizationRepository
+     * @param OrganizationRepository $organizationRepository
      */
     public function injectOrganizationRepository(OrganizationRepository $organizationRepository)
     {

+ 13 - 4
ot_templating/Classes/ViewHelpers/Organizations/GetChildrenViewHelper.php

@@ -4,10 +4,11 @@ namespace Opentalent\OtTemplating\ViewHelpers\Organizations;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use Opentalent\OtTemplating\Domain\Repository\OrganizationRepository;
+use Opentalent\OtTemplating\Exception\ApiRequestException;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- *   This view helper return the Organization object matching the given id
+ *   This view helper returns the organization children structures
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
  *
@@ -21,6 +22,7 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 class GetChildrenViewHelper extends AbstractViewHelper {
 
     use TemplateVariableViewHelperTrait;
+
     /**
      * >> Required to prevent typo3 to escape the html output
      * @var boolean
@@ -28,11 +30,15 @@ class GetChildrenViewHelper extends AbstractViewHelper {
     protected $escapeOutput = false;
 
     /**
-     * @var \Opentalent\OtTemplating\Domain\Repository\OrganizationRepository
+     * @var OrganizationRepository
      *
      */
     protected $organizationRepository;
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument(
@@ -50,8 +56,11 @@ class GetChildrenViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @return string
-     * @throws \Exception
+     * @throws ApiRequestException
      */
     public function render()
     {
@@ -70,7 +79,7 @@ class GetChildrenViewHelper extends AbstractViewHelper {
     }
 
     /**
-     * @param \Opentalent\OtTemplating\Domain\Repository\OrganizationRepository $organizationRepository
+     * @param OrganizationRepository $organizationRepository
      */
     public function injectOrganizationRepository(OrganizationRepository $organizationRepository)
     {

+ 11 - 3
ot_templating/Classes/ViewHelpers/Request/GetArgumentViewHelper.php

@@ -2,6 +2,7 @@
 
 namespace Opentalent\OtTemplating\ViewHelpers\Request;
 
+use Closure;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
@@ -17,6 +18,10 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  */
 class GetArgumentViewHelper extends AbstractViewHelper {
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument('argument',
@@ -26,14 +31,17 @@ class GetArgumentViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
-     * @param \Closure $renderChildrenClosure
+     * @param Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
-     * @return int|null
+     * @return string|null
      */
     public static function renderStatic(
         array $arguments,
-        \Closure $renderChildrenClosure,
+        Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
         $argument = $arguments['argument'];

+ 12 - 4
ot_templating/Classes/ViewHelpers/Request/GetParameterViewHelper.php

@@ -2,11 +2,12 @@
 
 namespace Opentalent\OtTemplating\ViewHelpers\Request;
 
+use Closure;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- *   Check if a parameter with this name was passed trough the GET request.
+ *   Checks if a parameter with this name was passed trough the GET request.
  *   If this is the case, returns this parameter; if not returns null.
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
@@ -17,6 +18,10 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  */
 class GetParameterViewHelper extends AbstractViewHelper {
 
+    /**
+     * -- This method is expected by Fluid --
+     * Declares the viewhelper's parameters
+     */
     public function initializeArguments()
     {
         $this->registerArgument('param',
@@ -26,14 +31,17 @@ class GetParameterViewHelper extends AbstractViewHelper {
     }
 
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
-     * @param \Closure $renderChildrenClosure
+     * @param Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
-     * @return int|null
+     * @return string|null
      */
     public static function renderStatic(
         array $arguments,
-        \Closure $renderChildrenClosure,
+        Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
         $param = $arguments['param'];

+ 6 - 7
ot_templating/Classes/ViewHelpers/RootPage/GetIdViewHelper.php

@@ -2,6 +2,7 @@
 
 namespace Opentalent\OtTemplating\ViewHelpers\RootPage;
 
+use Closure;
 use FluidTYPO3\Vhs\Service\PageService;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Object\ObjectManager;
@@ -20,20 +21,18 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  */
 class GetIdViewHelper extends AbstractViewHelper
 {
-
-    public function initializeArguments()
-    {
-    }
-
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
-     * @param \Closure $renderChildrenClosure
+     * @param Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
      * @return int|null
      */
     public static function renderStatic(
         array $arguments,
-        \Closure $renderChildrenClosure,
+        Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
         $pageUid = $GLOBALS['TSFE']->id;

+ 7 - 7
ot_templating/Classes/ViewHelpers/RootPage/GetUriViewHelper.php

@@ -2,6 +2,7 @@
 
 namespace Opentalent\OtTemplating\ViewHelpers\RootPage;
 
+use Closure;
 use FluidTYPO3\Vhs\Service\PageService;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Object\ObjectManager;
@@ -9,7 +10,7 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 
 /**
- * Viewhelper to retrieve the Uri to the current site root page
+ * Viewhelper to retrieve the Uri of the root page of the current site
  * Call it in fluid templates with:
  *
  *     {namespace ot=Opentalent\OtTemplating\ViewHelpers}
@@ -20,19 +21,18 @@ use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
  */
 class GetUriViewHelper extends AbstractViewHelper
 {
-    public function initializeArguments()
-    {
-    }
-
     /**
+     * -- This method is expected by Fluid --
+     * Renders the content as html
+     *
      * @param array $arguments
-     * @param \Closure $renderChildrenClosure
+     * @param Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
      * @return string
      */
     public static function renderStatic(
         array $arguments,
-        \Closure $renderChildrenClosure,
+        Closure $renderChildrenClosure,
         RenderingContextInterface $renderingContext
     ) {
         $pageUid = GetIdViewHelper::renderStatic($arguments, $renderChildrenClosure, $renderingContext);

+ 0 - 101
ot_templating/Configuration/ExtensionBuilder/settings.yaml

@@ -1,101 +0,0 @@
-#
-# Extension Builder settings for extension ot_templating
-# generated 2020-04-03T14:56:00Z
-#
-# See http://www.yaml.org/spec/1.2/spec.html
-#
-
----
-
-###########    Overwrite settings  ###########
-#
-# These settings only apply, if the roundtrip feature of the extension builder
-# is enabled in the extension manager
-#
-# Usage:
-# nesting reflects the file structure
-# a setting applies to a file or recursive to all files and subfolders
-#
-# merge:
-#   means for classes: All properties ,methods and method bodies
-#   of the existing class will be modified according to the new settings
-#   but not overwritten
-#
-#   for locallang xlf files: Existing keys and labels are always
-#   preserved (renaming a property or DomainObject will result in new keys and new labels)
-#
-#   for other files: You will find a Split token at the end of the file
-#   see: \EBT\ExtensionBuilder\Service\RoundTrip::SPLIT_TOKEN
-#
-#   After this token you can write whatever you want and it will be appended
-#   everytime the code is generated
-#
-# keep:
-#   files are never overwritten
-#   These settings may break the functionality of the extension builder!
-#   Handle with care!
-#
-#
-
-############  extension settings  ##############
-
-overwriteSettings:
-  Classes:
-    Controller: merge
-    Domain:
-      Model: merge
-      Repository: merge
-
-  Configuration:
-    #TCA merge not possible - use overrides directory
-    #TypoScript: keep
-
-  Resources:
-    Private:
-      #Language: merge
-      #Templates: keep
-
-  user_extension.svg: keep
-
-#  ext_localconf.php: merge
-
-#  ext_tables.php: merge
-
-#  ext_tables.sql: merge
-
-## use static date attribute in xliff files ##
-#staticDateInXliffFiles: 2020-04-03T14:56:00Z
-
-## skip docComment (license header) ##
-#skipDocComment
-
-## list of error codes for warnings that should be ignored ##
-#ignoreWarnings:
-  #503
-
-######### settings for classBuilder #############################
-#
-# here you may define default parent classes for your classes
-# these settings only apply for new generated classes
-# you may also just change the parent class in the generated class file.
-# It will be kept on next code generation, if the overwrite settings
-# are configured to merge it
-#
-#################################################################
-
-classBuilder:
-
-  Controller:
-    parentClass: \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
-
-  Model:
-    AbstractEntity:
-      parentClass: \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
-
-    AbstractValueObject:
-      parentClass: \TYPO3\CMS\Extbase\DomainObject\AbstractValueObject
-
-  Repository:
-    parentClass: \TYPO3\CMS\Extbase\Persistence\Repository
-
-  setDefaultValuesForClassProperties: true

+ 0 - 35
ot_templating/Configuration/FlexForms/Registration.xml

@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<T3DataStructure>
-    <sheets>
-        <sDEF>
-            <ROOT>
-                <TCEforms>
-                    <sheetTitle>LLL:EXT:ot_templating/Resources/Private/Language/Backend.xlf:settings.registration.title</sheetTitle>
-                </TCEforms>
-                <type>array</type>
-                <el>
-                    <!-- Add settings here ... -->
-
-                    <!-- Example setting: input field with name settings.timeRestriction -->
-                    <settings.includeCategories>
-                        <TCEforms>
-                            <label>LLL:EXT:ot_templating/Resources/Private/Language/Backend.xlf:settings.registration.includeCategories</label>
-                            <config>
-                                <type>check</type>
-                                <default>0</default>
-                                <items type="array">
-                                    <numIndex index="0" type="array">
-                                        <numIndex index="0">LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:setting.registration.includeCategories.title</numIndex>
-                                    </numIndex>
-                                </items>
-                            </config>
-                        </TCEforms>
-                    </settings.includeCategories>
-
-                    <!-- end of settings -->
-
-                </el>
-            </ROOT>
-        </sDEF>
-    </sheets>
-</T3DataStructure>

+ 1 - 0
ot_templating/Configuration/Form/CustomFormSetup.yaml

@@ -1,3 +1,4 @@
+# Configures the path of the directory containing the extension's forms
 TYPO3:
   CMS:
     Form:

+ 1 - 1
ot_templating/Configuration/TCA/Overrides/pages.php

@@ -1,6 +1,7 @@
 <?php
 defined('TYPO3_MODE') or die();
 
+// ** Add fields to the backend
 $columns = array (
     'tx_opentalent_structure_id' => array (
         'label' => 'Id de la structure',
@@ -15,7 +16,6 @@ $columns = array (
     $columns
 );
 
-// Décommenter pour afficher le champs dans le backent (editer la page > onglet General)
 \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
     'pages',
     'tx_opentalent_structure_id',

+ 0 - 39
ot_templating/ExtensionBuilder.json

@@ -1,39 +0,0 @@
-{
-    "modules": [],
-    "properties": {
-        "backendModules": [],
-        "description": "Gabarits Typo3 par Opentalent",
-        "emConf": {
-            "category": "templates",
-            "custom_category": "",
-            "dependsOn": "typo3 => 8.7.0-8.7.99\n",
-            "disableLocalization": true,
-            "disableVersioning": false,
-            "skipGenerateDocumentationTemplate": true,
-            "sourceLanguage": "fr",
-            "state": "alpha",
-            "targetVersion": "8.7.0-8.7.99",
-            "version": "0.1.0"
-        },
-        "extensionKey": "ot_templating",
-        "name": "Templating",
-        "originalExtensionKey": "ot_templating",
-        "originalVendorName": "Opentalent",
-        "persons": [
-            {
-                "company": "Opentalent",
-                "email": "olivier.massot@2iopenservice.fr",
-                "name": "Olivier Massot",
-                "role": "Developer"
-            }
-        ],
-        "plugins": [],
-        "vendorName": "Opentalent"
-    },
-    "wires": [],
-    "log": {
-        "last_modified": "2020-04-08 05:01",
-        "extension_builder_version": "8.10.4",
-        "be_user": " (1)"
-    }
-}

+ 20 - 10
ot_templating/Readme.md

@@ -7,19 +7,18 @@ Extension de templating typo3.
 |---|---|
 | Extension key | ot_templating |
 | Vendor | Opentalent |
-| Nom | OtTemplating |
+| Nom | OtTemplating |
 
-Le rôle de cette extension est de fournir des templates (gabarits) de site communs à tous les sites de l'arborescence, 
-ainsi que la configuration Typo3, les assets, et les layouts HTML.
+Le rôle de cette extension est de fournir des modèles (templates) communs à tous les sites de l'arborescence. 
+Cette extension fpournit à la fois une configuration Typo3 commune et des modèles contenant
+chacun des assets et des layouts HTML.
 
 
 ## Comment installer
 
-**Menu Extensions**:  Commencer par s'assurer que les extensions ot_templating et ot_connect sont activées
+**Menu Extensions** : S'assurer que les extensions ot_templating et ot_connect sont installées et activées
 
-**Menu Page**: Pour créer un nouveau site, créer une page, l'éditer et la déclarer page racine (onglet Comportement). Enregistrer, et quitter.
-
-**Menu Gabarit**: Sélectionner la nouvelle page racine, et créer un nouveau gabarit de site. S'assurer que les constants et la configuration restent vides.
+**Menu Gabarit** : Sélectionner la page racine du site, et créer un nouveau gabarit de site. S'assurer que les constants et la configuration restent vides.
 Editer le gabarit, aller à la page 'Inclusions' et inclure les extensions suivantes:
 
 * Fluid Content Elements (fluid_styled_content)
@@ -28,17 +27,28 @@ Editer le gabarit, aller à la page 'Inclusions' et inclure les extensions suiva
 * Templating (ot_templating)
 * Connect (ot_connect)
 
+Ensuite, ajouter les lignes suivantes dans le champs constants:
+
+    plugin.tx_ottemplating {
+        settings {
+            [...]
+        }
+    }
+
+Pour connaitre les variables de configuration à redéfinir ici, voir le fichier `ot_templating/Configuration/TypoScript/constants.txt`
+
 Enregistrer, et quitter.
 
-**Menu Page**: Dans l'onglet Page, éditer la page racine:
+**Menu Page** : Éditer la page racine du site
 
-* Onglet 'Apparence': 
+* Onglet 'Apparence' : 
   * Changer 'Gabarit Backend (seulement cette page)' et mettre 'Columns from selected "Page Layout"'
   * Changer 'Gabarit Backend (sous-page de cette page)' et mettre 'Columns from selected "Page Layout"'
 * Onglet Page layouts:
-  * Changer 'Page Layout - this page' et mettre 'Gabarit 3 Colonnes'
+  * Changer 'Page Layout - this page' et mettre 'Gabarit Accueil'
   * Changer 'Page Layout - subpages ' et mettre 'Gabarit simple'
 * Onglet Page Configuration:
+  * Choisissez un modèle de site et un thème de couleur
   * Personnaliser le site si besoin en fonction des options. Ces paramètres sont facultatifs et viendront remplacer les paramètres par défaut.
 
 Enregistrer, et quitter.

+ 5 - 0
ot_templating/Resources/Private/Forms/Readme.md

@@ -0,0 +1,5 @@
+# Forms
+
+Définition des formulaires conçus pour l'extension
+
+> Voir https://docs.typo3.org/c/typo3/cms-form/8.7/en-us/QuickStart/Index.html

+ 4 - 0
ot_templating/Resources/Private/Language/Readme.md

@@ -0,0 +1,4 @@
+# Languages
+
+Contient les traductions des termes utilisés dans l'extension, en anglais et français (défaut).
+

+ 2 - 0
ot_templating/Resources/Private/Layouts/Readme.md

@@ -2,3 +2,5 @@
 
 Les layouts définissent une architecture de page côté frontend.
 Chaque layout correspond à un template, qui lui configure le backend correspondant.
+
+Les layouts sont classés par modèles de site.

+ 3 - 0
ot_templating/Resources/Private/Partials/Readme.md

@@ -4,3 +4,6 @@ Les partials sont des morceaux de code HTML/Fluid réutilisables dans les
 layouts avec l'instruction suivante:
 
     <f:render partial="partial_name" />
+
+
+Les partials sont classés par modèles de site.

+ 2 - 3
ot_templating/Resources/Private/Readme.md

@@ -1,4 +1,3 @@
-# Layouts
+# Private
 
-Les layouts définissent une architecture de page côté frontend.
-Chaque layout correspond à un template, qui lui configure le backend correspondant.
+Contient les ressources Typo3 qui n'ont pas vocation à être directement partagées avec les utilisateurs.

+ 3 - 0
ot_templating/Resources/Private/Templates/Readme.md

@@ -4,3 +4,6 @@ Les templates configurent le backend:
 
 * les templates contenus dans 'Page' sont liés aux layout et déclarent les options relatives à la page
 * les templates contenus dans 'Content' crééent de nouveaux types de contenu pour le backend
+
+
+> **Important** : les templates sont communs à tous les modèles de site !

二進制
ot_templating/Resources/Public/Icons/relation.gif


二進制
ot_templating/Resources/Public/Icons/tx_otwidgets_domain_model_event.gif


二進制
ot_templating/Resources/Public/Icons/tx_otwidgets_domain_model_organization.gif


二進制
ot_templating/Resources/Public/Icons/tx_widgets_domain_model_event.gif


二進制
ot_templating/Resources/Public/Icons/tx_widgets_domain_model_organization.gif


+ 2 - 3
ot_templating/Resources/Public/Readme.md

@@ -1,4 +1,3 @@
-# Layouts
+# Public
 
-Les layouts définissent une architecture de page côté frontend.
-Chaque layout correspond à un template, qui lui configure le backend correspondant.
+Contient les ressources qui ont vocation à être directement partagées avec les utilisateurs.

+ 5 - 0
ot_templating/Resources/Public/assets/Readme.md

@@ -0,0 +1,5 @@
+# Assets
+
+Les assets contiennent les styles, contenus medias et scripts.
+
+Les assets sont classés par modèles de sites, chaque modèle doit rester indépendant des autres.

二進制
ot_templating/Resources/Public/media/IMG-20181024-WA0054.jpg


二進制
ot_templating/Resources/Public/media/IMG-20181024-WA0056.jpg


二進制
ot_templating/Resources/Public/media/STARMANIA_-_JCDEROUIN_-_012017__174_.jpg


二進制
ot_templating/Resources/Public/media/csm_Concert-Orchestre-d_Harmonie-de-Cluses-25-Janvier-2020_3641__50d08767a7.jpg


二進制
ot_templating/Resources/Public/media/csm_MUSIQUE_FAUCIGNY_181FESTIVAL_ST_GERVAIS_2017-06-25-1321_af76cd8c7c.jpg


二進制
ot_templating/Resources/Public/media/csm_bandeau_3_96d936ab63.jpg


二進制
ot_templating/Resources/Public/media/csm_bandeauohc_1bd35fe9ee.jpg


+ 0 - 2
ot_templating/ext_emconf.php

@@ -3,8 +3,6 @@
 /***************************************************************
  * Extension Manager/Repository config file for ext: "ot_templating"
  *
- * Auto generated by Extension Builder 2020-04-08
- *
  * Manual updates:
  * Only the data in the array - anything else is removed by next write.
  * "version" and "dependencies" must not be touched!

+ 2 - 1
ot_templating/ext_localconf.php

@@ -1,9 +1,10 @@
 <?php
-
 if (!defined('TYPO3_MODE')) {
     die('Access denied.');
 }
 
+// ext_localconf.php contient les directives permettant de configurer le frontend
+
 \FluidTYPO3\Flux\Core::registerProviderExtensionKey(
     'OpenTalent.OtTemplating',
     'Page'

+ 2 - 0
ot_templating/ext_tables.php

@@ -1,6 +1,8 @@
 <?php
 defined('TYPO3_MODE') || die('Access denied.');
 
+// ext_tables.php contient les directives permettant de configurer le backend
+
 call_user_func(
     function()
     {

+ 2 - 0
ot_templating/ext_tables.sql

@@ -1,3 +1,5 @@
+# ext_localconf.sql contient les directives permettant d ajouter des tables et champs à la DB
+
 #
 # Table structure for table 'pages'
 #