Jump to content
DavidCKW

Séparer les champs d'adresses dans pdf facture

Recommended Posts

Bonjour,

Sur prestashop 1.7.6, pour des raisons spécifiques, j'ai besoin qu'un champ "Autres" soit disponible dans la partie adresses, côté front office pour l'utilisateur, mais ne soit pas visible sur la facture.

Je suis donc allé dans le pays en question pour rajouter le champ autres dans la liste des champs disponibles pour l'adresse (champ proposé par défaut dans l'onglet adresse). Ce champ s'affiche donc bien en FO, lors de l'inscription ou d'une modification d'adresse. De plus dans une commande, il s'affiche de façon séparée sous l'adresse (en plus de s'afficher avec les autres champs de l'adresse). Dans le pdf de la facture, il s'affiche sous les autres champs, alors que je ne voudrais pas du tout qu'il s'affiche.

Je suis allé voir dans le tpl du pdf (invoice.addresses-tab.tpl) et les champs adresses sont appelés par une seule variable globale qui en globe tous les champs : {$invoice_address}

Il me faudrait donc avoir une variable par champs, ainsi je pourrai les séparer et n'afficher que ceux qui m'intéressent. J'ai bien tenté d'afficher par exemple {$invoice_address.firstname} mais ça n'a pas marché.

Je me doute donc qu'il va peut être falloir faire une requête spéciale à passer via un override du fichier classes/order/OrderInvoice.php pour avoir des champs différents, mais là, je sèche un peu.

Quelqu'un a--t-il une idée svp ?

 

Merci d 'avance.

Share this post


Link to post
Share on other sites

Bonjour,

Quitte à passer par un override, essayez sur le fichier classes/AddressFormat.php, la fonction generateAddress().

 

Share this post


Link to post
Share on other sites

Merci pour votre retour. J'ai bien trouvé la fonction dont le code complet est le suivant :

    public static function generateAddress(Address $address, $patternRules = array(), $newLine = self::FORMAT_NEW_LINE, $separator = ' ', $style = array())
    {
        $addressFields = AddressFormat::getOrderedAddressFields($address->id_country);
        $addressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($address, $addressFields);

        $addressText = '';
        foreach ($addressFields as $line) {
            if (($patternsList = preg_split(self::_CLEANING_REGEX_, $line, -1, PREG_SPLIT_NO_EMPTY))) {
                $tmpText = '';
                foreach ($patternsList as $pattern) {
                    if ((!array_key_exists('avoid', $patternRules)) ||
                                (is_array($patternRules) && array_key_exists('avoid', $patternRules) && !in_array($pattern, $patternRules['avoid']))) {
                        $tmpText .= (isset($addressFormatedValues[$pattern]) && !empty($addressFormatedValues[$pattern])) ?
                                (((isset($style[$pattern])) ?
                                    (sprintf($style[$pattern], $addressFormatedValues[$pattern])) :
                                    $addressFormatedValues[$pattern]) . $separator) : '';
                    }
                }
                $tmpText = trim($tmpText);
                $addressText .= (!empty($tmpText)) ? $tmpText . $newLine : '';
            }
        }

        $addressText = preg_replace('/' . preg_quote($newLine, '/') . '$/i', '', $addressText);
        $addressText = rtrim($addressText, $separator);

        return $addressText;
    }

Malheureusement, je ne suis pas suffisamment calé en php pour modifier la fonction et en extraire une génération qui excluerai mon champ "other"

Share this post


Link to post
Share on other sites

Créer le fichier override/classes/AddressFormat.php :

class AddressFormat extends AddressFormatCore
{

   public static function generateAddress(Address $address, $patternRules = array(), $newLine = self::FORMAT_NEW_LINE, $separator = ' ', $style = array())
   {
      $addressFields = AddressFormat::getOrderedAddressFields($address->id_country);
      $addressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($address, $addressFields);

      $addressText = '';
      foreach ($addressFields as $line) {
         if ($line == 'other') // on passe le champs other
            continue;
         if (($patternsList = preg_split(self::_CLEANING_REGEX_, $line, -1, PREG_SPLIT_NO_EMPTY))) {
            $tmpText = '';
            foreach ($patternsList as $pattern) {
               if ((!array_key_exists('avoid', $patternRules)) || (is_array($patternRules) && array_key_exists('avoid', $patternRules) && !in_array($pattern, $patternRules['avoid']))
               ) {
                  $tmpText .= (isset($addressFormatedValues[$pattern]) && !empty($addressFormatedValues[$pattern])) ? (((isset($style[$pattern])) ? (sprintf($style[$pattern], $addressFormatedValues[$pattern])) : $addressFormatedValues[$pattern]) . $separator) : '';
               }
            }
            $tmpText = trim($tmpText);
            $addressText .= (!empty($tmpText)) ? $tmpText . $newLine : '';
         }
      }

      $addressText = preg_replace('/' . preg_quote($newLine, '/') . '$/i', '', $addressText);
      $addressText = rtrim($addressText, $separator);

      return $addressText;
   }
}

A tester...

  • Like 1

Share this post


Link to post
Share on other sites

Génial lagui, ça marche !!!!

Grâce à l'override, en activant le champ other pour la France, les utilisateurs peuvent renseigner ce champ en Front office. Je le vois dans la commande, mais il ne s'affiche pas dans l'adresse de la facture. C'est exactement ce que je souhaitais.

Un grand MERCI à toi lagui, tu viens d'égayer ma journée et de m'enlever une épine du pied :)

 

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More