Jump to content

Email shows only Placeholders and not the values


Glasso

Recommended Posts

Hi,

 

My prestashop emails show only the placeholders and the actual values are not being substituted.

This worked fine before until one of the prestashop updates. I am on prestashop 1.6.1.6

 

Please see the attached for an example.

 

Appreciate any pointers.

 

Thanks.

 

post-1181295-0-45400000-1472919322_thumb.png

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

It's the $data array starting on line 705 (in PrestaShop v1.6.1.7) of classes/PaymentModule.php that creates those variables, so make sure that it exists and isn't being removed by an override in override/classes/PaymentModule.php:

                        $data = array(
                        '{firstname}' => $this->context->customer->firstname,
                        '{lastname}' => $this->context->customer->lastname,
                        '{email}' => $this->context->customer->email,
                        '{delivery_block_txt}' => $this->_getFormatedAddress($delivery, "\n"),
                        '{invoice_block_txt}' => $this->_getFormatedAddress($invoice, "\n"),
                        '{delivery_block_html}' => $this->_getFormatedAddress($delivery, '<br />', array(
                            'firstname'    => '<span style="font-weight:bold;">%s</span>',
                            'lastname'    => '<span style="font-weight:bold;">%s</span>'
                        )),
                        '{invoice_block_html}' => $this->_getFormatedAddress($invoice, '<br />', array(
                                'firstname'    => '<span style="font-weight:bold;">%s</span>',
                                'lastname'    => '<span style="font-weight:bold;">%s</span>'
                        )),
                        '{delivery_company}' => $delivery->company,
                        '{delivery_firstname}' => $delivery->firstname,
                        '{delivery_lastname}' => $delivery->lastname,
                        '{delivery_address1}' => $delivery->address1,
                        '{delivery_address2}' => $delivery->address2,
                        '{delivery_city}' => $delivery->city,
                        '{delivery_postal_code}' => $delivery->postcode,
                        '{delivery_country}' => $delivery->country,
                        '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '',
                        '{delivery_phone}' => ($delivery->phone) ? $delivery->phone : $delivery->phone_mobile,
                        '{delivery_other}' => $delivery->other,
                        '{invoice_company}' => $invoice->company,
                        '{invoice_vat_number}' => $invoice->vat_number,
                        '{invoice_firstname}' => $invoice->firstname,
                        '{invoice_lastname}' => $invoice->lastname,
                        '{invoice_address2}' => $invoice->address2,
                        '{invoice_address1}' => $invoice->address1,
                        '{invoice_city}' => $invoice->city,
                        '{invoice_postal_code}' => $invoice->postcode,
                        '{invoice_country}' => $invoice->country,
                        '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '',
                        '{invoice_phone}' => ($invoice->phone) ? $invoice->phone : $invoice->phone_mobile,
                        '{invoice_other}' => $invoice->other,
                        '{order_name}' => $order->getUniqReference(),
                        '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), null, 1),
                        '{carrier}' => ($virtual_product || !isset($carrier->name)) ? Tools::displayError('No carrier') : $carrier->name,
                        '{payment}' => Tools::substr($order->payment, 0, 32),
                        '{products}' => $product_list_html,
                        '{products_txt}' => $product_list_txt,
                        '{discounts}' => $cart_rules_list_html,
                        '{discounts_txt}' => $cart_rules_list_txt,
                        '{total_paid}' => Tools::displayPrice($order->total_paid, $this->context->currency, false),
                        '{total_products}' => Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $order->total_products : $order->total_products_wt, $this->context->currency, false),
                        '{total_discounts}' => Tools::displayPrice($order->total_discounts, $this->context->currency, false),
                        '{total_shipping}' => Tools::displayPrice($order->total_shipping, $this->context->currency, false),
                        '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $this->context->currency, false),
                        '{total_tax_paid}' => Tools::displayPrice(($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $this->context->currency, false));
  • Like 1
Link to comment
Share on other sites

Thanks rocky for the guidance, much appreciated.

 

Here are my findings:

  • classes/PaymentModule.php has exactly as you noted above, no changes
  • There is no override override/classes/PaymentModule.php. Actually there is no other override file in the whole directory and its subfolders.

 

  • Is it possible that the email template order_conf is referencing the wrong variables?
    • As an example, in mails/en folder I have the email template order_conf.html references {products} (quoted below)
    • PaymentModule.php has '{products}' => $product_list_html
    • However the folder mails/en does not have product_list_html.tpl but has only order_conf_product_list.tpl
    • Should the right variable have been order_conf_product_list?

 

Any more ideas on what else to look for?

Thanks.

 {shop_name}
Hi {firstname} {lastname},
Thank you for shopping with {shop_name}!
 
  	

