2010-06-30 14 views
14

Estoy tratando de escribir un observador que exportará datos de pedido cuando se realiza un pedido. No he escrito ningún módulo antes. Basando mi implementación en este artículo: http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_methodmagento sales_order_place_after observador

Hasta ahora solo intento activar un código ficticio para escribir en un archivo. No estoy obteniendo nada en mi registro, y el archivo no está siendo modificado. El usuario de apache tiene permiso para el directorio. Inhabilité el almacenamiento en caché de configuración en la configuración de Magento. Estoy un poco confundido con algunas de las convenciones de nombres; Solo traté de seguir el ejemplo. ¿Alguien sabe dónde me estoy equivocando?

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

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

en magento/app/código/Ventas/feed/local/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> 

en magento/app/código/local/RSS/Ventas/modelo/Pedido/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 en Debian Lenny con Apache 2 si se debe importar para cualquier r eason.

Respuesta

0

Holy crap. Yo era estúpido. Lo probé con un script de línea de comando, como hago con muchas cosas, pero ese archivo en particular solo fue editable por el intérprete de línea de comandos, no por el intérprete de Apache. Debería haber salido de la oficina más temprano anoche.

Bueno, para que quede registrado, así es como se desencadena una acción en la colocación de la orden. Lo dejaré para la posteridad.

3

El problema parece ser con su declaración de observador. Prueba esto:

<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

gracias por la sugerencia. No notó ningún cambio: - \ – jorelli

+0

Asegúrese de haber borrado su caché de configuración antes de buscar el cambio. XML no se lee en cada carga de página. –

+0

Sí, acabo de desactivar por completo el caché de configuración por el momento. Vale la pena mencionar, aunque^_^ Para el registro, usted tenía toda la razón sobre el alias de clase particular. trabajos 'feedsales/order_observer'. usando el nombre de clase literal de 'Feed_Sales_Model_Order_Observer' también funciona. pero 'sales/order_observer' no funciona. – jorelli

14

Lea my articles, lo ayudarán a comprender lo que está sucediendo desde el punto de vista de la convención de nomenclatura y lo fundamentarán en algunas de las convenciones/suposiciones de Magento.

En cuanto a los ejemplos anteriores, tiene algunas cosas no del todo bien.

En primer lugar, su archivo en la carpeta etc lleva el nombre equivocado

magento/app/etc/modules/Feed.xml 

Este archivo debe ser nombrado Packagename_Modulename, por lo que es probable que desee

magento/app/etc/modules/Feed_Sales.xml 

mirar el sistema - > Configuración - > avanzada para ver si tu módulo aparece. Si lo hace, habrá nombrado este archivo correctamente. Sin esto, el módulo que creó no se está cargando en el sistema, y ​​su código nunca tiene la posibilidad de ejecutarse.

A continuación, especifica la clase incorrectamente. Usted dice

sales/order_observer 

pero esa primera parte del URI (ventas) es incorrecta.Ha definido su sección de modelos como

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

lo que significa que quiere

feedsales/order_observer 

Pedido del Class/URI tab of Commerce Bug e intente introducir algunos URIs (como sales/order) para tener una mejor idea de lo que está pasando aquí.

Otro consejo rápido, cuando intenta obtener la configuración de su controlador, hágalo para un evento que se active en cada carga de página. Luego, una vez que se llame a su método, puede cambiarlo al evento específico que desee y no tener que pasar por todo el proceso de compra.

Finalmente, y me doy cuenta de que estaba copiando ejemplos, considere poner su módulo en una carpeta llamada algo distinto de Sales. Me parece que imitar los nombres de las carpetas principales de Magento solo agrega una capa adicional de confusión, que no es lo que necesitas mientras aprendes el sistema.

Cuestiones relacionadas