Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 :
[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
Salut, peux-tu montrer ton fichier application.config.php ?
Hors ligne
bonjour Orkin,
oui bien sur.
application.config.php :
[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
Met Application en dernier . 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
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)
[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
... 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 . Par contre dans un contrôleur ça fonctionnera.
Hors ligne
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
C'est justement pas fait pour ça . Créé ta propre classe de view helper en t'inspirant de la façon dont est fait le plugin.
Hors ligne
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
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 .
Hors ligne
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 :
[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 :
[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 :
<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 :
<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
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 .
Hors ligne
Merci Orkin, j'ai opté pour la seconde solution avec l'Ajax, ça fonctionne nickel.
Hors ligne