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, Price Wars 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.

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_return);

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_return->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_return->custom_label_0 = 'bestseller';
		$product_return->custom_label_1 = 'new';
		$product_return->custom_label_2 = '';
		$product_return->custom_label_3 = '';
		$product_return->custom_label_4 = '';
		$product_return->custom_label_5 = '';
		if($product->getPriceBrutto()) < 10)
			$product_return->custom_label_5 = 'ponizej10';
	}
}

Aby wstawić tagi w XML google należy dodać takie wpisy do sekcji dodatkowych tagów XML:

<g:custom_label_0>{custom_label_0}</g:custom_label_0>
<g:custom_label_1>{custom_label_1}</g:custom_label_1>
<g:custom_label_2>{custom_label_2}</g:custom_label_2>
<g:custom_label_3>{custom_label_3}</g:custom_label_3>
<g:custom_label_4>{custom_label_4}</g:custom_label_4>
<g:custom_label_5>{custom_label_5}</g:custom_label_5>

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_return->price < 10)
			$product_return->name = 'Taniej niż 10zł! ' . $product_return->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->price < 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