Table of Contents
Hook i Custom functions
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.
- 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.
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 |
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;
}
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;
}
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