magento dataflow

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.