2014-09-04 6 views
0

J'essaie de créer une remise de produit dynamique en utilisant les valeurs d'un service Web.L'événement Observateur de Magento ne fonctionne pas et utilise des services Web dans une classe Observateur

J'ai cherché des guides sur Internet à ce sujet et j'ai trouvé que j'avais besoin d'utiliser checkout_cart_product_add_after et checkout_cart_update_items_after.

Cependant, j'ai suivi quelques guides. J'ai créé mon propre module (visible dans le back-office de Magento: Configuration> Avancé> Modules) et un observateur pour ce module. Je n'ai rien créé de plus mais ça ne marche pas. Puisque je peux voir le module dans ce menu, je crois que le problème est sur l'appel de l'observateur/événement.

Voici le config.xml (qui se trouve dans l'application code \ \ Local \ namespace \ MyModule \ etc) pour mon module:

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
     <namespace_MyModule> 
      <version>0.1.0</version> 
     </namespace_MyModule> 
    </modules> 
    <global> 
     <events> 
      <checkout_cart_product_add_after> 
        <observers> 
         <namespace_MyModule_Discount> 
          <class>MyModule/Observer</class> 
          <method>MyModulePriceChange</method> 
         </namespace_MyModule_Discount> 
        </observers> 
       </checkout_cart_product_add_after> 
     </events> 
    </global> 
</config> 

Et ceci est mon observateur (qui se trouve dans l'application code \ \ espace de noms local \ \ MyModule \ Model) pour mon module:

<?php 
    class namespace_MyModule_Model_Observer 
    { 
     public function MyModulePriceChange(Varien_Event_Observer $obs) 
     { 
      // Get the quote item 
      $item = $obs->getQuoteItem(); 
      // Ensure we have the parent item, if it has one 
      $item = ($item->getParentItem() ? $item->getParentItem() : $item); 
      // Load the custom price 
      $price = $this->_getPriceByItem($item); 
      // Set the custom price 
      $item->setCustomPrice($price); 
      $item->setOriginalCustomPrice($price); 
      // Enable super mode on the product. 
      $item->getProduct()->setIsSuperMode(true); 
     } 

     protected function _getPriceByItem(Mage_Sales_Model_Quote_Item $item) 
     { 
      $price = 4; 

      //use $item to determine your custom price. 

      return $price; 
     } 

    } 
?> 

aussi, est-il possible des numéros de télécommunication client savon pour utiliser un webservice intérieur d'un observateur?

J'espère que ma question est claire, merci d'avance pour votre aide.

Répondre

0

Je vois des problèmes avec votre fichier config.xml. Tout d'abord, utilisez le nom de la société et le nom du module en majuscules. namespace_MyModule deviendra votre espace de noms. Vous devez déclarer les modèles vertu de l'article mondiale comme celui-ci:

<models> 
    <mycompany_mymodule> 
     <class>Mycompany_Mymodule_Model</class> 
    </mycompany_mymodule> 
</models> 

Cela indiquera magento que vous souhaitez utiliser mycompany_mymodule pour les modèles dans votre module et le nom de la classe de chaque module commence par Mycompany_Mymodule_Model. Où Mycompany et Mymodule correspondent aux dossiers de votre module: app/code/local/Mycompany/Mymodule. La section modules de config.xml doit également avoir cet espace de noms (Mycompany_Mymodule), le nom correspondant à votre application de fichier/etc/modules et la structure de dossier dans app/code/local.

Les observateurs deviennent alors les éléments suivants (j'ai ajouté le type et la classe a changé):

<observers> 
    <namespace_MyModule_Discount> 
     <type>singleton</type> 
     <class>mycompany_mymodule/Observer</class> 
     <method>MyModulePriceChange</method> 
    </namespace_MyModule_Discount> 
</observers> 

Ensuite, essayez de tester votre méthode d'observation en ajoutant un code comme il die("message").

0

Vous n'avez pas déclaré la balise models dans le fichier config.xml. Un observateur est un modèle après tout et magento ne saura pas où le trouver (que MyModule/Observer vous référencez). Ci-dessous, un exemple de déclaration des modèles tag:

<models> 
    <MyModule> 
     <class>Namespace_Modulename_Model</class> 
    </MyModule> 
</models> 

Oui, vous pouvez faire des appels api de savon à l'intérieur de l'observateur.

Questions connexes