Dodatkowe pola w formularzu rejestracji PrestaShop 1.7

W tym poradniku przedstawimy jak poszerzyć formularz rejestracji PrestaShop o dodatkowe pola adresu. Poradnik jest stworzony pod wersję PrestaShop 1.7, ponieważ to w tej wersji dołożenie pół formularza bez ingerencji w kod stało się niemożliwe.

additional_form_fields_prestashop

Pamiętaj, że wszystkie zmiany przeprowadzasz na własne ryzyko. Pomimo tego, że możliwości nadpisywania klas w PrestaShop 1.7 zostały zdecydowanie ograniczone, to poniższy poradnik korzysta z katalogu override.

Pierwszym krokiem będzie dodanie dodatkowych pól formularza. W tym celu nadpisujemy klasę CustommerFormatter. W katalogu override/classes/form tworzymy plik php CustomerFormatter (o ile nie istnieje). Wewnątrz pliku dodajemy klasę:

class CustomerFormatter extends CustomerFormatterCore
{
    
}

Z oryginalnego pliku kopiujemy wszystkie metody i pola. Do tablicy $format dodajemy dodatkowe wartości. W naszym przypadku będą to wszystkie wymagane pola które normalnie trzeba by wprowadzić z poziomu formularza adresu. Oczywiście formularz można rozszerzyć o większą liczbę „inputów” z ww. formularza.

//additional fields
        $format['phone'] = (new FormField)
            ->setName('phone')
            ->setLabel(
                $this->translator->trans(
                    'Phone', [], 'Shop.Forms.Labels'
                )
            )
            ->setRequired(true)
        ;
        $format['address1'] = (new FormField)
            ->setName('address1')
            ->setLabel(
                $this->translator->trans(
                    'Address', [], 'Shop.Forms.Labels'
                )
            )
            ->setRequired(true)
        ;
        $format['postcode'] = (new FormField)
            ->setName('postcode')
            ->setLabel(
                $this->translator->trans(
                    'Zip/Postal Code', [], 'Shop.Forms.Labels'
                )
            )
            ->setRequired(true)
        ;
        $format['city'] = (new FormField)
            ->setName('city')
            ->setLabel(
                $this->translator->trans(
                    'City', [], 'Shop.Forms.Labels'
                )
            )
            ->setRequired(true)
        ;

Pamiętaj żeby po operacji wyczyścić cache. Zmiany będą już widoczne w formularzu kontaktowym.

additional_form_fields_prestashop

Następnie należy nadpisać zapisywanie formularza. W tym celu w katalogu override/controllers/front dodajemy plik php AuthController w którym tworzymy klasę nadpisującą.

class AuthController extends AuthControllerCore
{
    
}

Następnie kopiujemy metodę  initContent() z oryginalnego pliku. Pod warunkiem, który (m.in.) odpowiada za zapisanie danych (($hookResult && $register_form->submit())) dodajemy obsługę zapisania adresu:

if ($hookResult && $register_form->submit()) {
                    
                    //address saving
                    $customer = new Customer();
                    $customer = $customer->getByEmail($register_form->getCustomer()->email);
                    
                    $address = new Address(
                        null,
                        $this->context->language->id
                    );                    

                    $address->id_country = (int) Tools::getCountry();
                    $address->address1 = Tools::getValue('address1');
                    $address->postcode = Tools::getValue('postcode');
                    $address->city = Tools::getValue('city');
                    $address->phone = Tools::getValue('phone');
                    
                    $address->firstname = $customer->firstname;
                    $address->lastname = $customer->lastname;
                    $address->id_customer = (int) $customer->id;
                    
                    $address->id_state = 0;
                    $address->alias = $this->trans('My Address', [], 'Shop.Theme.Checkout');                    
                    
                    if($address->save()){
                        $should_redirect = true;
                    } else {
                        $customer->delete();
                        $this->errors[] = $this->trans('Could not update your information, please check your data.', array(), 'Shop.Notifications.Error');
                        $this->redirectWithNotifications($this->getCurrentURL());
                    }
                }

W przypadku kiedy adres nie może być zapisany, użytkownik jest kasowany i zwracany jest komunikat.

Poniżej widać zrzut ekranu z automatycznie zapisanym adresem.

additional_form_fields_prestashop


W podanym przykładzie zastosowano kilka uproszczeń. Nie ma zastosowanej żadnej bardziej rozbudowanej walidacji, poza wymagalnością pół, która jest wymuszona w pierwszej klasie. Również pole wyboru kraju zostało uproszczone do pobierania id z konfiguracji. W związku z tym jeśli potrzebujesz bardziej rozbudowanego rozwiązania, to możesz pokusić się o dopisanie kilku linijek kodu.

 

W celu zapewnienia maksymalnej wygody użytkowników przy korzystaniu z witryny ta strona stosuje pliki cookies. Szczegóły w naszej Polityce prywatności. Kliknij " Zgadzam się", aby ta informacja nie wyświetlała się więcej