Commit a9451fd2 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Merge remote-tracking branch 'origin/ll-php8-bs5'

parents c279cc2b 88b26991
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -3,14 +3,13 @@
namespace UnicaenApp;

use Locale;
use Unicaen\Console\Console;
use UnicaenApp\Controller\Plugin\MessengerPluginFactory;
use UnicaenApp\Controller\Plugin\Upload\UploaderPluginFactory;
use UnicaenApp\Mvc\Listener\MaintenanceListener;
use UnicaenApp\Mvc\Listener\ModalListener;
use UnicaenApp\Mvc\View\Http\ExceptionStrategy;
use UnicaenApp\Options\ModuleOptions;
use Laminas\Console\Adapter\AdapterInterface as Console;
use Laminas\Console\Request as ConsoleRequest;
use Laminas\EventManager\EventInterface;
use Laminas\Http\Request as HttpRequest;
use Laminas\Mvc\I18n\Translator;
@@ -19,8 +18,8 @@ use Laminas\ModuleManager\Feature\BootstrapListenerInterface;
use Laminas\ModuleManager\Feature\ConfigProviderInterface;
use Laminas\ModuleManager\Feature\ControllerPluginProviderInterface;
use Laminas\ModuleManager\Feature\ServiceProviderInterface;
use Laminas\Mvc\Console\View\ExceptionStrategy as ConsoleExceptionStrategy;
use Laminas\Mvc\View\Http\ExceptionStrategy as HttpExceptionStrategy;
use Unicaen\Console\View\ExceptionStrategy as ConsoleExceptionStrategy;
use UnicaenApp\Mvc\View\Http\ExceptionStrategy as HttpExceptionStrategy;
use Laminas\ServiceManager\ServiceManager;
use Laminas\Session\Container;
use Laminas\Session\SessionManager;
@@ -149,7 +148,7 @@ class Module implements
     */
    public function bootstrapSession($e)
    {
        if (php_sapi_name() === 'cli') {
        if (Console::isConsole()) {
            return;
        }

@@ -175,7 +174,7 @@ class Module implements
     */
    public function appendSessionRefreshJs(EventInterface $e)
    {
        if ($e->getRequest() instanceof ConsoleRequest) {
        if (Console::isConsole()) {
            return;
        }

@@ -229,7 +228,7 @@ class Module implements
        return [];
    }

    public function getConsoleUsage(Console $console)
    public function getConsoleUsage($console)
    {
        return [
            // command
@@ -247,4 +246,5 @@ class Module implements
            ['--connection', "Facultatif. Identifiant de la connexion Doctrine. Par défaut : 'orm_default'."],
        ];
    }

}
+27 −27
Original line number Diff line number Diff line
@@ -2,39 +2,39 @@
    "name": "unicaen/app",
    "description": "Module de base des applications unicaen",
    "require": {
        "php": ">=7.4",
        "php": ">=7.4 || >=8.0",
        "ext-bcmath": "*",
        "ext-intl": "*",
        "ext-ldap": "*",
        "beberlei/assert": "^2.9",
        "beberlei/assert": "^3.3",
        "mpdf/mpdf": "^8.0",
        "ocramius/proxy-manager": "^2.0",
        "doctrine/doctrine-laminas-hydrator": "^2.0",
        "doctrine/doctrine-orm-module": "^4.0",
        "laminas/laminas-config": "^3.2",
        "laminas/laminas-console": "^2.8",
        "laminas/laminas-eventmanager": "^3.2",
        "laminas/laminas-form": "^2.17",
        "laminas/laminas-http": "^2.10",
        "laminas/laminas-i18n": "^2.9",
        "laminas/laminas-i18n-resources": "^2.6",
        "laminas/laminas-json": "^3.2",
        "laminas/laminas-ldap": "^2.10",
        "laminas/laminas-log": "^2.10",
        "laminas/laminas-mail": "^2.10",
        "laminas/laminas-mvc": "^3.1",
        "laminas/laminas-mvc-console": "^1.2",
        "laminas/laminas-mvc-i18n": "^1.1",
        "doctrine/doctrine-orm-module": "^5.0",
        "doctrine/dbal": "^3.2",
        "laminas/laminas-config": "^3.7",
        "laminas/laminas-eventmanager": "^3.4",
        "laminas/laminas-form": "^3.1",
        "laminas/laminas-http": "^2.15",
        "laminas/laminas-i18n": "^2.13",
        "laminas/laminas-i18n-resources": "^2.8",
        "laminas/laminas-json": "^3.3",
        "laminas/laminas-ldap": "^2.12",
        "laminas/laminas-log": "^2.15",
        "laminas/laminas-mail": "^2.15",
        "laminas/laminas-mvc": "^3.3",
        "laminas/laminas-mvc-i18n": "^1.3",
        "laminas/laminas-mvc-plugin-fileprg": "^1.2",
        "laminas/laminas-mvc-plugin-flashmessenger": "^1.1",
        "laminas/laminas-mvc-plugin-identity": "^1.1",
        "laminas/laminas-mvc-plugin-prg": "*",
        "laminas/laminas-navigation": "^2.9",
        "laminas/laminas-serializer": "^2.9",
        "laminas/laminas-servicemanager": "^3.4",
        "laminas/laminas-session": "^2.8",
        "laminas/laminas-view": "^2.11",
        "laminas/laminas-dependency-plugin": "^2.1"
        "laminas/laminas-mvc-plugin-flashmessenger": "^1.5",
        "laminas/laminas-mvc-plugin-identity": "^1.3",
        "laminas/laminas-mvc-plugin-prg": "^1.5",
        "laminas/laminas-navigation": "^2.13",
        "laminas/laminas-serializer": "^2.12",
        "laminas/laminas-servicemanager": "^3.10",
        "laminas/laminas-session": "^2.12",
        "laminas/laminas-text": "^2.9",
        "laminas/laminas-view": "^2.16",
        "laminas/laminas-dependency-plugin": "^2.2",
        "unicaen/console": "dev-main"
    },
    "require-dev": {
        "laminas/laminas-test": "^3.2",
+8 −3
Original line number Diff line number Diff line
@@ -2,11 +2,10 @@

namespace UnicaenApp;

use Laminas\Mvc\Console\Router\Simple;
use Laminas\ServiceManager\Factory\InvokableFactory;
use Unicaen\Console\Router\Simple;
use UnicaenApp\Controller\CacheControllerFactory;
use UnicaenApp\Controller\ConsoleController;
use UnicaenApp\Controller\ConsoleControllerFactory;
use UnicaenApp\Controller\InstadiaControllerFactory;
use UnicaenApp\DeveloperTools\MessageCollectorService;
use UnicaenApp\DeveloperTools\MessageCollectorServiceFactory;
@@ -56,6 +55,7 @@ use UnicaenApp\View\Helper\Upload\UploaderHelperFactory;
use UnicaenApp\View\Helper\UserProfileSelect;
use UnicaenApp\View\Helper\UserProfileSelectFactory;


return [
    'router'          => [
        'routes' => [
@@ -266,6 +266,9 @@ return [
            ],
        ],
    ],



    'console'         => [
        'router'       => [
            'routes' => [
@@ -296,6 +299,9 @@ return [
            'display_exceptions'       => true,
        ],
    ],



    'service_manager' => [
        'factories'          => [
            'translator'                  => 'Laminas\I18n\Translator\TranslatorServiceFactory',
@@ -481,7 +487,6 @@ return [
        'factories'    => [
            'UnicaenApp\Controller\Cache'    => CacheControllerFactory::class,
            'UnicaenApp\Controller\Instadia' => InstadiaControllerFactory::class,
            ConsoleController::class         => ConsoleControllerFactory::class,
        ],
    ],

+4 −487

File changed.

Preview size limit exceeded, changes collapsed.

+160 −0
Original line number Diff line number Diff line

Instadia
========

Instadia est un système de messagerie instantanée persistant contextuel.
Cela signifie que :

-   Les messages sont stockés en base de données
-   Chaque fil de messagerie peut être lié à un contexte particulier.
-   Il est possible de dialoguer en temps réel avec des interlocuteurs.
-   Les messages restent visibles sans pouvoir être effecés

Instadia peut être intégré très simplement au coeur d\'une application
pour, par exemple, suivre un dossier ou commenter tel ou tel item.

L\'intérêt est que :

-   les informations de suivi sont visibles dans leur contexte. Il n\'y
    a pas besoin d\'aller chercher l\'historique d\'une conversation
    dans sa boite mail.
-   les informations sont PARTAGÉES. Un nouvel utilisateur peut voir ce
    qui c\'est dit précédemment

\<WRAP center round important 60%\> Dans Instadia, chaque fil de
conversation correspond à une rubrique et éventuellement à une
sous-rubrique. Par exemple dans Uniform nous avons une rubrique
formation pour signaler qu\'on parle de formation, et une sous-rubrique
par code de formation. Ainsi nous avons bien un fil de discussion par
formation. \</WRAP\>

Instadia est intégré à UnicaenApp. Les préresuis pour l\'utiliser sont
les suivants :

-   votre application doit reposer sur une base de données
-   vous devez utiliser UnicaenAuth (uniquement si vous voulez
    authentifier vos utilisateurs)
-   une table, nommée instadia, doit être créée. Vous en trouverez la
    structure ci-dessous (code pour Oracle):

``` {.sql}
CREATE
  TABLE INSTADIA
  (
    ID            NUMBER (*,0) NOT NULL ,
    USER_ID       NUMBER (*,0) ,
    RUBRIQUE      VARCHAR2 (80 CHAR) NOT NULL ,
    SOUS_RUBRIQUE VARCHAR2 (80 CHAR) ,
    HORODATAGE    DATE NOT NULL ,
    CONTENU       VARCHAR2 (3000 CHAR) NOT NULL
  )
  LOGGING ;
ALTER TABLE INSTADIA ADD CONSTRAINT INSTADIA_PK PRIMARY KEY ( id ) ;

ALTER TABLE INSTADIA ADD CONSTRAINT INSTADIA_USER_FK FOREIGN KEY ( USER_ID )
REFERENCES "USER" ( ID ) ON DELETE SET NULL NOT DEFERRABLE ;

CREATE SEQUENCE INSTADIA_ID_SEQ;
```

Une aide de vue `UnicaenApp\View\Helper\InstadiaViewHelper`{.php} a été
créée pour simplifier l\'intégration. En voici un exemple d\'utilisation
:

``` {.php}
/* Dans une vue */

<?php echo $this->instadia()->setRubrique('essai')->setTitle('Mon test'); ?>

```

Voici le résultat (un clic sur le lien ouvre la fenêtre de CHAT) :
![](/develop/unicaen2/moduleunicaenunicaenapp/viewhelpers/instadia.png){.align-center}

Et voici maintenant ce qu\'on peut faire avec le Widget :

Options
-------

Nom (dataset)   Nom (Json)      Type      Valeur par défaut        Description
  --------------- --------------- --------- ------------------------ --------------------------------------------------------------------------------------------------------------
user-id         userId          integer   undefined                ID de l\'utilisateur courant (facultatif)
user-label      userLabel       string    \'Anonyme\'              Nom de l\'utilisateur (ou undefined)
user-hash       userHash        string    undefined                Hash permettant de récupérer le Gravatar de l\'utilisateur courant (formule : md5(strtolower(trim(\$email)))
refresh-delay   refreshDelay    integer   2000                     Délai de rafraichissement de la fenêtre des messages (en millisecondes)
title           title           string    Messagerie instantanée   Titre de la fenêtre de Chat et nom du lien
rubrique        rubrique        string    undefined                Rubrique
sousRubrique    sous-rubrique   string    undefined                Sous-rubrique
url             url             string    undefined                URL de communication avec le serveur
information     information     string    undefined                Message d\'information sur la fenêtre de Chat
width           width           integer   500                      Largeur de la fenêtre de Chat
height          height          integer   700                      Hauteur de la fenêtre de Chat
readOnly        read-only       boolean   false                    Fenêtre de Chat en simple visualisation
# Widgets Javascript

Événements
----------

Les événements permettent de réagir à des changements d\'état. Les
closures ou les fonctions qui seront appelées se verront transmettre
deux arguments :

1.  l\'événement en lui-même
2.  l\'objet instadia (ce qui permet de le manipuler).

### Liste des événements

Événement    Description
  ------------ -------------------------------
afficher     affiche la fenêtre de Chat
cacher       ferme la fenêtre de Chat
envoyer      Lorsqu\'un message est envoyé
addMessage   Lorsqu\'un message est ajouté

Méthodes
--------

Instadia comporte un certain nombre de méthodes :

Nom              Arguments                   Valeur de retour   Description
  ---------------- --------------------------- ------------------ ----------------------------------------------------------------------------------------------------------
afficherCacher   Aucun                       this               Permet d\'afficher la fenêtre de Chat si elle n\'est pas affichée ou de la masquer si elle est affichée.
estAffiche       Aucun                       boolean            Retourne true si elle est affichée, false sinon
afficher         Aucun                       this               Affiche le Chat
cacher           Aucun                       this               Masque le Chat
envoyer          Aucun                       this               Envoie le message saisi
addMessage       user, horodatage, content   this               Poste un nouveau message user = id,label,hash
getMessage       Aucun                       string             Retourne le texte en cours de saisie
setMessage       string                      this               Change le texte en cours de saisie
getUser          Aucun                       id,label,hash      retourne l\'utilisateur courant

Avancé
======

Un service Instadia (` $sl->get('instadia');`{.php}) permet de :

-   lister les messages :
    `getMessages($rubrique = null, $sousRubrique = null)`{.php}
-   Sauvegarder un message :
    `save(UnicaenApp\Entity\Db\Instadia $instadia)`{.php}
-   Créer un Hash pour un utilisateur donné :
    `makeHash(UnicaenAuth\Entity\Db\AbstractUser $user)`{.php}
-   Réagir au post d\'un nouveau message selon la rubrique :
    `onSend( $rubrique, $sousRubrique, $callback)`{.php}

Système de callback pour générer une action suite à un post de message
----------------------------------------------------------------------

Ceci est une portion de code à placer dans la méthode onBootstrap de la
classe Module de votre application.

``` {.php}

$sm = $e->getApplication()->getServiceManager();
/** @var \UnicaenApp\Service\InstadiaService $instadia */
$instadia = $sm->get('instadia');
$instadia->onSend('maRubrique', null, function( \UnicaenApp\Entity\Db\Instadia $instadia){
    /* DO WHAT YOU WANT */
});

```
Loading