Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-09-2014 16:35:22

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Implémenter un module externe

Bonjour,

je tente d'utiliser le module pour la gestion d'un panier disponible ici : https://github.com/vikey89/ZendCart

Je suis les étapes de l'installation disponible dans le readMe :
    - avec le composer (le dossier est donc rajouté dans le dossier vendor de l'application)
    - j'ajoute le nom du module dans le tableau dans le fichier application.config.php
    - j'ajoute le fichier zendcart.global.php dans le dossier config/autoload

Voila ce qui est dit ensuite pour utiliser le module :

Mettre dans le controller :

Code:

[lang=php]
return new ViewModel(array(
    'items' => $this->ZendCart()->cart(),
    'total_items' => $this->ZendCart()->total_items(),
    'total' => $this->ZendCart()->total(),
));

Le problème est que ça ne fonctionne pas, il ne connait pas la fonction ZendCart() ci dessus.

Comment réaliser dans mon controller IndexController de mon module Application, l'appel au module ZendCart que j'ai intégré.

Merci

Hors ligne

 

#2 29-09-2014 17:37:54

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Implémenter un module externe

Salut, peux-tu montrer ton fichier application.config.php ?

Hors ligne

 

#3 29-09-2014 17:43:47

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Implémenter un module externe

bonjour Orkin,

oui bien sur.

application.config.php :

Code:

[lang=php]
<?php
return array(
    // This should be an array of module namespaces used in the application.
    'modules' => array(
        'Application',
        'News',
        'ZendCart'
    ),

    // These are various options for the listeners attached to the ModuleManager
    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor',
        ),
        'config_glob_paths' => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
    ),
);

Hors ligne

 

#4 30-09-2014 10:46:04

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Implémenter un module externe

Met Application en dernier wink. Je pense que ça vient de là (pas sûr mais faut toujours mettre le module principal en dernier dans le fichier de config).

Hors ligne

 

#5 30-09-2014 12:39:30

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Implémenter un module externe

C'est fait, mais ça n'a rien changé, je n'arrive pas à appeler les méthodes de ZendCart.
Pourtant mon module est bien implémenté, le fichier application.module.php voit bien le ZendCart.

Il faut juste trouvé le moyen de l'utiliser.

Voici le contenu du fichier qui veut récupérer le nombre d'item et le prix total :

DisplayCart.php (Helper)

Code:

[lang=php]
<?php
namespace Application\View\Helper;
use Zend\View\Helper\AbstractHelper;

class DisplayCart extends AbstractHelper
{    
    public function __invoke()
    {
        // Appel de la vue pour l'affichage
        return $this->getView()->partial('Application\Cart\index.phtml', array(
            'total_items' => $this->ZendCart()->total_items(),
            'total' => $this->ZendCart()->total(),           
        ));
    }
}

Voici l'erreur :

Fatal error: Call to undefined method Application\View\Helper\DisplayCart::ZendCart() in C:\wamp\www\zf2test\module\Application\src\Application\View\Helper\DisplayCart.php on line 13

Dernière modification par romsVLM (30-09-2014 12:41:25)

Hors ligne

 

#6 30-09-2014 14:54:15

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Implémenter un module externe

... C'est normal que ça ne fonctionne pas. Si tu nous donne que des bouts de code pas facile de t'aider ... ZendCart() c'est un plugin donc si tu veux l'utiliser en mode $this->ZendCart() dans une aide de vue c'est normal que ça ne fonctionne pas smile. Par contre dans un contrôleur ça fonctionnera.

Hors ligne

 

#7 30-09-2014 15:14:29

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Implémenter un module externe

Alors comment faire pour utiliser le plugin ZendCart dans mon aide de vue ? avec $this->ZendCart() ou autre ?

J'ai besoin dans mon aide de vue de récupérer le nombre d'items dans le panier ainsi que le total, pour l'afficher ensuite.

Merci de ton aide, je n'ai jamais utilisé de plugin

Hors ligne

 

#8 30-09-2014 16:43:34

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Implémenter un module externe

C'est justement pas fait pour ça smile. Créé ta propre classe de view helper en t'inspirant de la façon dont est fait le plugin.

Hors ligne

 

#9 01-10-2014 12:23:36

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Implémenter un module externe

Oui effectivement par le controlleur ça marche.

Par curiosité, peux tu m'en dire un plus sur les plugins, et pourquoi par un helper ça ne marche pas ?

Merci

Hors ligne

 

#10 01-10-2014 12:49:41

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Implémenter un module externe

