Hook i custom_functions.php

Poniższa dokumentacja jest aktualizowana (a przynajmniej staramy się) do najnowszych wersji modułu i może zawierać informacje, które nie zadziałają w starszych wersjach modułu
Każda aktualizacja modułu zawiera aktualny plik *custom_functions.example.php* z przykładami
Poniższe funkcje wymagają wersji Advanced modułu

Aby najlepiej pokazać, jak moduł korzysta z haków i pliku custom_functions, PriceWars II wykonuje następujący kod:

try {
    Hook::exec('actionPricewarsBeforeOutput', array(
        'product' => $product_return,
        'id_xml' => $xml['id_xml'],
        'id_lang' => $this->getLangId(),
        'service' => $xml['service'],
        'module' => $this
    ));

    if(function_exists('pricewars2_product')) {
        pricewars2_product ($product_return, $xml['id_xml'], $this->getLangId(), $xml['service']);
    }

} catch (\pricewars2\pricewarsSkipException $e) {
    $this->logger->log('!!! Produkt został pominięty przez funkcję użytkownika. Thrown \pricewars2\pricewarsSkipException: '. $e->getMessage());
    return false;
}

Hook:exec daje identyczne możliwości jak funkcja pricewars2_product. Jedyna różnica, to przekazywanie dodatkowych parametrów.

Najważniejsze informacje:

  • Aby pominąć produkt z importu, należy wyrzucić wyjątek throw new \pricewars2\pricewarsSkipException('Wiadomość/Powód pominięcia')
    • Parametr product Przekazuje obiekt (typu \pricewars2\product) gotowy do wyświetlenia przez XML. Można go dowolnie modyfikować i w ten sposób zmieniać informacje o produkcie wyświetlane w XML
    • Parametr id_xml zawiera ID obecnie przetwarzanego XML. Może zostać użyte, aby daną zasadę ograniczyć tylko do konkretnego pliku XML
    • Parametr id_lang ID języka prestashop użytego przy generowaniu XML
    • Parametr service pole zawiera ciąg znaków reprezentujący obecnie użyty generator. Przykładowe wartości to np ceneo, google, facebook itp.
    • Parametr module (niedostępny w custom_functions) zawiera instancję modułu priceWars2. Ten parametr umożliwia wypisanie informacji do logów poprzez wywołanie $params['module']->getLogger()->log('[nazwa_modulu] Informacja')
      Jako dobrą praktykę, prosimy o dodawanie informacji o module, który zapisuje do logów.

Pobieranie podstawowych informacji

Pobieranie i nadpisywanie cen

Moduł podstawowo pobiera informacje dynamicznie przez wytwołanie Product::getPriceStatic()

Poniżej znajdziesz przykłady, jak pobrać i nadpisać konkretne ceny.

  // Pobiera cenę brutto
  $product->getPriceBrutto();
  // Nadpisze cenę brutto, którą zwraca getPriceBrutto() 
  $product->price = 10;
  
  
  // Pobiera cenę brutto
  $product->getPriceNetto();
  // Nadpisze cenę brutto, którą zwraca getPriceNetto() 
  $product->price_netto = 12.30;
  
  // Pobiera cenę brutto
  $product->getPriceBruttoWithoutReduction();
  // Nadpisze cenę brutto, którą zwraca getPriceBruttoWithoutReduction() 
  $product->price_without_reduction = 5;
  
  // Pobiera cenę brutto
  $product->getPriceNettoWithoutReduction();
  // Nadpisze cenę brutto, którą zwraca getPriceNettoWithoutReduction() 
  $product->price_without_reduction_netto = 6.15;

Pola price, price_netto, price_without_reduction, price_without_reduction_netto mają domyślnie wartość null. Ustawienie tej wartośći powoduje, że pobieranie ceny odbywa się za pomocą metody Product::getPriceStatic().

W przypadku nadpisywania cen, nie są one w żaden sposób ze sobą synchronizowane.

