MobyDick używa systemu Zaczepów (ang. Hooks) z Prestashop i thirtybees, dodając własne hooki.

Parametry

Każdy z zaczepów ma 3 wspólne parametry

Dostępne we wszystkich zaczepach:

  • settings - Tablica zawierająca ustawienia konkretnej hurtowni
  • raw - Dane dostarczane przez hurtownie nie modyfikowane przez nas, tak jak dostarcza je hurtownia
  • wholesaler - Nasz wewnętrzny identyfikator hurtowni. Np. Action, Ab, AGDPartner

Dostępne w wybranych zaczepach:

  • new - Jeśli dostępny i == true to produkt dopiero zostanie dodany do sklepu
    W przypadku kombinacji, kombinacja dopiero zostanie dodana do sklepu.
  • product - Jeśli dostępny, zawsze zawiera natywny obiekt produktu Prestashop Product
  • combination - Jeśli dostępny, zawsze zawiera natywny obiekt produktu Prestashop Combination
  • save_object_after_flag - W celu optymalizacji, kombinacja produktu nie zawsze jest zapisywana. Jeśli dokonamy zmiany w obiekcie i chcemy wymusić zapisanie, należy ustawić wartośc tego parametru na true za pomocą komendy: $params['save_object_after_flag'] = true

Pomijanie produktów

Aby pominąć produkt, należy wyrzucić wyjątek: throw new \skipException('Pomijam produkt')

Dobrą praktyką jest dodanie w komunikacie informacji, że robi to sklep, a nie sam moduł, np:

throw new \skipException('(Custom) Pomijam produkt bo ...');  
throw new \skipException('(User) Pomijam produkt bo ...');

Aby zapewnić jak najłatwiejsze debugowanie problemów, najlepiej załączyć nazwę modułu, który pomija dany produkt.

throw new \skipException('(Module::'.$this->name.') Pomijam produkt bo ...');

Definicje zaczepów

Definicje zaczepów w module wyglądają następująco:

Zaczep mobydickProductInit

Zaczep przeznaczony głównie do pomijania produktów. Ten zaczep nie pozwala na modyfikację żadnych danych. Aby pominąć produkt należy wyrzucić wyjątek \skipException więcej informacji poniżej

Hook::exec('mobydickProductInit', [
  'settings' => array(),
  'raw' => $raw_data,
  'wholesaler' => strtolower($this->getInternalName())
]);

Zaczep mobyDickProductBeforeSave

Zaczep pozwala na modyfikację obiektu przed jego zapisaniem do bazy.
W przypadku nowych produktów jest to produkt jeszcze niezapisany (brak ID).
Produkt jest zapisywany zaraz po zakończeniu tego zaczepu.

Hook::exec('mobyDickProductBeforeSave',[
  'new' => true || false,
  'product' => Product $product,
  'settings' => array(),
  'raw' => $raw_data,
  'wholesaler' => strtolower($this->getInternalName())
]);

Zaczep mobyDickCombinationBeforeSave

Zaczep pozwala na modyfikację obiektu kombinacji. Zaraz po jego wywołaniu produkt jest zapisywany.

Hook::exec('mobyDickCombinationBeforeSave',[
  'new' => true || false,
  'product' => Product $product,
  'combination' => $combination_object,
  'settings' => array(),
  'raw' => $raw_data,
  'wholesaler' => 'identyfikatorhurtowni',
  'save_object_after_flag' => &$save_object_after_flag
]);

Przykładowe użycie

public function hookMobyDickProductBeforeSave($params){
  if(strtolower($params['wholesaler']) === 'action') {
    // Zwiększenie ceny netto 2x
    $params['product']->price = $params['product']->price * 2;
    foreach($params['product']->description as $key => $desc){
      // Nadpisanie opisu
      $params['product']->description[$key] = '<p>Nadpisuję opis!</p>';
      // Dodanie informacji na początku opisu 
      $params['product']->description[$key] = '<p>Doklejam na początku opisu</p>' . $desc;
      // Dodanie informacji na końcu opisu 
      $params['product']->description[$key] .= '<p>Doklejam na końcu opisu</p>';
      // Modyfikacja opisu - usunięcie znaczników HTML
      $params['product']->description[$key] = strip_tags($desc);
    }         
  }
}

Własna funkcja, odnajdująca produkty

Nasz moduł wspiera proste rozwiązania w zakresie parowania istniejącej oferty.
Możesz sam określić, w jaki sposób chciałbyś parować produkty. Poniżej przedstawiamy prosty przykład kodu, który pozwoli na stworzenie systemu parowania samemu.

// Metoda dostępna od wersji 2.13.0

function mobydick_custom_matcher($param) {
    $param['supplier_id']; // ID dostawcy
    $param['supplier_reference']; // Nr. Ref. dostawcy (na ogól taki sam jak ID)
    $param['reference']; // Kod producenta (jeśli hurtownia go dostrarcza)
    $param['ean13']; // EAN13 - Jeśli jest
    $param['settings']; // Tablica z ustawieniami modułu
    $param['raw']; // Obiekt XML lub tablica, ktora zawiera dane bezpośrednio z hurtowni
    $param['wholesaler']; // identyfikator hurtowni (zawsze małymi literami)

    // Logika, która wyszukuje produkt
    if($id_product = Product::getIdByEan13($param['ean13'])){
        return new Product($id_product);
    }
    return false;
}