En gros les plugins ça ne s'utilise que dans les contrôleurs. C'est en gros des morceaux de code que tu peux avoir à utiliser partout et souvent dans tes contrôleurs. Par exemple $this->params() c'est un plugin, $this->identity() aussi. C'est là pour faire des actions plutôt complexes plutôt que de réécrire plein de code. C'est prévu aussi pour déporter la logique dans une classe dédiée à ça.

Donc tu peux faire un helper (ça fonctionne de la même manière qu'un plugin) sauf que ça s'utilise dans les vues smile.

Hors ligne

 

#11 01-10-2014 14:50:22

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Implémenter un module externe

D'accord merci, donc ça pause problème dans mon cas. Je m'explique :

Dans la vue de mon Layout j'ai une navbar avec un élément "Panier" de type dropdown.

Lorsque ma souris passe sur l'élément "Panier", le sous menu s'affiche (une liste).

Dans ce sous-menu, j'aimerai affiché :
  - Le nombre total d'items dans mon panier
  - Le prix total de mon panier

Pour affiché ceci, j'ai besoin d'appeler les 2 méthodes suivant du plugin ZendCart :

Code:

[lang=php]
$this->ZendCart()->total_items(),
$this->ZendCart()->total(),

J'ai donc créé un controller CartController qui va s'occupé des manips sur le panier dont celle pour afficher l'aperçu du panier décrit ci-dessus.

CartController :

Code:

[lang=php]
<?php
namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class CartController extends AbstractActionController
{    
    public function previewcartAction()
    {
        // Appel de la vue pour l'affichage
        return new ViewModel(array(
            'total_items' => $this->ZendCart()->total_items(),
            'total' => $this->ZendCart()->total(),
        ));
    }
}

J'ai également la vue previewcart.phtml qui affiche les infos :

Code:

<p>
  Il y a <?php echo $this->escapeHtml($this->total_items); ?> dans votre panier.<br/>
  Total a payer : <?php echo $this->escapeHtml($this->total); ?> euros
</p>

Donc en gros j'aimerai afficher la vue previewcart.phtml dans mon sous-menu de mon layout.phtml.

Il faudrait donc dans me sous-menu du layout.phtml appelé l'action "previewcartAction" du controller "CartController".

J'ai pensé a passer par une aide de vue, qui s'occuperait d'appeler l'action "previewcartAction" du controller "CartController".

Mais comment faire ceci ? comment dire dans mon aide de vue d'appeler l'action d'un controller ?

Merci.

[EDIT]
j'ai trouvé l'aide de vue Action :

Code:

<li><?php echo $this->action('previewcart', 'cart', null, array()); ?></li>

Mais j'obtiens l'erreur suivante :
Zend\ServiceManager\Exception\ServiceNotFoundException: Zend\View\HelperPluginManager::get was unable to fetch or create an instance for action in C:\wamp\www\zf2test\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php on line 529

Dernière modification par romsVLM (01-10-2014 14:59:14)

Hors ligne

 

#12 01-10-2014 15:00:43

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Implémenter un module externe

Là t'as un problème de conception. Je te fais un bref résumé mais j'ai déjà abordé plusieurs fois le sujet sur ce forum donc avec une petite recherche tu devrais trouver des infos.
Il te faut une couche service et malheureusement le module que tu utilises n'en a pas la logique métier se situe dans le plugin (je n'avais pas été voir le code) du coup pour faire une aide de vue correct il te faut quasiment faire un copier / coller de ce code et de l'adapter pour que ça convienne à ton utilisation.

Donc tu as plusieurs solutions:
- soit tu t'inspires de ce module et tu le réécris de façon à avoir une couche service (qui va s'occuper d'ajouter des éléments à ton panier, en supprimer etc ...) et de ce fait pouvoir l'utiliser dans un plugin ou une aide de vue ou ailleurs. Et du coup le html que te renvoi ton aide de vue contient du JS pour masquer ou non le panier en fonction des actions de l'utilisateur.
- soit tu continues sur ce que tu as fait avec un contrôleur et tu récupères le panier en Ajax du coup plus d'aide de vue simplement un comportement classique (faut juste que tu désactives le rendu du layout dans ton contrôleur si tu retournes du html au lieu du json).

Voila smile.

Hors ligne

 

#13 01-10-2014 15:34:16

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Implémenter un module externe

Merci Orkin, j'ai opté pour la seconde solution avec l'Ajax, ça fonctionne nickel.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages