THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

Je ne vois pas comment generer ma facture pour l'attacher a l'email
mais la je seche

une aide pour debrousailler
Merci

Last edited by zzuutt (21-04-2015 15:12:12)

Offline


en fait je bloque avec la fonction renderRaw

class OnEventListener extends BaseFrontController
{
    public function sendInvoicGts(OrderEvent $event)
    {
        $order = $event->getOrder();
        $order_id = $order->getId();
        if ($order->isPaid('true')) { 
            $invoice_pdf = $this->renderRaw(
                ConfigQuery::read('pdf_invoice_file', 'invoice'),
                array(
                    'order_id' => $order_id
                ),
                TemplateHelper::getInstance()->getActivePdfTemplate()
            );
       ....
       }
    }
    public static function getSubscribedEvents()
    {
        return [
            TheliaEvents::ORDER_UPDATE_STATUS  => ['sendInvoicGts', 129]
        ];
    }
}

FatalErrorException: Error: Call to a member function get() on a non-object in /home/zzuutt/www/_shop_/core/lib/Thelia/Controller/BaseController.php line 172

Last edited by zzuutt (21-04-2015 15:15:09)

Offline


Personne pour me dire ou est ma connerie ??

Offline


C'est un contrôleur cette classe ?


OpenStudio Toulouse

Offline


non
suite a l'evenement  paid  je genere la facture pdf pour l'attache a l'email

Offline


Salut,
déjà, je te déconseille d'étendre un contrôleur pour en faire un event listener, c'est sale et absolument pas nécessaire smile

Pour commencer, ton listener doit implémenter l'interface

Symfony\Component\EventDispatcher\EventSubscriberInterface

pour être valide.

Pour résoudre ton problème, il te suffit d'injecter le parser dans ton service, puis de l'utiliser:

<service id=".." class=".." scope="request">
   <argument type="service" id="thelia.parser" />
   <tag name="kernel.event_subscriber />
</service>
<?php

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Template\ParserInterface;
...

class OnEventListener implements EventSubscriberInterface
{
   protected $parser;

   public function __construct(ParserInterface $parser)
   {
        $this->parser = $parser;
   }

   public function sendInvoicGts(OrderEvent $event)
   {
       ...
       $this->parser->setTemplateDefinition(TemplateHelper::getInstance()->getActivePdfTemplate());
       $pdf = $this->parser->render(ConfigQuery::read('pdf_invoice_file', 'invoice'), array('order_id' => $order_id));
       ...
   }
}

Voilà voilà smile

PS: si tu veux quand même utiliser le BaseFrontController, il te suffit d'injecter le container dans listener avec une method-call:

<service id=".." class="..">
   <call method="setContainer">
      <argument type="service" id="service_container" />
   </call>
   <tag name="kernel.event_subscriber />
</service>

Last edited by lovenunu (22-04-2015 09:46:31)

Offline


GRAND Merci Lovenunu

lovenunu wrote:
<service id=".." class=".." scope="request">
   <argument type="service" id="thelia.parser" />
   <tag name="kernel.event_subscriber />
</service>

l'injection je l'avais bien faite

lovenunu wrote:
       ...
       $this->parser->setTemplateDefinition(TemplateHelper::getInstance()->getActivePdfTemplate());
       $pdf = $this->parser->render(ConfigQuery::read('pdf_invoice_file', 'invoice'), array('order_id' => $order_id));
       ...

C'est cette partie que je ne trouvais pas
a force de chercher je suis parti dans tous les sens et fait n'importe quoi sad

lovenunu wrote:

PS: si tu veux quand même utiliser le BaseFrontController, il te suffit d'injecter le container dans listener avec une method-call:

Non je n'y tiens pas

Last edited by zzuutt (22-04-2015 13:55:37)

Offline


Bon avec ce code je recois bien la facture en pdf

lovenunu wrote:

c'est sale et absolument pas nécessaire

