modules magento

Magento Dataflow - standardowe adaptery [część 2]

Artykuł " Magento DataFlow - elastyczna wymiana danych" przedstawił globalny koncept frameworka wymiany danych zaimplementowanego w Magento. Dziś chciałbym napisać więcej o standardowych adapterach zaimplementowanych w module DataFlow.

  1. Definicja adaptera

    Adaptery są odpowiedzialne za pobieranie danych z zewnętrznych źródeł albo ich zapisywania do tychże. W tym celu wszystkie adaptery implementują interfejs Mage_Dataflow_Model_Convert_Adapter_Interface, który zawiera dwie metody: load() i save(). Koncept wymiany danych przyjęty w module DataFlow wykorzystuje adaptery w 3 kontekstach:

    • by załadować dane ze źródła - używając metody load()
    • by zapisać dane do źródła - używając metody save()
    • by wykonać operacje na jednym przetwarzanym wierszu - gdy zdefiniowane jako para zmiennych adapter/metoda parsera

    W pierwszych dwóch kontekstach definicja xml adaptera wygląda następująco:

    <action method="load" type="dataflow/convert_adapter_io">
         ...
    </action>

    Tag action posiada dwa parametry: typ i metoda. Typ decyduje, która klasa adaptera będzie wykorzystana w danej akcji. Klasę definiujemy podając jej alias. Parametr metoda mówi, która metoda klasy adaptera zostanie wywołana przez akcję. Jak wspomniałem już wcześniej, domyślnie dostępne są dwie metody: load i save. Wewnątrz taga action definiujemy zmienne, które są parametrami wykorzystywanymi podczas wykonywania metody adaptera. Zmienne definiuje się tak jak w poniższym przykładzie:

     
    <action method="load" type="dataflow/convert_adapter_io">
       <var name="type">file</var>
       <var name="path">var/import</var>
       <var name="filename"><!--[CDATA[products.csv]]--></var>
       <var name="format"><!--[CDATA[csv]]--></var>
    </action>

  2. Standardowe adaptery modułu Magento DataFlow

    Moduł DataFlow Magento zawiera kilka standardowych klas adapterów, które można znaleźć w katalogu app/code/core/Dataflow/Model/Convert/Adapter. Nie wszystkie z nich mają jednak zaimplementowane metody load() i save().

    W przypadku powszechnej czynności odczytywania danych z lub zapisu danych do pliku lokalnego lub zdalnego możesz wykorzystać adapter dataflow/convert_adapter_io (Mage_Dataflow_Model_Convert_Adapter_Io).

    Przedstawione poniżej zmienne pozwalają Ci zdefiniować plik lokalny/zdalny jako źródło danych:

    • type - definiuje typ źródła. Poprawne wartości to: file, ftp
    • path - definiuje ścieżkę względną do pliku
    • filename - definiuje nazwę pliku źródła
    • host - dla źródła ftp definiuje domenę ftp
    • port - dla źródła ftp definiuje port ftp (domyślnie 21)
    • user - dla źródła ftp definiuje nazwę użytkownika (domyślnie jeżeli nie podana zostanie inna wartość przyjmuje 'anonymous' dla zmiennej user i 'anonymous@noserver.com' dla zmiennej password
    • password - dla źródła ftp definiuje hasło użytkownika
    • timeout - dla źródła ftp definiuje maksymalny czas oczekiwania na połączenie (domyślnie 90)
    • file_mode - dla źródła ftp definiuje tryb odczytu pliku (domyślnie FTP_BINARY)
    • ssl - dla źródła ftp definiuje czy korzystać z połączenia ssl
    • passive - dla źródła ftp definiuje tryb połączenia z serwerem ftp (domyślnie false)
  3. Adaptery encji klienta i produktu

    Dla najczęściej importowanych/eksportowanych encji - klienta i produktu - Magento dostarcza w standardzie adaptery: customer/convert_adapter_customer (Mage_Customer_Model_Convert_Adapter_Customer) i catalog/convert_adapter_product (Mage_Catalog_Model_Convert_Adapter_Product). Oba dziedziczą po Mage_Eav_Model_Convert_Adapter_Entity.

    By w najprostszy sposób załadować wszystkich klientów wybranego sklepu możesz użyć następującej definicji:

    <action type="customer/convert_adapter_customer" method="load">
        <var name="store">default</var>
    </action>

    Czasem możesz jednak chcieć załadować tylko wybranych użytkowników z bazy danych. By Ci w tym pomóc dostępny jest następujący zestaw zmiennych:

    • filter/firstname - by załadować tylko klientów, których imię zaczyna się od podanej wartości
    • filter/lastname - by załadować tylko klientów, których nazwisko zaczyna się od podanej wartości
    • filter/email - by załadować tylko klientów, których email zaczyna się od podanej wartości
    • filter/group - by załądować tylko klientów z wybranej grupy zdefiniowanej przez id
    • filter/adressType - by eksportować tylko wybrany typ adresu; poprawne wartości: both, default_billing, default_shipping
    • filter/telephone - by załadować tylko klientów, których numer telefonu zaczyna się od podanej wartości
    • filter/postcode - by załadować tylko klientów, których kod pocztowy zaczyna się od podanej wartości
    • filter/country - by załadować tylko klientów z kraju o podanym kodzie iso
    • filter/region - by załadować tylko klientów z wybranego regionu (dla USA wystarczy podać dwuliterowe kody stanów)
    • filter/created_at/from - by załadować tylko klientów stworzonych po podanej dacie
    • filter/created_at/to - by załadować tylko klientów stworzonych przed podaną datą

    Na przykład:

    <action type="customer/convert_adapter_customer" method="load">
        <var name="store"><![CDATA[0]]></var>
        <var name="filter/firstname"><![CDATA[a]]></var>
        <var name="filter/lastname"><![CDATA[a]]></var>
        <var name="filter/email"><![CDATA[a]]></var>
        <var name="filter/group"><![CDATA[1]]></var>
        <var name="filter/adressType"><![CDATA[default_billing]]></var>
        <var name="filter/telephone"><![CDATA[1]]></var>
        <var name="filter/postcode"><![CDATA[7]]></var>
        <var name="filter/country"><![CDATA[BS]]></var>
        <var name="filter/region"><![CDATA[WA]]></var>
        <var name="filter/created_at/from"><![CDATA[09/22/09]]></var>
        <var name="filter/created_at/to"><![CDATA[09/24/09]]></var>
    </action>

    W ten sam sposób możesz załadować i filtrować produkty z bazy danych, używając następujących zmiennych:

    • filter/name - by załadować tylko produkty, których nazwa zaczyna się podaną wartością
    • filter/sku - by załadować tylko produkty, których sku zaczyna się podaną wartością
    • filter/type - by załadować tylko produkty, których typ odpowiada zdefiniowanemu; poprawne wartości: simple, configurable, grouped, bundle, virtual, downloadable
    • filter/attribute_set - by załadować tylko produkty, których id zestawu atrybutów odpowiada podanej wartości
    • filter/price/from - by załadować tylko produkty, których cena jest nie mniejsza niż podana wartość
    • filter/price/to - by załadować tylko produkty, których cena jest nie większa niż podana wartość
    • filter/qty/from - by załadować tylko produkty, których ilość jest nie mniejsza niż podana wartość
    • filter/qty/to - by załadować tylko produkty, których cena jest nie większa niż podana wartość
    • filter/visibility - by załadować tylko produkty o zdefiniowanej w zmiennej widoczności
    • filter/status - by załadować tylko produkty o zdefiniowanym w zmiennej statusie

    Przykład:

    <action type="catalog/convert_adapter_product" method="load">
        <var name="store"><![CDATA[0]]></var>
        <var name="filter/name"><![CDATA[a]]></var>
        <var name="filter/sku"><![CDATA[1]]></var>
        <var name="filter/type"><![CDATA[simple]]></var>
        <var name="filter/attribute_set"><![CDATA[29]]></var>
        <var name="filter/price/from"><![CDATA[1]]></var>
        <var name="filter/price/to"><![CDATA[2]]></var>
        <var name="filter/qty/from"><![CDATA[1]]></var>
        <var name="filter/qty/to"><![CDATA[2]]></var>
        <var name="filter/visibility"><![CDATA[2]]></var>
        <var name="filter/status"><![CDATA[1]]></var>
    </action>

Wygląda to trochę przerażająco jeśli spojrzeć na konieczność używania wartości id, które musisz podać definiując filtry. Na szczęście dla tych dwóch encji - klientów i produktów - dostępny jest generator profili, który pozwala Ci zdefiniować filtr za pomocą prostego formularza.

W następnej części opiszę użycie parserów i adapterów w kontekście parserów.

Magento DataFlow - elastyczna wymiana danych [część 1]

Jedną z głównych funkcjonalności rozwiązań e-commerce jest możliwość dzielenia danych z systemem zarządzania sprzedażą offline. Magento czyni wymianę danych elastyczną i łatwą dzięki modułowi DataFlow.

Magento DataFlow to framework wymiany danych, którzy korzysta z czterech typów komponentów: adapter, parser, maper i walidator. W chwili obecnej walidatory nie zostały jeszcze zaimplementowane, ale zarezerwowano ten termin celem wykorzystania w przyszłości.

Proces wymiany danych zdefiniowany jest jako struktura XML i nazywany jest profilem. Magento udostpęnia prosty kreator generujący podstawowe profile importu/exportu działające na encjach produktów i użytkowników. Dostępny jest również zaawansowany menadżer profili dający możliwość zaawansowanym użytkowikom tworzyć profile o większym stopniu skomplikowania, w tym działające na innych encjach bądź obiektach.

Adaptery są odpowiedzialne za pobieranie danych z zewnętrznych źródeł oraz ich przetwarzanie i filtrowanie. Mogą być użyte na przykład do pobrania danych z: lokalnych lub zdalnych plików, web services, bazy danych i innych.

Na przykład aby załadować dane z pliku CSV należy wstawić strukturze XML definiującej profil następujący kod:

<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">file</var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[products.csv]]></var>
    <var name="format"><![CDATA[csv]]></var>
</action>

By załadować dane ze zdalnego pliku zlokalizowanego na serwerze FTP możemy użyć tego samego adaptera, ale z następującymi parametrami:

<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">ftp</var>
    <var name="host"><![CDATA[ftp.server.com]]></var>
    <var name="passive">true</var>
    <var name="user"><![CDATA[user]]></var>
    <var name="password"><![CDATA[password]]></var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[products.csv]]></var>
    <var name="format"><![CDATA[csv]]></var>