Order details
Order: {order_name} Placed on {date}

Payment: {payment} 	 
Reference 	Product 	Unit price 	Quantity 	Total price
  {products}
  {discounts}
  	Products 	 
	
  	{total_products} 	 
  	Discounts 	 
	
  	{total_discounts} 	 
  	Gift-wrapping 	 
	
  	{total_wrapping} 	 
  	Shipping 	 
	
  	{total_shipping} 	 
  	Total Tax paid 	 
	
  	{total_tax_paid} 	 
  	Total paid 	 
	
  	{total_paid} 	 
  	

Shipping
Carrier: {carrier}

Payment: {payment} 	 
 
  	

Delivery address
{delivery_block_html} 	 
	  	
  	

Billing address
{invoice_block_html} 	 
 
You can review your order and download your invoice from the "Order history" section of your customer account by clicking "My account" on our shop.
If you have a guest account, you can follow your order via the "Guest Tracking" section on our shop.
 
{shop_name} powered by PrestaShop™
Edited by Glasso (see edit history)
Link to comment
Share on other sites

That explains why it isn't working. You've changed where the order confirmation email is sent. The order confirmation variables are not set at that point. You've made things difficult for yourself by doing that, though it is still possible to fix.
 
You'll need to override the sendEmail function of the OrderHistory class and changes lines 424-429 from:
            $data = array(
                '{lastname}' => $result['lastname'],
                '{firstname}' => $result['firstname'],
                '{id_order}' => (int)$this->id_order,
                '{order_name}' => $order->getUniqReference()
            );

