Jump to content

Modificare il CAP a seconda della nazione al checkout


s.elettronew

Recommended Posts

Salve ragazzi,

Ho la necessità di modificare il CAP al momento della registrazione dell'indirizzo al checkout (il modulo in questione è OnePageCheckOut.

Lo scopo è fare un semplice str_replace() del CAP a seconda del paese dell'indirizzo prima che i dati vengano salvati in wp_address.

Ho provato a dare uno sguardo alle classi (sono neofita di prestashop), e l'unica classe che mi salta all'occhio dove potrei intervenire è :

-ManufacturerAddressFormDataHandler.php => Potrei aggiungere una condizione recuperando il codice ISO del paese in questione, nello specifico :


 

    private function fillCommandWithData(EditManufacturerAddressCommand $command, array $data)

    {

        if (null !== $data['post_code']) {

            $command->setPostCode($data['post_code']);

        }

-Address.php => Intervenire nella funzione setAddress(). Soluzione già sperimentata, ma apparentemente non è successo nulla...
 

public function setPostCode($postCode)

    {

       

        switch (getCountryCode()) {

            case 15:

                $this->postCode = str_replace("-","",$postCode);

                break;


Qualcuno ha delle idee dove potrei verificare? Grazie

Link to comment
Share on other sites

Quello che chiedi lo puoi fare in 2 modi diversi, entrambi sfruttano gli hook.

 

Il primo modo è quello di utilizzare l'hook actionSubmitCustomerAddressForm, questo hook viene chiamato sono nel front-office e viene eseguito prima del salvataggio.
come parametro viene passato l'indirizzo come classe Address

 

Il secondo modo richiede l'utilizzo dei seguenti metodi:

  • actionObjectAddBefore / actionObjectUpdateBefore
  • actionObjectAddressAddBefore / actionObjectAddressUpdateBefore

questi 4 hook vengono chiamati direttamente dalla classe ObjectModel e passano come parametro l'indirizzo come classe Address.
Ovviamente non devi utilizzare tutti e 4, ma devi utilizzarne solo 2 la differenza è che utilizzando i primi due (actionObjectAddBefore / actionObjectUpdateBefore), nel tuo metodo devi controllare se il parametro passato è un indirizzo, mentre con gli altri due (actionObjectAddressAddBefore / actionObjectAddressUpdateBefore) sai già che si sta creando/aggiornando un indirizzo.

 

Ci sarebbe anche un terzo metodo, che funziona solo per l'admin, che sfrutta gli hook relativi a Symfony, ma ovviamente funzionano solo se nella tua versione di Prestashop,  la parte admin degli indirizzi è stata migrata a Symfony, in questo caso gli hook sono: dei nuovi

  • actionAddressFormBuilderModifier: chiamato in fase di creazione del form
  • actionAfterUpdateAddressFormHandler: chimato in fase di salvataggio dei dati
  • Like 1
Link to comment
Share on other sites

No io non voglio utilizzare il CAP, voglio continuare ad utilizzare le zone. Semplicemente quando aggiungo il cap nel form , che modifico con un replace prima che l'hook che mi hai menzionato viene attivato, non mi vengono proposte le possibilità di spedizione.

Quindi in ps_address tutto viene salvato correttamente, ma il montante totale è falso perchè non mi da possibilità di aggiungere il prezzo di spedizione

 

1.png

2.png

Link to comment
Share on other sites

Molto probabilmente hai un modulo per le spedizioni che richiede il CAP per il calcolo della spedizione, di base Prestashop non usa il CAP per il calcolo della spedizione, quindi devi verificare bene tra i moduli che hai installato.

Link to comment
Share on other sites

Non ho nessun modulo particolare per le spedizioni. Ho trovato in onepagecheckoutps.ps questo pezzo di codice, potrebbe influire?

 

                        if ($country->need_zip_code && !empty($country->zip_code_format)) {
                            if (empty($address->postcode) || $address->postcode == $default_value || !$country->checkZipCode($address->postcode)) {
                                $this->errors = $this->l('You need to place a post code to show shipping options.');
                            }
                        }

e la funzione checkZipCode è la seguente

 

    public function checkZipCode($zipCode)
    {
        if (empty($this->zip_code_format)) {
            return true;
        }

        $zipRegexp = '/^' . $this->zip_code_format . '$/ui';
        $zipRegexp = str_replace('N', '[0-9]', $zipRegexp);
        $zipRegexp = str_replace('L', '[a-zA-Z]', $zipRegexp);
        $zipRegexp = str_replace('C', $this->iso_code, $zipRegexp);

        return (bool) preg_match($zipRegexp, $zipCode);
    }

 

Link to comment
Share on other sites

Il debug non è legato a Prestashop, ma al linguaggio di programmazione, nel caso di PRestashop è PHP.
Il debug lo esegui mediante l'IDE ma ovviamente devi installare una estensione di PHP per poterlo far funzionare.
Puoi utilizzare xdebug https://xdebug.org/ 

Ovviamente il tutto conviene farlo in locale che sicuramente è più agevole.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...