Dla produktu o wartości 10zł netto z 23% VAT getPriceNetto zwróci 10zł, a getPriceBrutto 12.30.
Jeśli nadpiszemy cenę netto, to cena brutto nie zostanie nadpisana.

Zwiększenie ceny o 100% powinno się odbyć następująco

  $product->price = $product->getPriceBrutto() * 2;
  $product->price_netto = $product->getPriceNetto() * 2;

Nadpisywanie opisów

Moduł tworząc opis zapisuje go do zmiennej $product->description_result.

Każdy XML korzysta z tej zmiennej w celu eksportu opisu do pliku XML. Nadpisanie wartości tej zmiennej, zmieni opis produktu w pliku wynikowym.

SmartTag, aby pobrać tę wartość to {description_result}

Sprawdzanie dostępnych pól w obiekcie \pricewars2\product

Sprawdzenia jakie są dostępne wartości można dokonać przez funkcję var_dump

// dla hook
var_dump($params['product']);
// dla custom_functions.php
var_dump($product);

Tworzenie własnych smartTagów

Moduł pozwala na dynamiczne przypisywanie wartości do obiektu, dostęp do zdefiniowanej wartości można następnie uzyskać za pomocą smartTagu.

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){
    $product->hello = 'World!';
}

Taki kod spowoduje, że w sekcji dodatkowych tagów XML będzie można użyć smartTagu {hello}, który to wstawi wartość World!

W skrócie <tag>{hello}<tag> spwooduje wygenerowanie tagu <tag>World!</tag>

W smartTagi można również wstawić części kodu XML (widoczne w przykładach poniżej)

Więcej o smartTagach można przeczytać tutaj

Przykładowe możliwości custom_functions.php

Tworzenie własnych etykiet Google

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){
    if($id_service = 'google'){
        $product->google_custom_label_0 = 'bestseller';
        $product->google_custom_label_1 = 'new';
        $product->google_custom_label_2 = '';
        $product->google_custom_label_3 = '';
        $product->google_custom_label_4 = '';
        $product->google_custom_label_5 = 'cena-standardowa';
        
        if($product->getPriceBrutto()) < 100)
            $product->google_custom_label_5 = 'cena-ponizej-100';
        if($product->getPriceBrutto()) < 50)
            $product->google_custom_label_5 = 'cena-ponizej-50';
        if($product->getPriceBrutto()) < 10)
            $product->google_custom_label_5 = 'cena-ponizej-10';
    }
}

Od wersji 4.38 modułu PriceWars II ustawienie$product->google_custom_label_n automatycznie doda tagi do XML.

W przypadku wcześniejszych wersji, należy ręcznie dodać je do sekcji sekcji dodatkowych tagów XML:

<g:custom_label_0>{custom_label_0}</g:custom_label_0>

Programistyczne definiowanie kosztów dostawy

Nie w każdym sklepie działa standardowy system wyliczania dostaw. Może on być nadpisany przez np. moduł zewnętrzny.

W naszym module dajemy możliwość definiowania własnych metod dostaw.

Najbardziej podstawowy kod to:

function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings, $module){
    $sp = new \pricewars2\shipping\shippingcollection();
    $sp->addToList((new \pricewars2\shipping\shipping())->fillByArray([
        'price' => 250, // Nie przelicza walut. Podać w walucie w której generowany jest XML
        'name' => 'Rabbit Delivery Corp. - Super fast delivery services',
    ]));
    $sp->addToList((new \pricewars2\shipping\shipping())->fillByArray([
        'price' => 50,
        'name' => 'Snail Transport ltd - Cheap, but... really... slow...',
    ]));
}

W ten sposób, dla XML Google (który obsługuje koszty dostaw) można zdefiniować własny zestaw dostępnych kurierów

Nasz moduł domyślnie wstawia tylko 1 kuriera, wybranego zgodnie z ustawieniami sklepu. Za pomocą tego API istnieje możliwość dodania większej ilości metod dostaw.

