magento

Baobaz na Meet Magento Polska

Po raz pierwszy w Polsce społeczność Magento ma okazję spotkać się w jednym miejscu i podzielić doświadczeniami z najdynamiczniej rozwijającym się systemem e-commerce na świecie na konferencji Meet Magento Polska, która odbędzie się w Warszawie w dniach 23-24 listopada (program).

Meet Magento Polska

Baobaz dołączył do tego przedsięwzięcia jako jeden z partnerów, nie zabraknie nas też wśród prelegentów. Autorami prezentacji o przewrotnym tytule "Ale u mnie działa... - czyli repozytoria kodu i automatyczna publikacja w projektach Magento" są posiadacze certyfikatu Magento Certified Developer Plus - Maciej Krasuski i Kamil Węgrzynowicz.

Wszystkich zachęcamy do udziału i spotkania z nami w Warszawie!

Konfiguracja Magento do pracy z wieloma stronami lub sklepami

Istnieje wiele poradników w których napisano jak skonfigurować Magento do pracy z wieloma sklepami, tak by różne domeny wskazywały na wybrane sklepy. Począwszy od wydań Magento CE 1.4.0.0-alpha2 i Magento EE 1.6.0.0 stało się to wiele prostsze w wykonaniu.

Magento ewoluuje

Rozwiązania stosowane w poprzednich wersjach wymagały od programisty modyfikacji zawartości pliku index.php, jeżeli chciał obsłużyć wyświetlanie różnych sklepów zależnie od domeny. Nowy plik index.php zawiera następujący kod:

$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

Mage::run($mageRunCode, $mageRunType);

Sprawdza on dwie zmienne środowiskowe i używa ich uruchamiając Magento. Jakie możliwości to nam daje? Możemy teraz ustawić który sklep ma działać pod daną domeną bezpośrednio w definicji wirtualnego hosta a nawet w pliku .htaccess.

Rozwiązanie z użyciem VirtualHost

Aby czerpać z korzyści powyższego kawałka kodu wystarczy dodać następujące linie wewnątrz definicji wirtualnego hosta:

SetEnv MAGE_RUN_CODE "base" # wstaw tu kod strony lub sklepu
SetEnv MAGE_RUN_TYPE "website" # wstaw tu 'website' lub 'store'

Rozwiązanie z użyciem .htaccess

Jeżeli nie masz dostępu do definicji wirtualnego hosta, możesz wciąż wykorzystać w tym celu plik .htaccess, umieszczając w nim następujące linie:

SetEnvIf Host .*yourhost.* MAGE_RUN_CODE=base
SetEnvIf Host .*yourhost.* MAGE_RUN_TYPE=website

Gdzie .*yourhost.* jest wyrażeniem regularnym wychwutującym domenę dla której chcesz ustawić zmienną środowiskową.

Masz zatem teraz możliwość skonfigurować Magento do pracy z wieloma sklepami bez konieczności mieszania w rdzeniu Magento. Powodzenia.

Wykorzystanie domyślnych szablonów w Magento

System szablonów w Magento w prosty sposób umożliwia tworzenie własnego kodu html/css, realizującego założenia projektu graficznego. Jednakże w wielu przypadkach, o ile to możliwe, właściwsze byłoby wykorzystanie domyślnych szablonów Magento. W ten sposób oszczędzić można dużo czasu poświęconego na integrację nowej struktury kodu html z funkcjonalnością sklepu internetowego Magento.

Dla przykładu, rzućmy okiem na następującą lokalizację w standardowej strukturze plików Magento: app\design\frontend\default\default\template\page. W tym miejscu znajdziemy szablony opisujące najbardziej podstawową i ogólną strukturę strony: 1column.phtml, 2colums-left.phtml, 2colums-right.phtml lub 3colums.phtml. Każdy z tych szablonów zawiera niemal ten sam kod html (skupmy się na części znajdującej się wewnątrz sekcji 'body'):

<div class="wrapper">

<!-- start header -->
        <div class="header">
            ...
        </div>
<!-- end header -->

<!-- start middle -->
        <div class="middle-container">
            ...
        </div>
<!-- end middle -->

<!-- start footer -->
        <div class="footer-container">
                <div class="footer">
                    ...
                </div>
        </div>
<!-- end footer -->

</div>

Jedyna różnica pomiędzy tymi szablonami to część wewnątrz <div class=”middle-container”> - w tym miejscu zdefiniowany jest kod html odpowiedni dla konkretnego layoutu strony. Co jest jednak najbardziej istotne, szablony te powielają najczęściej stosowany sposób podziału struktury strony - na nagłówek, główną część i stopkę. Zatem w większości przypadków możemy wykorzystać powyższe domyślne szablony bez żadnych modyfikacji kodu html, wykorzystując jedynie style css, aby dostosować wygląd strony do wymagań projektu graficznego.

Jasną sprawą jest, że im bardziej szczegółowy szablon, tym mniejsza jest szansa wykorzystania go w niezmienionej formie, mimo to wciąż najszybszym sposobem będzie rozpoczęcie od domyślnego szablonu Magento i zmodyfikowania go tylko w takim zakresie, w jakim jest to konieczne.

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.