Jump to content

Afficher l'adresse du client sur Order-address


Recommended Posts

Bonjour,

 

je viens vers vous aujourd'hui car je rencontre un léger problème sur ma boutique e-commerce.

Je cherche en effet à afficher, sur l'étape 3 du tunnel d'achat (order-address), une partie de l'adresse du client en bas de page. Actuellement la page comporte donc un bloc pour l'adresse de livraison, un bloc pour l'adresse de facturation (similaire ou différente) et j'aimerais plus bas re-afficher par exemple la ville renseignée ou le code postal.

 

J'ai déjà essayé de glisser dans mon order-address.tpl :

{$address.postcode}
{$address.city}

etc...

.. mais quand l'utilisateur a plusieurs adresse d'enregistrées sur son compte, comme par exemple une à Paris et une autre à Lyon, ce sera toujours le code postal de Lyon qui s'affiche (dernière adresse ajoutée) et non celle de Paris même si cette dernière est sélectionnée. Comment résoudre ce problème ? Y-a t'il un autre moyen plus adéquat pour parvenir à mes fins ?

 

Un grand merci d'avance :)

Edited by Antoniolav (see edit history)
Link to comment
Share on other sites

Bonjour,

 

Pas si simple en effet. D'abord la variable $address que vous récupérez n'est pas un paramètre du template mais est issue de la dernière boucle {foreach from=$addresses}. Il est donc normal que ce soit la dernière adresse déclarée par le client. Il vous faut retrouver parmi les adresses celle choisie pour la livraison par exemple. Ensuite, lors d'un changement d'adresse par le client, la page ne sera pas rechargée mais rafraîchie uniquement en JS, donc votre information initiale risque de devenir fausse.

 

Je ne comprends pas complètement ce que vous voulez faire, mais peut-être pourrez-vous vous inspirer de ceci:

 

Ajoutez le bloc suivant à l'endroit souhaité dans themes/xxx/order-address.tpl

<!-- BEGIN CAPTURE DELIVERY ADDRESS -->
<div>
  La livraison aura lieu à <span id="capture_delivery_address">
    {foreach from=$addresses key=k item=address}
      {if $address.id_address == $cart->id_address_delivery}
        {$address.postcode} {$address.city}
      {/if}
    {/foreach}
  </span>
</div>
<!-- END CAPTURE DELIVERY ADDRESS -->

Et insérez les lignes suivantes dans la fonction updateAddresses() de themes/xxx/js/order-address.js (à partir de la ligne 100 en PS 1.6.0.14):

function updateAddresses()
{
  var idAddress_delivery = parseInt($('#id_address_delivery').val());
  var idAddress_invoice = $('#addressesAreEquals:checked').length === 1 ? idAddress_delivery : parseInt($('#id_address_invoice').val());

  // BEGIN CAPTURE DELIVERY ADDRESS
  var buf = formatedAddressFieldsValuesList[idAddress_delivery].formated_fields_values;
  $("#capture_delivery_address").html(buf.postcode + " " + buf.city);
  // END CAPTURE DELIVERY ADDRESS
  ...

Le bloc ajouté affiche ainsi en permanence le code postal et la ville de l'adresse de livraison choisie.

 

Cordialement

Edited by erouvier29 (see edit history)
  • Like 1
Link to comment
Share on other sites

Bonjour erouvier29,

 

Super, ça marche impeccable ! Par contre inutile de modifier le order-adress.js, ça marche sans.

Ce que je voulais faire sur cette page :

 

128332iciafficher.jpg

 

Il était donc nécessaire de faire un foreach pour que {$address.postcode} s'affiche bien.

 

 

 

Ensuite, lors d'un changement d'adresse par le client, la page ne sera pas rechargée mais rafraîchie uniquement en JS, donc votre information initiale risque de devenir fausse

 

En fait j'avais déjà modifié ce rafraichissement AJAX : j'ai rajouté un rafraichissement de page normal (avec un widows.location.reload)

Un grand merci à toi ;)

Edited by Antoniolav (see edit history)
Link to comment
Share on other sites

  • 5 years later...

Bonjour,

je déterre ce message car j'ai besoin d'afficher l'adresse de facturation dans le fichier tpl my account

J'ai testé avec

<div>
  La livraison aura lieu à <span id="capture_invoice_address">
    {foreach from=$addresses key=k item=address}
      {if $address.id_address == $cart->id_invoice_delivery}
        {$address.postcode} {$address.city}
      {/if}
    {/foreach}
  </span>
</div>