Ograniczanie funkcjonalności do konkretnego XML

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){
    // "Doklejenie" na początku nazwy produktu dla XML o ID = 1 i produktu z ceną poniżej 10zł ciągu znaków "Taniej niż 10zł!"
    if($id_xml == 1){ // Reguła zadziała tylko dla XML o ID 1
        if($product->getPriceBrutto() < 10)
            $product->name = 'Taniej niż 10zł! ' . $product->name;
    }
}

Wykluczanie produktów na podstawie kategorii

Zakładając, żę w sklepie jest kategoria ID 35 o nazwie Nie eksportuj do xml. To jeśli chcemy np. wykluczyć produkty znajdująće się w tej kategorii można to zrobić w nast. sposób:

W tym przypadku, brane pod uwagę są kategorie pomocnicze jak i kategoria główna produktu

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){

    foreach($product->categories as $category) {
        if($category->id == 35) {
            throw new \pricewars2\pricewarsSkipException('Produkt znajduje się w kategorii 35 (Nie eksportuj do Ceneo)');
        }   
    }   
}

Dodawanie cech na podstawie kategorii

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){

    if(strpos($product->categories[0]->name,'kobieta'))
        $product->gender = 'female';

    if(strpos($product->categories[0]->name,'mężczyzna'))
        $product->gender = 'male';

    if(strpos($product->categories[0]->name,'garnitur')) 
        $product->gender = 'male';

    if(strpos($product->categories[0]->name,'sukienka'))
        $product->gender = 'male';
}

Następnie w sekcji dodatkowych tagów, mozemy wstawić wygenerowaną wartość

<gender>{gender}</gender>

Dodanie informacji do nazwy zależnie od ceny produktu

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){

    // "Doklejenie" na początku nazwy produktu dla XML o ID = 1 i produktu z ceną poniżej 10zł ciągu znaków "Taniej niż 10zł!"
    if($id_xml == 1){ // Reguła zadziała tylko dla XML o ID 1
        if($product->getPriceBrutto() < 10)
            $product->name = 'Taniej niż 10zł! ' . $product->name;
    }
}

Redukcja stanów na określony

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){
    // Redukcja stanów magazynowych wszystkich produktów na 10
    $product->quantity_o = 10;
}

Podmiana Identyfikatora produktu

Możliwe jest, iż ktoś będzie chciał z jakiegoś powodu podmienić ID produktu eksportowane do XML - np. na ID systemu magazynowo-księgowego.
WAŻNE W przypadku porównywarek wymagających dwóch XML (jak integracja XML Empik i Carrefour ) wymagane jest wprowadzeni zmian w obu polach.

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){
    // Moduł nie sprawdza, czy użytkownik nadaje unikalne ID
    // w gestii programisty pozostawiamy upewnienie się, że eksportowane ID są unikalne.
    $product->id_product = $nowe_id;
}

Zrzut wszystkich cech do XML

<?php
function pricewars2_product(\pricewars2\product $product, $id_xml, $id_lang, $service, $settings){

    if($service === 'ceneo'){
        $xml = '';
        foreach($product->features as $f){
            $xml .= "<a name=\"{$f['name']}\"><![CDATA[{$f['value']}]]></a>";
        }
        $product->additional_xml = str_replace('</attrs>', $xml.'</attrs>', $product->additional_xml);
    }
}

Ustawienia specyficzne dla XML

Skąpiec

:v Minimalna Wersja modułu 4.1.3

availability_force może przyjmować wartości:

  • false - Decydują ustawienai stanu magazynowego (stock > 0 ? 1 : 0)
    • 0 - Nie prezentuj oferty
    • 1 - wysyłka do godziny / natychmiast,
    • 24 - wysyłka następnego dnia,
    • 48 - wysyłka do 2 dni,
    • 72 - wysyłka do 3 dni,
    • 168 - wysyłka do tygodnia
    • 336 - wysyłka do 14 dni