Hook i Custom functions

Ta dokumentacja opisuje aktualny sposób modyfikowania generowanego XML w module PriceWars II.

Dostępny od wersji Price Wars II 5.2.0

Starszy system oparty o actionPricewarsBeforeOutput oraz pricewars2_product nadal działa i na ten moment nie ma planów jego usunięcia. Jest jednak traktowany jako rozwiązanie legacy.

Nowy system jest zalecany dla nowych wdrożeń, ponieważ pozwala modyfikować gotowy fragment XML — usuwać elementy, dodawać nowe tagi i zmieniać istniejące wartości bez operowania na wewnętrznych obiektach modułu.

Nowy system daje dwie możliwości modyfikacji XML:
  • funkcje, które otrzymują wygenerowany XML i zwracają zmodyfikowaną treść,
  • hooki, które pozwalają modyfikować XML przez referencję.

Funkcje można dodać w pliku custom_functions.php albo podczas inicjalizacji sklepu. Hooki można wykorzystać we własnych modułach PrestaShop.

Co zostaje jako legacy

Poniższe mechanizmy są nadal obsługiwane, ale nie są zalecane dla nowych wdrożeń:

actionPricewarsBeforeOutput
pricewars2_product

Stary system przekazywał do kodu użytkownika obiekt produktu używany wewnętrznie przez moduł. W praktyce wymagało to znajomości struktury tego obiektu i nie dawało pełnej kontroli nad finalnym XML.

Nowy system działa na gotowej treści XML, czyli dokładnie na tym fragmencie, który zostanie dodany do pliku wynikowego.

Modyfikacja nagłówka XML

Nagłówek XML można modyfikować na dwa sposoby:

actionPricewarsModifyHeader
seigiPriceWarsTextHeaderModify

actionPricewarsModifyHeader istniał już wcześniej i zostaje zachowany.

seigiPriceWarsTextHeaderModify to nowa alternatywa funkcyjna.

Funkcja: seigiPriceWarsTextHeaderModify

Funkcja otrzymuje gotowy nagłówek XML i musi zwrócić zmodyfikowaną treść.

<?php

function seigiPriceWarsTextHeaderModify($content, $id_xml, $id_lang, $service, $settings, $module)
{
// W tym miejscu można zmodyfikować nagłówek XML.

return $content;
}

Parametry funkcji nagłówka

Parametr Opis
$content Aktualna treść nagłówka XML przekazana do modyfikacji
$id_xml ID aktualnie generowanego XML
$id_lang ID języka użytego podczas generowania XML
$service Nazwa generatora, np. google, ceneo, facebook
$settings Ustawienia aktualnie generowanego XML
$module Instancja modułu PriceWars II

Przykład funkcji nagłówka

<?php

function seigiPriceWarsTextHeaderModify($content, $id_xml, $id_lang, $service, $settings, $module)
{
if ((int) $id_xml !== 3) {
return $content;
}

$content .= "\n<!-- Nagłówek zmodyfikowany w custom_functions.php -->\n";

return $content;
}

Hook: actionPricewarsModifyHeader

Hook jest przeznaczony głównie do użycia we własnych modułach PrestaShop.

W hooku parametr content jest przekazywany przez referencję. Oznacza to, że modyfikujesz wartość w $params['content'].

public function hookActionPricewarsModifyHeader($params)
{
if (!isset($params['content'])) {
return;
}

$params['content'] .= "\n<!-- Nagłówek zmodyfikowany przez moduł -->\n";
}

Modyfikacja stopki XML

Stopkę XML można modyfikować na dwa sposoby:

actionPricewarsModifyFooter
seigiPriceWarsTextFooterModify

actionPricewarsModifyFooter istniał już wcześniej i zostaje zachowany.

seigiPriceWarsTextFooterModify to nowa alternatywa funkcyjna.

Funkcja: seigiPriceWarsTextFooterModify

Funkcja otrzymuje gotową stopkę XML i musi zwrócić zmodyfikowaną treść.

<?php

function seigiPriceWarsTextFooterModify($content, $id_xml, $id_lang, $service, $settings, $module)
{
// W tym miejscu można zmodyfikować stopkę XML.

return $content;
}

Parametry funkcji stopki

