THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonsoir à tous,

Je suis nouveau dans la communauté de Thelia, je test cette bêta 2 qui m'interesse fortement smile pour par la suite quitter ce prestashop qui m'exaspère hmm

J'ai cherché dans les sources (en attendant une documentation complète smile) la classe qui gère la vérification si on est connecté et j'ai trouvé SecurityContext. J'aimerais dans un module utilisé cette classe pour vérifier si la personne est connecté et si elle est connecté en tant qu'administrateur mais un module hérite de BaseModule. Donc en suivant l'appel de l'hérite j'en déduis qu'il faut récupérer le contexte de sécurité simplement comme ceci :

$this->getSecurityContext()->hasAdminUser();

Est-ce exact ?

Je n'arrive pas a tester car impossible d'activer le module, je ne le vois pas dans l'administration hmm (j'ai suivi cette doc http://thelia.github.io/documentation/m … ndex.html) (Je ne sais pas si la création de module est implémenter à 100% dans cette bêta)

Merci d'avance.

  • manu
  • faï tot petar miladiu

Offline


Bonjour,

C'est bien dans le SecurityContext que tu vas pouvoir récupérer les utilisateurs connectés (client ou admin).

Ton module contient le container tu peux donc très facilement récupérer le security context (sauf dans le constructeur) :

$securityContext = $this->getContainer()->get('thelia.securityContext');

La parti activation des modules est bonne normalement, si il ne le reconnaît peut être que l'architecture d'un module n'est pas bonne. Le moteur va parcourir tous les modules à la recherche du fichier MonModule/Config/module.xml et va construire l'enregistrement en base à partir de ce fichier.


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Merci pour ta réponse. Donc finalement pour récupérer un contexte c'est toujours la même chose ? Il faut juste connaître les différents contexte smile (vivement la doc tongue)

Par contre dans l'admin (modules).
PAYMENT MODULES à bien 2 lignes mais le titre du module n'apparaît pas (je peux activer/désactiver, quand je fais éditer j'ai Unable to load template file 'module/update/3.html' et 4.html pour l'autre), je ne sais pas si ça vient de mon install ou si c'est un bug général.

Last edited by Rtransat (29-10-2013 11:46:28)

Offline


Bon et bien j'ai réesséyé et sans succès pour voir mon module dans l'administration hmm

Voici ce que j'ai :

MonModule/Config/module.xml

<?xml version="1.0" encoding="UTF-8"?>
<module>
    <fullnamespace>Rtransat\Module\MonModule</fullnamespace>
    <descriptive locale="en_US">
        <title>my module</title>
    </descriptive>
    <descriptive locale="fr_FR">
        <title>mon module</title>
    </descriptive>
    <version>1.0</version>
    <author>
        <name>Rtransat</name>
        <email>test@test.com</email>
    </author>
    <type>classic</type>
    <thelia>2.0.0</thelia>
    <stability>alpha</stability>
</module>

MonModule/MonModule.php

<?php
namespace Rtransat\Module\MonModule;

use Thelia\Module\BaseModule;

class MonModule extends BaseModule
{
    public function install()
    {

    }

    public function destroy()
    {

    }
}

Est-ce correct ? Si oui et bien j'ai plus qu'à refaire une nouvelle installation hmm

  • manu
  • faï tot petar miladiu

Offline


Bonjour,

Tu peux m'indiquer ton architecture depuis le répertoire local/module ?

Tu as :

Rtransant
  Module
    MonModule

ou bien

Module
  MonModule

http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


J'ai la deuxième structure. En effet je pensais que le namespace n'influait pas sur le path. Donc c'est mieux de partir sur un namespace Module\MonModule ? Ou rien empêche une structure Pseudo/Module/NomModule ?

Pour le coup je ne peux pas tester j'ai cloné le dernier push et j'ai des erreurs php dans le log hmm (Voir mon dernier ticket sur github)

  • manu
  • faï tot petar miladiu

Offline


Le namespace doit être identique à ton architecture et il faut avoir une architecture de ce type :

Module
  Module.php

la classe principale du projet doit avoir le même nom que ton répertoire. Inspire toi des modules déjà présents.