to:

            if ($result['template'] == 'order_conf') {
                // Construct order detail table for the email
                $products_list = '';
                $virtual_product = true;

                $product_var_tpl_list = array();
                foreach ($order->product_list as $product) {
                    $price = Product::getPriceStatic((int)$product['id_product'], false, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 6, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
                    $price_wt = Product::getPriceStatic((int)$product['id_product'], true, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 2, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')});

                    $product_price = Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt;

                    $product_var_tpl = array(
                        'reference' => $product['reference'],
                        'name' => $product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : ''),
                        'unit_price' => Tools::displayPrice($product_price, $this->context->currency, false),
                        'price' => Tools::displayPrice($product_price * $product['quantity'], $this->context->currency, false),
                        'quantity' => $product['quantity'],
                        'customization' => array()
                    );

                    $customized_datas = Product::getAllCustomizedDatas((int)$order->id_cart);
                    if (isset($customized_datas[$product['id_product']][$product['id_product_attribute']])) {
                        $product_var_tpl['customization'] = array();
                        foreach ($customized_datas[$product['id_product']][$product['id_product_attribute']][$order->id_address_delivery] as $customization) {
                            $customization_text = '';
                            if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD])) {
                                foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] as $text) {
                                    $customization_text .= $text['name'].': '.$text['value'].'<br />';
                                }
                            }

                            if (isset($customization['datas'][Product::CUSTOMIZE_FILE])) {
                                $customization_text .= sprintf(Tools::displayError('%d image(s)'), count($customization['datas'][Product::CUSTOMIZE_FILE])).'<br />';
                            }

                            $customization_quantity = (int)$product['customization_quantity'];

                            $product_var_tpl['customization'][] = array(
                                'customization_text' => $customization_text,
                                'customization_quantity' => $customization_quantity,
                                'quantity' => Tools::displayPrice($customization_quantity * $product_price, $this->context->currency, false)
                            );
                        }
                    }

                    $product_var_tpl_list[] = $product_var_tpl;
                    // Check if is not a virutal product for the displaying of shipping
                    if (!$product['is_virtual']) {
                        $virtual_product &= false;
                    }
                } // end foreach ($products)

                $product_list_txt = '';
                $product_list_html = '';
                if (count($product_var_tpl_list) > 0) {
                    $product_list_txt = $this->getEmailTemplateContent('order_conf_product_list.txt', Mail::TYPE_TEXT, $product_var_tpl_list);
                    $product_list_html = $this->getEmailTemplateContent('order_conf_product_list.tpl', Mail::TYPE_HTML, $product_var_tpl_list);
                }

                $cart_rules_list = array();
                $total_reduction_value_ti = 0;
                $total_reduction_value_tex = 0;
                foreach ($cart_rules as $cart_rule) {
                    $package = array('id_carrier' => $order->id_carrier, 'id_address' => $order->id_address_delivery, 'products' => $order->product_list);
                    $values = array(
                        'tax_incl' => $cart_rule['obj']->getContextualValue(true, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package),
                        'tax_excl' => $cart_rule['obj']->getContextualValue(false, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package)
                    );

                    // If the reduction is not applicable to this order, then continue with the next one
                    if (!$values['tax_excl']) {
                        continue;
                    }

                    // IF
                    //	This is not multi-shipping
                    //	The value of the voucher is greater than the total of the order
                    //	Partial use is allowed
                    //	This is an "amount" reduction, not a reduction in % or a gift
                    // THEN
                    //	The voucher is cloned with a new value corresponding to the remainder
                    if (count($order_list) == 1 && $values['tax_incl'] > ($order->total_products_wt - $total_reduction_value_ti) && $cart_rule['obj']->partial_use == 1 && $cart_rule['obj']->reduction_amount > 0) {
                        // Create a new voucher from the original
                        $voucher = new CartRule((int)$cart_rule['obj']->id); // We need to instantiate the CartRule without lang parameter to allow saving it
                        unset($voucher->id);

                        // Set a new voucher code
                        $voucher->code = empty($voucher->code) ? substr(md5($order->id.'-'.$order->id_customer.'-'.$cart_rule['obj']->id), 0, 16) : $voucher->code.'-2';
                        if (preg_match('/\-([0-9]{1,2})\-([0-9]{1,2})$/', $voucher->code, $matches) && $matches[1] == $matches[2]) {
                            $voucher->code = preg_replace('/'.$matches[0].'$/', '-'.(intval($matches[1]) + 1), $voucher->code);
                        }

                        // Set the new voucher value
                        if ($voucher->reduction_tax) {
                            $voucher->reduction_amount = ($total_reduction_value_ti + $values['tax_incl']) - $order->total_products_wt;

                            // Add total shipping amout only if reduction amount > total shipping
                            if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_incl) {
                                $voucher->reduction_amount -= $order->total_shipping_tax_incl;
                            }
                        } else {
                            $voucher->reduction_amount = ($total_reduction_value_tex + $values['tax_excl']) - $order->total_products;

                            // Add total shipping amout only if reduction amount > total shipping
                            if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_excl) {
                                $voucher->reduction_amount -= $order->total_shipping_tax_excl;
                            }
                        }
                        if ($voucher->reduction_amount <= 0) {
                            continue;
                        }

                        if ($this->context->customer->isGuest()) {
                            $voucher->id_customer = 0;
                        } else {
                            $voucher->id_customer = $order->id_customer;
                        }

                        $voucher->quantity = 1;
                        $voucher->reduction_currency = $order->id_currency;
                        $voucher->quantity_per_user = 1;
                        $voucher->free_shipping = 0;
                        if ($voucher->add()) {
                            // If the voucher has conditions, they are now copied to the new voucher
                            CartRule::copyConditions($cart_rule['obj']->id, $voucher->id);

                            $params = array(
                                '{voucher_amount}' => Tools::displayPrice($voucher->reduction_amount, $this->context->currency, false),
                                '{voucher_num}' => $voucher->code,
                                '{firstname}' => $this->context->customer->firstname,
                                '{lastname}' => $this->context->customer->lastname,
                                '{id_order}' => $order->reference,
                                '{order_name}' => $order->getUniqReference()
                            );
                            Mail::Send(
                                (int)$order->id_lang,
                                'voucher',
                                sprintf(Mail::l('New voucher for your order %s', (int)$order->id_lang), $order->reference),
                                $params,
                                $this->context->customer->email,
                                $this->context->customer->firstname.' '.$this->context->customer->lastname,
                                null, null, null, null, _PS_MAIL_DIR_, false, (int)$order->id_shop
                            );
                        }

                        $values['tax_incl'] = $order->total_products_wt - $total_reduction_value_ti;
                        $values['tax_excl'] = $order->total_products - $total_reduction_value_tex;
                    }
                    $total_reduction_value_ti += $values['tax_incl'];
                    $total_reduction_value_tex += $values['tax_excl'];

                    $order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping);

                    if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && !in_array($cart_rule['obj']->id, $cart_rule_used)) {
                        $cart_rule_used[] = $cart_rule['obj']->id;

                        // Create a new instance of Cart Rule without id_lang, in order to update its quantity
                        $cart_rule_to_update = new CartRule((int)$cart_rule['obj']->id);
                        $cart_rule_to_update->quantity = max(0, $cart_rule_to_update->quantity - 1);
                        $cart_rule_to_update->update();
                    }

                    $cart_rules_list[] = array(
                        'voucher_name' => $cart_rule['obj']->name,
                        'voucher_reduction' => ($values['tax_incl'] != 0.00 ? '-' : '').Tools::displayPrice($values['tax_incl'], $this->context->currency, false)
                    );
                }

                $cart_rules_list_txt = '';
                $cart_rules_list_html = '';
                if (count($cart_rules_list) > 0) {
                    $cart_rules_list_txt = $this->getEmailTemplateContent('order_conf_cart_rules.txt', Mail::TYPE_TEXT, $cart_rules_list);
                    $cart_rules_list_html = $this->getEmailTemplateContent('order_conf_cart_rules.tpl', Mail::TYPE_HTML, $cart_rules_list);
                }

                $invoice = new Address((int)$order->id_address_invoice);
                $delivery = new Address((int)$order->id_address_delivery);
                $delivery_state = $delivery->id_state ? new State((int)$delivery->id_state) : false;
                $invoice_state = $invoice->id_state ? new State((int)$invoice->id_state) : false;

                $data = array(
                '{firstname}' => $this->context->customer->firstname,
                '{lastname}' => $this->context->customer->lastname,
                '{email}' => $this->context->customer->email,
                '{delivery_block_txt}' => $this->_getFormatedAddress($delivery, "\n"),
                '{invoice_block_txt}' => $this->_getFormatedAddress($invoice, "\n"),
                '{delivery_block_html}' => $this->_getFormatedAddress($delivery, '<br />', array(
                    'firstname'    => '<span style="font-weight:bold;">%s</span>',
                    'lastname'    => '<span style="font-weight:bold;">%s</span>'
                )),
                '{invoice_block_html}' => $this->_getFormatedAddress($invoice, '<br />', array(
                        'firstname'    => '<span style="font-weight:bold;">%s</span>',
                        'lastname'    => '<span style="font-weight:bold;">%s</span>'
                )),
                '{delivery_company}' => $delivery->company,
                '{delivery_firstname}' => $delivery->firstname,
                '{delivery_lastname}' => $delivery->lastname,
                '{delivery_address1}' => $delivery->address1,
                '{delivery_address2}' => $delivery->address2,
                '{delivery_city}' => $delivery->city,
                '{delivery_postal_code}' => $delivery->postcode,
                '{delivery_country}' => $delivery->country,
                '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '',
                '{delivery_phone}' => ($delivery->phone) ? $delivery->phone : $delivery->phone_mobile,
                '{delivery_other}' => $delivery->other,
                '{invoice_company}' => $invoice->company,
                '{invoice_vat_number}' => $invoice->vat_number,
                '{invoice_firstname}' => $invoice->firstname,
                '{invoice_lastname}' => $invoice->lastname,
                '{invoice_address2}' => $invoice->address2,
                '{invoice_address1}' => $invoice->address1,
                '{invoice_city}' => $invoice->city,
                '{invoice_postal_code}' => $invoice->postcode,
                '{invoice_country}' => $invoice->country,
                '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '',
                '{invoice_phone}' => ($invoice->phone) ? $invoice->phone : $invoice->phone_mobile,
                '{invoice_other}' => $invoice->other,
                '{order_name}' => $order->getUniqReference(),
                '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), null, 1),
                '{carrier}' => ($virtual_product || !isset($carrier->name)) ? Tools::displayError('No carrier') : $carrier->name,
                '{payment}' => Tools::substr($order->payment, 0, 32),
                '{products}' => $product_list_html,
                '{products_txt}' => $product_list_txt,
                '{discounts}' => $cart_rules_list_html,
                '{discounts_txt}' => $cart_rules_list_txt,
                '{total_paid}' => Tools::displayPrice($order->total_paid, $this->context->currency, false),
                '{total_products}' => Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $order->total_products : $order->total_products_wt, $this->context->currency, false),
                '{total_discounts}' => Tools::displayPrice($order->total_discounts, $this->context->currency, false),
                '{total_shipping}' => Tools::displayPrice($order->total_shipping, $this->context->currency, false),
                '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $this->context->currency, false),
                '{total_tax_paid}' => Tools::displayPrice(($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $this->context->currency, false));
                
            } else {            
                $data = array(
                    '{lastname}' => $result['lastname'],
                    '{firstname}' => $result['firstname'],
                    '{id_order}' => (int)$this->id_order,
                    '{order_name}' => $order->getUniqReference()
                );
            }

Basically, I've copied all the code related to creating the order confirmation template variables from the PaymentModule class and used an if statement to only execute that code when the template name is 'order_conf'.

 

You'll also need to copy the getEmailTemplateContent function from the PaymentModule class for the cart rules to display properly.

 

Good luck. Please post the override if you're able to get it working.

  • Like 1
Link to comment
Share on other sites

Thanks Rocky, the reason I have it at delivery is that most of our order are COD and there is a significant level of change to the ordered items at actual delivery.

 

However, the changes to make this work seem significant and I would rather live with sending the email at order alone.

 

Many thanks for your kind support, you really rock!

  • Like 1
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...