Parametr Opis
$content Aktualna treść stopki XML przekazana do modyfikacji
$id_xml ID aktualnie generowanego XML
$id_lang ID języka użytego podczas generowania XML
$service Nazwa generatora, np. google, ceneo, facebook
$settings Ustawienia aktualnie generowanego XML
$module Instancja modułu PriceWars II

Przykład funkcji stopki

<?php

function seigiPriceWarsTextFooterModify($content, $id_xml, $id_lang, $service, $settings, $module)
{
if ($service !== 'google') {
return $content;
}

$content = "\n<!-- Stopka zmodyfikowana w custom_functions.php -->\n" . $content;

return $content;
}

Hook: actionPricewarsModifyFooter

Hook jest przeznaczony głównie do użycia we własnych modułach PrestaShop.

public function hookActionPricewarsModifyFooter($params)
{
if (!isset($params['content'])) {
return;
}

$params['content'] = "\n<!-- Stopka zmodyfikowana przez moduł -->\n" . $params['content'];
}

Modyfikacja wpisu produktu

Wpis produktu, czyli pojedynczy node XML produktu, można modyfikować na dwa sposoby:

actionPricewarsNodeModify
seigiPriceWarsTextNodeModify

actionPricewarsNodeModify to hook dla modułów PrestaShop.

seigiPriceWarsTextNodeModify to funkcja, którą można dodać np. w pliku custom_functions.php.

Modyfikacja wpisu produktu działa na gotowym fragmencie XML pojedynczego produktu. To tutaj można zmieniać dane produktu, dodawać własne tagi, usuwać fragmenty XML albo pominąć produkt z eksportu.

Funkcja: seigiPriceWarsTextNodeModify

Funkcja otrzymuje gotowy XML produktu i musi zwrócić zmodyfikowany XML.

<?php

function seigiPriceWarsTextNodeModify($content, $id_xml, $id_lang, $service, $settings, $module, $id_product, $id_combination)
{
// W tym miejscu można zmodyfikować XML pojedynczego produktu.

return $content;
}

Parametry funkcji produktu

Parametr Opis
$content Aktualna treść XML produktu przekazana do modyfikacji
$id_xml ID aktualnie generowanego XML
$id_lang ID języka użytego podczas generowania XML
$service Nazwa generatora, np. google, ceneo, facebook
$settings Ustawienia aktualnie generowanego XML
$module Instancja modułu PriceWars II
$id_product ID produktu
$id_combination ID Kombinacji int|null
Funkcja powinna zwrócić poprawną treść XML. Jeżeli nie chcesz nic zmieniać, zwróć oryginalny `$content`.

Pominięcie produktu z eksportu

W funkcji seigiPriceWarsTextNodeModify nadal można pominąć produkt z eksportu przez rzucenie wyjątku:

throw new \pricewars2\pricewarsSkipException('Powód pominięcia produktu');

Przykład:

<?php

function seigiPriceWarsTextNodeModify($content, $id_xml, $id_lang, $service, $settings, $module, $id_product, $id_combination)
{
if ($service === 'google' && strpos($content, '<availability>out of stock</availability>') !== false) {
throw new \pricewars2\pricewarsSkipException('Produkt pominięty: brak dostępności');
}

return $content;
}
`pricewarsSkipException` należy stosować tylko przy modyfikacji wpisu produktu. Nie używaj go przy modyfikacji nagłówka ani stopki XML.

Modyfikacja tylko dla konkretnego XML

<?php

function seigiPriceWarsTextNodeModify($content, $id_xml, $id_lang, $service, $settings, $module, $id_product, $id_combination)
{
if ((int) $id_xml !== 3) {
return $content;
}

// Modyfikacja tylko dla XML o ID 3.

return $content;
}

Modyfikacja tylko dla konkretnego generatora

<?php

function seigiPriceWarsTextNodeModify($content, $id_xml, $id_lang, $service, $settings, $module, $id_product, $id_combination)
{
if ($service !== 'google') {
return $content;
}

// Modyfikacja tylko dla generatora Google.

return $content;
}

Dodanie własnego fragmentu do produktu

<?php

function seigiPriceWarsTextNodeModify($content, $id_xml, $id_lang, $service, $settings, $module, $id_product, $id_combination)
{
if ($service !== 'google') {
return $content;
}

$content = str_replace(
'</item>',
'<custom_label_0>promocja</custom_label_0></item>',
$content
);

return $content;
}
Powyższy przykład zakłada, że wpis produktu kończy się tagiem ``. Różne generatory mogą używać różnych struktur XML, dlatego własne modyfikacje należy dopasować do formatu konkretnego pliku.

