Antoniolav Posted April 1, 2015 Share Posted April 1, 2015 (edited) 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 April 1, 2015 by Antoniolav (see edit history) Link to comment Share on other sites More sharing options...
erouvier29 Posted April 1, 2015 Share Posted April 1, 2015 (edited) 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 April 1, 2015 by erouvier29 (see edit history) 1 Link to comment Share on other sites More sharing options...
Antoniolav Posted April 1, 2015 Author Share Posted April 1, 2015 (edited) 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 : 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 April 1, 2015 by Antoniolav (see edit history) Link to comment Share on other sites More sharing options...
Manu-41 Posted April 5, 2020 Share Posted April 5, 2020 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 More sharing options...
erouvier29 Posted April 5, 2020 Share Posted April 5, 2020 (edited) Ajoutez temporairement {debug} au début de votre tpl, et vérifiez le contenu de $addresses et $cart Edited April 5, 2020 by erouvier29 (see edit history) Link to comment Share on other sites More sharing options...
Manu-41 Posted April 5, 2020 Share Posted April 5, 2020 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 More sharing options...
erouvier29 Posted April 6, 2020 Share Posted April 6, 2020 Modifiez controllers/front/MyAccountController.php de façon à assigner la variable smarty $addresses, comme cela est fait dans controllers/front/AddressesController.php (fonctions initContent()) Link to comment Share on other sites More sharing options...
Manu-41 Posted April 6, 2020 Share Posted April 6, 2020 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 More sharing options...
erouvier29 Posted April 6, 2020 Share Posted April 6, 2020 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 More sharing options...
Manu-41 Posted April 6, 2020 Share Posted April 6, 2020 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 More sharing options...
Manu-41 Posted April 6, 2020 Share Posted April 6, 2020 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 More sharing options...
erouvier29 Posted April 6, 2020 Share Posted April 6, 2020 Au moins le texte "La livraison aura lieu à" s'affiche-t-il ? En remettant {debug} au début de my-account.tpl, quels sont les contenus de $addresses et $cart ? Link to comment Share on other sites More sharing options...
erouvier29 Posted April 6, 2020 Share Posted April 6, 2020 (edited) Si l'adresse de livraison s'affiche avec id_address_delivery, celle de facturation s'affichera avec id_address_invoice. Il se peut néanmoins que id_address_invoice reste à 0, auquel cas cela veut dire que facturation = livraison Edited April 6, 2020 by erouvier29 (see edit history) Link to comment Share on other sites More sharing options...
Manu-41 Posted April 6, 2020 Share Posted April 6, 2020 J'ai réussi à afficher l'adresse complète. Je vais faire des test pour savoir si c'est l'adresse de facturation qui reviens à chaque fois. Mille merci pour ton aide précieuse. 😉 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now