Pas trop sale ???


namespace SendInvoiceGts\EventListeners;

use SendInvoiceGts\SendInvoiceGts;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Template\ParserInterface;
use Thelia\Core\Template\TemplateHelper;
use Thelia\Core\Event\Order\OrderEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\Event\PdfEvent;

use Thelia\Action\Pdf;

class EventListener implements EventSubscriberInterface
{
    /**
     * @var ParserInterface
     */
    protected $parser;

    /**
     * @var MailerFactory
     */
    protected $mailer;

    /**
    * @param ParserInterface $parser
    */
    public function __construct(ParserInterface $parser, MailerFactory $mailer)
    {
        $this->parser = $parser;
        $this->mailer = $mailer;
    }
    
    public function getDispatcher()
    {
        return $this->container->get('event_dispatcher');
    }

    public function getInvoicePDF($order_id)
    {
        $this->parser->setTemplateDefinition(TemplateHelper::getInstance()->getActivePdfTemplate());
        $html = $this->parser->render(ConfigQuery::read('pdf_invoice_file', 'invoice').'.html', array('order_id' => $order_id));

        $pdfEvent = new PdfEvent($html);

        $action = new Pdf();
        $action->generatePdf($pdfEvent);

        $generatedPdf = $pdfEvent->getPdf();

        return $generatedPdf;
    }