Usunięcie elementu z produktu

<?php

function seigiPriceWarsTextNodeModify($content, $id_xml, $id_lang, $service, $settings, $module, $id_product, $id_combination)
{
// Przykład poglądowy: usunięcie prostego tagu description.
$content = preg_replace('/<description>.*?<\/description>/s', '', $content);

return $content;
}

Zmiana wartości w produkcie

<?php

function seigiPriceWarsTextNodeModify($content, $id_xml, $id_lang, $service, $settings, $module, $id_product, $id_combination)
{
// Przykład poglądowy: zmiana wartości prostego tagu availability.
$content = preg_replace(
'/<availability>.*?<\/availability>/s',
'<availability>in stock</availability>',
$content
);

return $content;
}

Hook: actionPricewarsNodeModify

Hook jest przeznaczony głównie do użycia we własnych modułach PrestaShop.

W hooku parametr content jest przekazywany przez referencję. Oznacza to, że modyfikujesz wartość w $params['content'].

public function hookActionPricewarsNodeModify($params)
{
if (!isset($params['content'])) {
return;
}

if (isset($params['service']) && $params['service'] !== 'google') {
return;
}

$params['content'] = str_replace(
'</item>',
'<custom_label_0>dodane-z-modulu</custom_label_0></item>',
$params['content']
);
}

Parametry hooków

Parametr Opis
content Treść XML przekazana przez referencję
id_xml ID aktualnie generowanego XML
id_lang ID języka użytego podczas generowania XML
service Nazwa generatora, np. google, ceneo, facebook
settings Ustawienia aktualnie generowanego XML
module Instancja modułu PriceWars II
id_product ID Produktu int
id_combination ID kombinacji int|null

Rejestracja hooków w module

Jeżeli tworzysz własny moduł, zarejestruj używane hooki podczas instalacji.

public function install()
{
return parent::install()
&& $this->registerHook('actionPricewarsNodeModify')
&& $this->registerHook('actionPricewarsModifyHeader')
&& $this->registerHook('actionPricewarsModifyFooter');
}

Kiedy używać funkcji, a kiedy hooków?

Funkcje

Funkcje sprawdzają się przy prostych, indywidualnych modyfikacjach dodawanych bezpośrednio w sklepie.

Przykłady:

  • szybkie dodanie własnego tagu,
  • zmiana fragmentu XML dla jednego generatora,
  • modyfikacja konkretnego pliku XML po jego ID.

Hooki

Hooki są lepszym wyborem, gdy modyfikacja ma być częścią osobnego modułu.

Przykłady:

  • własny moduł wpływający na generowanie XML,
  • większa logika biznesowa,
  • modyfikacje zależne od konfiguracji modułu,
  • rozwiązanie, które ma być łatwe do przenoszenia między sklepami.

Dobre praktyki

Zawsze zwracaj treść XML

W funkcjach zawsze zwracaj $content — zmodyfikowany albo oryginalny.

return $content;

Ograniczaj modyfikacje do konkretnego XML

if ((int) $id_xml !== 2) {
return $content;
}

Ograniczaj modyfikacje do konkretnego generatora

if ($service !== 'google') {
return $content;
}

Zachowaj poprawną strukturę XML

Modyfikacje powinny pozostawiać poprawny XML. Błędnie zamknięty tag albo niepoprawnie dodany fragment może spowodować problem z wygenerowanym feedem.

Podsumowanie

Nowy system modyfikacji XML w PriceWars II pozwala modyfikować gotową treść XML zamiast wewnętrznych obiektów modułu.

Dla nagłówka dostępne są:

seigiPriceWarsTextHeaderModify
actionPricewarsModifyHeader

Dla stopki dostępne są:

seigiPriceWarsTextFooterModify
actionPricewarsModifyFooter

Dla wpisu produktu dostępne są:

seigiPriceWarsTextNodeModify
actionPricewarsNodeModify

Starsze mechanizmy:

actionPricewarsBeforeOutput
pricewars2_product

Changelog

Od wersji 5.2.1
Hook: actionPricewarsNodeModify
Funkcja: seigiPriceWarsTextNodeModify
ma dodatkowe 2 parametry: id_product oraz id_combination