Table of Contents
Hook i custom_functions.php
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 npceneo
,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.
- Parametr
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()
.
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
-