    public function sendInvoiceGts(OrderEvent $event)
    {
        $order = $event->getOrder();
        $order_id = $order->getId();
        if ($order->isPaid('true')) {
            $invoice_pdf = $this->getInvoicePDF($order_id);
            
            $Message = MessageQuery::create()->filterByName('send_invoice_gts')->findOne();
       .....
  }

Last edited by zzuutt (22-04-2015 14:51:59)

Offline


A ce que je vois, la methode getDispatcher ne fonctionne pas, car tu n'injectes pas le container.

De plus, le dispatcher est disponible directement de l'event, il y est injecté. Tu as juste à faire:

$event->getDispatcher();

Voilà voilà smile

Offline


Merci
mais en fait elle ne sert pas
je la supprime

Offline


Bonjour, je réouvre ce topic très interressant pour le développement de mon plugin.
Je cherche à générer une facture quand on a choisit un moyen de paiement
Je compter utiliser :

public function pay(Order $order){
        $order_id = $order->getId();
        $order->generateOrderPdf($order_id, ConfigQuery::read('pdf_invoice_file', 'invoice'));
}

Mais là je vois qu'on utilise d'autre méthode bien spécifique.
Quelqu'un peut il m'aiguiller ?


W-Prog - Développement site internet

Offline


generateOrderPdf() est une méthode de la classe BaseController, pas de Order.

Que veux-tu faire exactement ?


OpenStudio Toulouse

Offline


Ah oui d'accord,
Je souhaite joindre la facture quand au mail de confirmation de commande si la commande est payé
J'ai implémenté la fonction dans l'écouteur SendPaymenyConfirmationEmail.php

$invoice_pdf = $this->getInvoicePDF($order_id);
                
                $this->mailer->sendEmailToCustomer(
                    'order_confirmation_credit',
                    $order->getCustomer(),
                    [
                        'order_id' => $order->getId(),
                        'order_ref' => $order->getRef(),
// Joindre la facture par ici

                    ]
                );

W-Prog - Développement site internet

Offline


// Joindre la facture par ici

Non.

Si tu veux joindre un fichier, tu ne peux pas utiliser les méthodes de convénience de MailerFactory. Il te faut utiliser MailerFactory::createMessage() pour obtenir un Swift_Message, (regarde comment sendEmailToCustomer est codée), et regarder la doc de SwiftMailer pour voir comment y ajouter un attachement.


OpenStudio Toulouse

Offline


Je viens de trouver grace à un autre topic
http://thelia.net/forum/viewtopic.php?id=11689

Ca fonctionne nickel, je poste mon code :

public function sendConfirmationEmail(OrderEvent $event)
    {

        // Si paiement par crédit et payé
        if ($event->getOrder()->getPaymentModuleId() === Credit::getModuleId()) {
            
            if ($event->getOrder()->isPaid()) {
                $order = $event->getOrder();
                $order_id = $order->getId();

                $generatedPdf = $this->getInvoicePDF($order_id);
                
                $fichier_nom="invoice_".$order_id.".pdf";
                $handle= fopen($fichier_nom, "c+");
                fwrite($handle, $generatedPdf);
                fclose($handle);
                $attachment = \Swift_Attachment::fromPath($fichier_nom);
                
                $messageParameters=[
                        'order_id' => $order->getId(),
                        'order_ref' => $order->getRef()
                    ];

                $from = array(ConfigQuery::getStoreEmail() => ConfigQuery::getStoreName());
                $customer = $order->getCustomer();
                $to= [ $customer->getEmail() => $customer->getFirstname()." ".$customer->getLastname() ];
                
                $message = $this->mailer->createEmailMessage("order_confirmation_credit",$from,$to,$messageParameters)->attach($attachment);
                $this->mailer->send($message);
                
                unlink($fichier_nom);
            }
        }
    }

Maintenant, je cherche à intercepter le paiement pour envoyer directement le mail.
Je vais consulter le module paybox comme indiqué,


W-Prog - Développement site internet

Offline


Je reviens sur l'interception de l'évènement.
J'essaie d'utiliser dans mon fichier ppal de module mais l'objet event n'existe pas.

$event->getDispatcher()->dispatch(TheliaEvents::ORDER_SEND_CONFIRMATION_EMAIL, $event);

Comme dans le module paybox
J'ai du manquer une étape.


W-Prog - Développement site internet

Offline


C'est dans un event listener que tu peux t'abonner à un événement.


OpenStudio Toulouse

Offline


Oui je comprends.
Et donc l'évènement en question est le choix de cette méthode de paiement spécifique et pas ORDER_SEND_CONFIRMATION_EMAIL n'est-ce pas ?
Mais dans ce cas, quelle est-elle et peut-on trouver un exemple d'implémentation quelque part ?


W-Prog - Développement site internet

Offline


Je ne comprend pas la question.

Regarde ici comment marche un Event Listener : http://doc.thelia.net/en/documentation/ … tions.html


OpenStudio Toulouse

Offline


Bonjour,

Je me suis plongé dans ce post interessant,

Je bloque sur :

$this->parser->setTemplateDefinition(theliaTemplateHelper::getInstance()->getActivePdfTemplate());

qui fonctionne avec :

use Thelia\Core\Template\theliaTemplateHelper;

et non pas

use Thelia\Core\Template\TemplateHelper;

Pour le moment, getinstance() me donne Call to undefined method Thelia\Core\Template\TheliaTemplateHelper::getInstance()

Pourtant, je ne vois pas ou est le soucis dans mon code...

J'ai loupé quelque chose ?

Offline


TheliaTemplateHelper n'est pas un singleton, tu fais une confusion avec la classe TemplateHelper, qui a été dépréciée en 2.2.0.alpha1, et supprimée depuis.

Donc, pour récupérer le template PDF actif, tu dois utiliser le service TheliaTemplateHelper. Dans un contrôleur qui extends BaseControler, tu le récupères avec $this->getTempletHelper();

Dans un EventListener, il te faut injecter le service "thelia.template_helper".


OpenStudio Toulouse

Offline


Merci, j'ai réussi avant de lire ta réponse avec :

        $TheliaTemplateHelper = new TheliaTemplateHelper();
        $this->parser->setTemplateDefinition($TheliaTemplateHelper->getActivePdfTemplate());
        $html = $this->parser->render(ConfigQuery::read('pdf_invoice_file', 'invoice').'.html', array('order_id' => $order_id));