mais ca ne fonctionne pas. J'ai testé avec l'id de l'adresse ($cart id adresse invoice), ca fonctionne pour afficher l'id, mais pas le nom de l'adresse (rue, code postal, ville)

Auriez vous une piste pour presta 1.6?

un grand merci pour votre aide, car je ne trouve aucune infos.

Link to comment
Share on other sites

12 minutes ago, erouvier29 said:

Ajoutez temporairement {debug} au début de votre tpl, et vérifiez le contenu de $addresses et $cart

J'ai testé, mais il ne ressort pas d'adresse, juste l'id de l'adresse.

Je cherche comment afficher l'adresse de facturation dans mon tpl

Une piste?

merci

Link to comment
Share on other sites

6 hours ago, erouvier29 said:

Modifiez  controllers/front/MyAccountController.php de façon à assigner la variable smarty $addresses, comme cela est fait dans controllers/front/AddressesController.php (fonctions initContent())

 

j'ai testé en ajoutant ce code:

 /**
     * Assign template vars related to page content
     * @see FrontController::initContent()
     */
    public function initContent()
    {
        parent::initContent();

        $this->assignCountries();
        $this->assignVatNumber();
        $this->assignAddressFormat();

        // Assign common vars
        $this->context->smarty->assign(array(
            'address_validation' => Address::$definition['fields'],
            'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'),
            'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), //retro compat
            'ajaxurl' => _MODULE_DIR_,
            'errors' => $this->errors,
            'token' => Tools::getToken(false),
            'select_address' => (int)Tools::getValue('select_address'),
            'address' => $this->_address,
            'id_address' => (Validate::isLoadedObject($this->_address)) ? $this->_address->id : 0
        ));

        if ($back = Tools::getValue('back')) {
            $this->context->smarty->assign('back', Tools::safeOutput($back));
        }
        if ($mod = Tools::getValue('mod')) {
            $this->context->smarty->assign('mod', Tools::safeOutput($mod));
        }
        if (isset($this->context->cookie->account_created)) {
            $this->context->smarty->assign('account_created', 1);
            unset($this->context->cookie->account_created);
        }

        $this->setTemplate(_PS_THEME_DIR_.'address.tpl');
    }

    /**
     * Assign template vars related to countries display
     */
    protected function assignCountries()
    {
        $this->id_country = (int)Tools::getCountry($this->_address);
        // Generate countries list
        if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) {
            $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true);
        } else {
            $countries = Country::getCountries($this->context->language->id, true);
        }

        // @todo use helper
        $list = '';
        foreach ($countries as $country) {
            $selected = ((int)$country['id_country'] === $this->id_country) ? ' selected="selected"' : '';
            $list .= '<option value="'.(int)$country['id_country'].'"'.$selected.'>'.htmlentities($country['name'], ENT_COMPAT, 'UTF-8').'</option>';
        }

        // Assign vars
        $this->context->smarty->assign(array(
            'countries_list' => $list,
            'countries' => $countries,
            'sl_country' => (int)$this->id_country,
        ));
    }

    /**
     * Assign template vars related to address format
     */
    protected function assignAddressFormat()
    {
        $id_country = is_null($this->_address)? (int)$this->id_country : (int)$this->_address->id_country;
        $requireFormFieldsList = AddressFormat::getFieldsRequired();
        $ordered_adr_fields = AddressFormat::getOrderedAddressFields($id_country, true, true);
        $ordered_adr_fields = array_unique(array_merge($ordered_adr_fields, $requireFormFieldsList));

        $this->context->smarty->assign(array(
            'ordered_adr_fields' => $ordered_adr_fields,
            'required_fields' => $requireFormFieldsList
        ));
    }

comme tu ma dit dans le fichier: controllers/front/MyAccountController.php

j'ai une page blanche. Est ce le bon code?

 

Link to comment
Share on other sites

Page blanche = erreur PHP a priori, donc non, ce n'est pas le bon code

Il ne faut pas ajouter tout le code de AddressesController, mais modifier uniquement la fonction initContent dans MyAccountController en s'inspirant de ce qui est fait dans l'autre

Code original PS 1.6.1.23:

    public function initContent()
    {
        parent::initContent();

        $has_address = $this->context->customer->getAddresses($this->context->language->id);
        $this->context->smarty->assign(array(
            'has_customer_an_address' => empty($has_address),
            'voucherAllowed' => (int)CartRule::isFeatureActive(),
            'returnAllowed' => (int)Configuration::get('PS_ORDER_RETURN')
        ));
        $this->context->smarty->assign('HOOK_CUSTOMER_ACCOUNT', Hook::exec('displayCustomerAccount'));

        $this->setTemplate(_PS_THEME_DIR_.'my-account.tpl');
    }