</action>

Parsery są odpowiedzialne za transformację danych z jednej postaci na drugą. Mogą być użyte na przykład do konwersji zawartości pliku CSV na dwuwymiarową tablicę, bądź w drugą stronę.

By przetworzyć zawartość pliku CSV na tablicę produktów w bazie danych można użyć następującego kodu:

<action type="dataflow/convert_parser_csv" method="parse">
    <var name="delimiter"><![CDATA[,]]></var>
    <var name="enclose"><![CDATA["]]></var>
    <var name="fieldnames">true</var>
    <var name="store"><![CDATA[0]]></var>
    <var name="number_of_records">1</var>
    <var name="decimal_separator"><![CDATA[.]]></var>
    <var name="adapter">catalog/convert_adapter_product</var>
    <var name="method">parse</var>
</action>

Adapter zdefiniowany jako zmienna parserao nazwie <var name="adapter"> oraz metoda adaptera <var name="method"> są odpowiedzialne za przetworzenie załadowanych danych. W tym konkretnym przypadku parser przetwarza dane z foramatu pliku CSV na dwuwymiarową tablicę wywołując metodę parse adaptera.

Najprostszym sposobem dostosowania importu do swoich potrzeb jest napisanie własnego adaptera i podanie go jako zmienną w definicji parsera. W większości przypadków oznacza to konieczność nadpisania jednego z istniejących adapterów i napisania własnej metody przetwarzającej dane (w większości przypadków oznacza to nadpisanie metody saveRow())

Mapery są odpowiedzialne za zmianę wartości danych na inne. Znajdują zastosowanie w przypadku mapowania jednego pola na inne pole.

W przykładzie poniżej pole 'reference' ze źródła mapowane jest na pole 'sku' a zmienna '_only_specified' ustawiona na true inforumje, że importowane/exportowane będą tylko wymienione pola:

<action type="dataflow/convert_mapper_column" method="map">
    <var name="map">
        <map name="sku"><![CDATA[reference]]></map>
        <map name="name"><![CDATA[name]]></map>
        <map name="price"><![CDATA[price]]></map>
        <map name="qty"><![CDATA[qty]]></map>
    </var>
    <var name="_only_specified">true</var>
</action>

To tylko wierzchołek góry lodowej jaką są możliwości oferowane przez moduł DataFlow Magento. Wróć później by przeczytać o nich więcej.