2010-06-30 5 views
14

Ich versuche einen Beobachter zu schreiben, der Auftragsdaten exportiert, wenn eine Bestellung aufgegeben wird. Ich habe noch keine Module geschrieben. Basiert meine Implementierung auf diesem Artikel: http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_methodmagento sales_order_place_after observer

bis jetzt versuche ich nur etwas Dummy-Code zu aktivieren, um in eine Datei zu schreiben. In meinem Protokoll wird nichts angezeigt, und die Datei wird nicht geändert. Der Apache-Benutzer verfügt über die Berechtigung für das Verzeichnis. Ich habe das Konfigurations-Caching in den Magento-Einstellungen deaktiviert. Ich bin ein wenig verwirrt über einige der Namenskonventionen; Ich habe nur versucht, dem Beispiel zu folgen. Wer weiß, wo ich falsch liege?

in magento/app/etc/modules/feed.xml:

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Feed_Sales> 
      <codePool>local</codePool> 
      <active>true</active> 
     </Feed_Sales> 
    </modules> 
</config> 

in magento/app/code/local/Futtermittel/Vertrieb/etc/config.xml:

<?xml version="1.0"?> 
<config> 
    <global> 
     <models> 
      <feedsales> 
       <class>Feed_Sales_Model</class> 
      </feedsales> 
     </models> 
     <events> 
      <sales_order_place_after> 
       <observers> 
        <feed_sales_order_observer> 
         <type>singleton</type> 
         <class>sales/order_observer</class><!-- I've also tried Feed_Sales_Model_Order_Observer here --> 
         <method>export_new_order</method> 
        </feed_sales_order_observer> 
       </observers> 
      </sales_order_place_after> 
     </events> 
    </global> 
</config> 

in magento/app/code/local/Futtermittel/Vertrieb/Modell/Bestellung/Observer.php:

<?php 
class Feed_Sales_Model_Order_Observer 
{ 
    public function __contruct() 
    { 

    } 

    /** 
    * Exports new orders to an xml file 
    * @param Varien_Event_Observer $observer 
    * @return Feed_Sales_Model_Order_Observer 
    */ 
    public function export_new_order($observer) 
    { 
     Mage::log("reached export_new_order"); 
     try 
     { 
      $dumpFile = fopen('/home/jorelli/new_orders/testdump', 'w+'); 
      fwrite($dumpFile, 'this is a test!'); 
     } 
     catch (Exception $e) 
     { 
      Mage::log("order export failed.\n"); 
     } 
     return $this; 
    } 
} 
?> 

Magento 1.4 auf Debian Lenny mit Apache2, wenn es sollte für jeden r Rolle einfach.

Antwort

0

Heiliger Mist. Ich war dumm. Ich habe es mit einem Kommandozeilen-Skript getestet, so wie ich es mit vielen Dingen mache, aber diese bestimmte Datei konnte nur vom Kommandozeilen-Interpreter geschrieben werden, nicht vom Apache-Interpreter. Ich hätte früher gestern Abend das Büro verlassen sollen.

Nun zum Beispiel, so löst man eine Aktion bei der Auftragserteilung aus. Ich überlasse es der Nachwelt.

3

Das Problem scheint mit Ihrer Beobachter-Erklärung zu sein. Versuchen Sie es mit:

<events> 
     <sales_order_place_after> 
      <observers> 
       <feed_sales_order_observer> 
        <type>singleton</type> 
        <class>feedsales/order_observer</class> 
        <method>export_new_order</method> 
       </feed_sales_order_observer> 
      </observers> 
     </sales_order_place_after> 
    </events> 
+0

danke für den Vorschlag. Keine Änderung bemerkt: - \ – jorelli

+0

Stellen Sie sicher, dass Sie Ihren Konfigurationscache gelöscht haben, bevor Sie nach der Änderung suchen. XML wird nicht bei jedem Laden der Seite gelesen. –

+0

Ja, ich habe den Config-Cache vorerst komplett deaktiviert. Es ist erwähnenswert, obwohl^_^ Für die Aufzeichnung, Sie hatten völlig Recht mit der bestimmten Klasse Alias. 'feedsales/order_observer' funktioniert. mit dem literalen Klassennamen 'Feed_Sales_Model_Order_Observer' funktioniert auch. aber 'sales/order_observer' funktioniert nicht. – jorelli

14

Lesen Sie my articles, sie werden Ihnen helfen, zu verstehen, was aus Sicht der Namenskonvention vor sich geht, und Sie in einige Konventionen/Annahmen von Magento einfließen lassen.

Mit Blick auf die obigen Beispiele haben Sie ein paar Dinge nicht ganz richtig.

Zuerst Ihre Datei im etc-Ordner falsch benannt

magento/app/etc/modules/Feed.xml 

Diese Datei Packagename_Modulename benannt werden muss, so dass Sie wahrscheinlich

wollen
magento/app/etc/modules/Feed_Sales.xml 

Blick auf System - > Konfiguration - > Erweiterte um zu sehen, ob dein Modul auftaucht. Wenn dies der Fall ist, haben Sie diese Datei korrekt benannt. Ohne dies wird das von Ihnen erstellte Modul nicht in das System geladen, und Ihr Code hat keine Chance, ausgeführt zu werden.

Als nächstes geben Sie die Klasse falsch an. Sie sagen

sales/order_observer 

aber dieser erste Teil der URI (Umsatz) ist falsch.Sie definiert Ihre Modelle Abschnitt als

<models> 
     <feedsales> <!-- this is your model part --> 
      <class>Feed_Sales_Model</class> 
     </feedsales> 
    </models> 

das heißt, Sie wollen

feedsales/order_observer 

Kasse die Class/URI tab of Commerce Bug und versuchen, einige URIs Eingabe (wie sales/order) eine bessere Vorstellung davon zu bekommen, was hier vor sich geht.

Ein weiterer schneller Tipp, wenn Sie versuchen, Ihre Handler-Setup zu erhalten, tun Sie es für ein Ereignis, das bei jedem Laden der Seite ausgelöst wird. Sobald Sie Ihre Methode aufgerufen haben, können Sie sie auf das gewünschte Ereignis umstellen und müssen nicht den gesamten Kaufprozess durchlaufen.

Schließlich, und ich realisiere, dass Sie Beispiele kopieren, ziehen Sie in Erwägung, Ihr Modul in einen Ordner mit der Bezeichnung "Sales" zu setzen. Ich finde, dass die Namen der Magento-Kernordner nur eine zusätzliche Ebene der Verwirrung hinzufügen, die Sie nicht brauchen, während Sie das System lernen.