Code modifié:
 

  public function initContent()
    {
        parent::initContent();

        $has_address = $this->context->customer->getAddresses($this->context->language->id);

		// Récupération des adresses du client
        $addresses = $this->context->customer->getAddresses($this->context->language->id);
        
        $this->context->smarty->assign(array(
            'has_customer_an_address' => empty($has_address),
            'voucherAllowed' => (int)CartRule::isFeatureActive(),
            'returnAllowed' => (int)Configuration::get('PS_ORDER_RETURN'),

        	// Passage des adresses au template
            'addresses' => $addresses,
        ));
        $this->context->smarty->assign('HOOK_CUSTOMER_ACCOUNT', Hook::exec('displayCustomerAccount'));

        $this->setTemplate(_PS_THEME_DIR_.'my-account.tpl');
    }

 

Link to comment
Share on other sites

17 minutes ago, erouvier29 said:

Page blanche = erreur PHP a priori, donc non, ce n'est pas le bon code

Il ne faut pas ajouter tout le code de AddressesController, mais modifier uniquement la fonction initContent dans MyAccountController en s'inspirant de ce qui est fait dans l'autre

Code original PS 1.6.1.23:


    public function initContent()
    {
        parent::initContent();

        $has_address = $this->context->customer->getAddresses($this->context->language->id);
        $this->context->smarty->assign(array(
            'has_customer_an_address' => empty($has_address),
            'voucherAllowed' => (int)CartRule::isFeatureActive(),
            'returnAllowed' => (int)Configuration::get('PS_ORDER_RETURN')
        ));
        $this->context->smarty->assign('HOOK_CUSTOMER_ACCOUNT', Hook::exec('displayCustomerAccount'));

        $this->setTemplate(_PS_THEME_DIR_.'my-account.tpl');
    }

Code modifié:
 


  public function initContent()
    {
        parent::initContent();

        $has_address = $this->context->customer->getAddresses($this->context->language->id);

		// Récupération des adresses du client
        $addresses = $this->context->customer->getAddresses($this->context->language->id);
        
        $this->context->smarty->assign(array(
            'has_customer_an_address' => empty($has_address),
            'voucherAllowed' => (int)CartRule::isFeatureActive(),
            'returnAllowed' => (int)Configuration::get('PS_ORDER_RETURN'),

        	// Passage des adresses au template
            'addresses' => $addresses,
        ));
        $this->context->smarty->assign('HOOK_CUSTOMER_ACCOUNT', Hook::exec('displayCustomerAccount'));

        $this->setTemplate(_PS_THEME_DIR_.'my-account.tpl');
    }

 

Voici mon code modifié dans my account.php,

   /**
     * Assign template vars related to page content
     * @see FrontController::initContent()
     */
    public function initContent()
    {
		global $cookie;
        parent::initContent();
$groups=Customer::getGroupsStatic($cookie->id_customer);
        $has_address = $this->context->customer->getAddresses($this->context->language->id);
		// Récupération des adresses du client
        $addresses = $this->context->customer->getAddresses($this->context->language->id);
        $this->context->smarty->assign(array(
            'has_customer_an_address' => empty($has_address),
            'voucherAllowed' => (int)CartRule::isFeatureActive(),
			'group' => $groups[0],
            'returnAllowed' => (int)Configuration::get('PS_ORDER_RETURN'),
			// Passage des adresses au template
            'addresses' => $addresses,
        ));
        $this->context->smarty->assign('HOOK_CUSTOMER_ACCOUNT', Hook::exec('displayCustomerAccount'));

        $this->setTemplate(_PS_THEME_DIR_.'my-account.tpl');
    }
}

J'ai ajouté le code dans my account.tpl

<div>
  La livraison aura lieu à <span id="capture_invoice_address">
    {foreach from=$addresses key=k item=address}
      {if $address.id_address == $cart->id_invoice_delivery}
        {$address.postcode} {$address.city}
      {/if}
    {/foreach}
  </span>
</div>

mais rien ne s'affiche

Link to comment
Share on other sites

Ha, y a du mieux, j'arrive à afficher le code postal et la ville.

Mais impossible d'afficher l'adresse de facturation.

J'ai repris ton code d'origine dans le tpl

<span id="capture_delivery_address">
    {foreach from=$addresses key=k item=address}
      {if $address.id_address == $cart->id_address_delivery}
        {$address.postcode} {$address.city}
      {/if}
    {/foreach}
  </span>

 

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...