Hot Dla programisty, PrestaShop

Przykład użycia hook „additionalCustomerFormFields”

Dzisiaj technicznie.

Jeden z użytkowników popularnej grupy PrestaShop na Facebook nie umiał poradzić sobie ze zmodyfikowaniem pól formularza, które dostępne są w procesie rejestracji. Jego zadaniem było zmodyfikowanie pola „optin” w taki sposób aby nadpisać zarówno treść jak i styl tego pola.

Z pomocą przychodzi hook „additionalCustomerFormFields”, od wersji 1.7.7 PrestaShop dostał on parametr fields, który zawiera całą tablicę pól używanych przez tę klasę.

W tym artykule opisuje w jaki sposób możemy z niego korzystać.

Jak to działa?

Tak jak w wielu innych miejscach systemu, tak i tutaj, dostajemy parametr, który jest przekazywany jako referencja (tutaj artykuł czym są referencje), dzięki temu możemy na nim dowolnie operować,  a nasze modyfikacje będą miały zastosowanie po wywołaniu tego Hook’a.

Aby zacząć, musimy oczywiście przypiąć się do odpowiedniego miejsca w kodzie w naszym module.

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

W metodzie, która obsługuje już przypięcie mamy dostęp do całej tablicy pól, w ten sposób:

public function hookAdditionalCustomerFormFields($params)
{
    $format = $params['fields'];
    dump($format);
}

Jeżeli wejdziemy w tym momencie na stronę rejestracji to zobaczymy wszystkie pola:

Mając do nich dostęp, reszta jest tylko formalnością. Przejdźmy do realnego użycia hookAdditionalCustomerFormFields.

Dodawanie pól

Każde pole, które przekazywane jest dalej powinno być instancją FormField, jest to klasa dostępna globalnie w systemie. Pole dodajemy w taki sposób:

public function hookAdditionalCustomerFormFields($params)
{
    $format = $params['fields'];

    $format['confirmation_email'] = (new FormField())
        ->setName('confirmation_email')
        ->setType('email')
        ->setLabel($this->trans('Confirm your e-mail address', [], 'Modules.Demooverridecustomerformatter.Front'))
        ->setRequired(true);

    $params['fields'] = $format;
}

W ten sposób dodamy nowe pole do formularza, jest to pole o nazwie „confirmation_email”, dość popularny przykład dodania elementu, który ma na celu zmuszenie kupującego do potwierdzenia swojego adresu e-mail.

Usuwanie pól

Jeżeli chcemy spowodować, że któreś z pól nie będzie już dostępne w formularzu, możemy je usunąć używając unset. Przykład:

public function hookAdditionalCustomerFormFields($params)
{
    $format = $params['fields'];

    unset($format['id_gender']);

    $params['fields'] = $format;
}

Modyfikacja pól

Dochodzimy też do modyfikacji pól czyli tego na czym zależało autorowi wątku na Facebook, w jaki sposób modyfikować pola? Skupmy się na polu optin, zmodyfikujmy jego etykietę, a także dodajmy styl (chociaż to akurat nie jest coś co powinniśmy robić w tej warstwie aplikacji).

public function hookAdditionalCustomerFormFields($params)
{
    $format = $params['fields'];

    $newLabel = '<em class="text-warning">';
    $newLabel .=    $this->trans(
        'I want to receive free gift from your partners',
        [],
        'Modules.Demooverridecustomerformatter.Front'
    );
    $newLabel .= '</em>';

    $format['optin']->setLabel(
        $newLabel
    );

    $params['fields'] = $format;
}

Jak widzimy, mając dostęp do instancji danego pola, możemy używać metod dostępnych w klasie FormField, jedną z nich jest właśnie setLabel.

Dodaliśmy pochylenie, kolor i zmieniliśmy tekst, efekt jest następujący:

Podsumowanie

Jak widzimy obsługa pól formularza rejestracji przy użyciu dedykowanego Hook jest całkiem przystępna i pozwala developerom na pełną kontrolę nad nim. Jako, że pola to tablica możemy je dowolnie modyfikować, zmieniać ich kolejność, usuwać i dodawać nowe.

Ten artykuł nie pokrył wszystkich kwestii związanych z formularzem rejestracji, nie pokazałem jak wartości przesyłane z dodatkowych pól odbierać, weryfikować i ewentualnie zapisywać w systemie, na to jednak przyjdzie czas innym razem.

Tagi: , ,

Zobacz inne