Pour les accès sur windows, je ne connais pas les subtilités de ce système donc à première vue ça va être compliqué de te répondre. Il me semble bien qu'il y a une notion de droit.


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Bon je reviens ici, j'ai réussi à installer Thelia sans soucis cette fois smile.

Je repars donc sur mon module mais toujours la même chose, je ne le vois pas dans l'admin et donc impossible de l'activer hmm (J'ai même fait un composer dump-autoload au cas ou mais rien)

Je vois pourtant le nom de mon module dans http://ndd.fr/admin/configuration/adminLogs (d'ailleurs les modules de paiement n'on aucun nom, c'est vide).

Et dans le log  bien entendu je n'ai rien concernant mon module

Module/Module.php

<?php
namespace Module;

use Thelia\Module\BaseModule;

class Module extends BaseModule
{
    public function install()
    {

    }

    public function destroy()
    {

    }
}

Module/Config/module.xml

<?xml version="1.0" encoding="UTF-8"?>
<module>
    <fullnamespace>Module\Module</fullnamespace>
    <descriptive locale="en_US">
        <title>Test module</title>
    </descriptive>
    <descriptive locale="fr_FR">
        <title>Test module</title>
    </descriptive>
    <version>1.0</version>
    <author>
        <name>Rtransat</name>
        <email>test@test.com</email>
    </author>
    <type>classic</type>
    <thelia>2.0.0</thelia>
    <stability>alpha</stability>
</module>

Edit : Par miracle je viens de voir qu'il est présent. Par contre je ne pourrais pas dire le comment du pourquoi lol. Par la même occasion, une doc complète sur les modules va arriver par la suite ? (faites que oui, ne faites pas une doc comme la pseudo doc de prestashop s'il vous plait tongue). Par exemple ici, je voudrais dans toute la partie front office du site que le module vérifie si un admin est connecté ou pas, mais je ne sais pas quelle méthode de la classe permet de faire ça, d'ailleurs je ne sais pas si c'est possible tout court.

Last edited by Rtransat (05-11-2013 21:53:57)

Offline


Par exemple ici, je voudrais dans toute la partie front office du site que le module vérifie si un admin est connecté ou pas, mais je ne sais pas quelle méthode de la classe permet de faire ça, d'ailleurs je ne sais pas si c'est possible tout court.

Pas penché encore sur les modules de Thelia 2. Ceci dit, ce que tu souhaites faire est très simple à mettre en place.

Si la table session n'existe pas déjà, tu la crées.
Si elle existe, c'est qu'elle est déjà alimentée.
Sinon pour l'alimenter, le plus simple c'est d'avoir un point d'entrée qui soit appelé quelque soit la page (front ou back end).
Ce script regarde la session active et met à jour la table en question.
Pour savoir qui est connecté, tu affiches toutes les sessions dont la dernière mise à jour remonte à mon de x minutes (où x minutes est laissé à ta propre appréciation).

Donc pour rappel il faut savoir :

- insert/update/delete/select une table : avec propel apparemment.
- utiliser un point d'entrée (une sorte de hook à la prestashop) qui appellera script.
- afficher la liste des connectés dans l'admin.

Me semble pas insurmontable comme affaire.


Plugins : Modèles Thelia | Boucle libre | Rubriques déclinables en produits | Colissimo Access/Expert

Offline


Tu n'a pas besoin d'un module pour savoir en front  si un admin est connecté. Tu peux utiliser la boucle auth pour ça.

http://doc.thelia.net/documentation/loop/auth.html


OpenStudio Toulouse

Offline


Ça paraît bien compliqué juste pour utiliser les méthodes de SecurityContext hmm

Offline


1) Tu peux dans tes templates utiliser la boucle auth pour détecter si un admin est connecté.

2) Tu peux utiliser ce code dans ton module pour savoir si un admin est connecté:

if ($this->getContainer()->get('thelia.securityContext')->hasAdminUser()) { ... }

Qu'est-ce qui est compliqué ?


OpenStudio Toulouse

Offline


La solution d'alexandre wink.

Je comptais utiliser

if ($this->getContainer()->get('thelia.securityContext')->hasAdminUser()) { ... }

car je n'ai pas encore regarder du côté des boucles dans un module.

Ce que j'aimerais savoir c'est ou écrire ce fameux code pour que ça "tourne en fond" tout le temps ?

Il y a une méthode particulière dans la class de notre plugin qui permet de faire ça ? En gros une méthode qui est exécuter à chaque chargement de page niveau front office.

  • manu
  • faï tot petar miladiu

Offline


tout dépend de où tu en as besoin :-)

Tu peux l'écrire depuis une classe qui contient le container de Thelia.


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Tu veux faire quoi exactement ?


OpenStudio Toulouse

Offline


Je voudrais en fait, lorsque le module est activé et qu'on navigue sur le front office en étant pas admin afficher une page différente sur la home pour empêcher la navigation (une maintenance finalement). Donc au final si la personne va sur ndd.com on affiche la page, si il va sur ndd.com/monproduit.html redirection sur la home avec la page de maintenance.

Last edited by Rtransat (06-11-2013 18:42:38)

Offline


Il te suffit de mettre au début du fichier monproduit.html un appel à la fonction Smarty check_auth (pas encore documentée) :

{check_auth role="ADMIN" login_tpl="maintenance"}

Ca veut dire: si aucun utilisateur admin n'est connecté, redirige le visiteur sur le template maintenance.html.

Tu devra bien sûr créer ce template maintenance.html dans le dossier templates/default


OpenStudio Toulouse

Offline


Merci de ta réponse, mais comment faire ça sous forme de module ? Je n'ai pas envie de modifier chaque template de mon thème pour y mettre ce code, je veux le faire via un module. Il n'y a pas de méthode dans la classe d'un module qui est exécuté tout le temps ?

  • manu
  • faï tot petar miladiu

Offline


Rtransat wrote:

Merci de ta réponse, mais comment faire ça sous forme de module ? Je n'ai pas envie de modifier chaque template de mon thème pour y mettre ce code, je veux le faire via un module. Il n'y a pas de méthode dans la classe d'un module qui est exécuté tout le temps ?

Tu n'as qu'un seul fichier à modifier, c'est le fichier layout.tpl

En fait tout les fichier de ton thème hérite de ce fichier, tu peux faire de l'héritage dans les thèmes, la documentation de smarty l'explique bien : http://www.smarty.net/docs/en/language. … xtends.tpl


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Le truc c'est que je voudrais faire ça sous forme de module, pour ne pas à devoir modifier le fichier quand je veux enlever la maintenance. Et par la même occasion par la suite ajouter des options dans l'admin pour par exemple afficher le texte que l'on souhaite, etc.

  • manu
  • faï tot petar miladiu

Offline


A ce moment là, il faut créer un eventListener qui va écouter un certains message dans lequel tu vas pouvoir tester si un admin est connecté et faire une redirection sur la maintenance avec un code http 307 (temporary redirect).

Il te faut donc une classe de type Action, il y a un peu de doc réalisé, elle n'est pas complète mais devrait te suffire pour le moment : http://doc.thelia.net/documentation/mod … tions.html

l'event à intercepter est kernel.request et tu auras une classe qui devrait ressembler à ça (à placer dans le répertoire Action de ton module, si il n'existe pas il faut le créer) :

namespace TonModule\Action; //à adapter suivant ton namespace.

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Thelia\Action\BaseAction;

class Maintenance extends BaseAction implements EventSubscriberInterface
{
    public function onKernelRequest(GetResponseEvent $event)
    {
         //test admin connecté et redirection.
    }

   public static function getSubscribedEvents()
   {
        return array(
            KernelEvents::REQUEST => array('onKernelRequest', 0)
        );
   }
}

Et ensuite compléter ton fichier Config/config.xml comme indiqué dans la documentation.


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Tu peux aussi écrire une boucle dans ton module, qui fera globalement la même chose que check_auth si ta maintenance est activée, et permettra (en fonction des paramètres qu'on lui passe, par exemple) de récupérer l'information que tu aura défini dans l'admin.

Tu place cette boucle en tête de layout.tpl, et voilà.


OpenStudio Toulouse