Jump to content
  • 0

Wysyłanie powiadomienia do klienta o złożonym zamówieniu.


Vipktor

Question

Mam pytanko do kolegów. Może ktoś wie.

W PS 1.4.4.1 w katalogu /mails są szablony z których korzysta presta do wysyłania powiadomień np o złożonym zamówieniu.

Pytanko:

Gdzie w preście definiowane są dane (zmienne) które następnie podstawiane są w szablonach /mails i wysyłane do klienta ?

Który plik ? klasa ? odpowiada w PS za wysyłanie tych powiadomień?

 

Będę wdzięczny za podpowiedź.

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

wszystko zależy od maila jaki jest wysyłany,

niektóre z modułów mają swoje kontrolery odpowiedzialne za wysyłanie maili

sprecyzuj o który mail chodzi

Witam

MIło że jest ktoś to może mi pomoże. Chodzi mi o kontroler który przygotowuje dane pod szablon /mails/pl/order_conf.html

mail z potwierdzeniem złożenia zamówienia wysyłany do klienta. Tam są zmienne m.in {total_products}, {total_discounts}, ... {total_paid} i inne

Gdzie te zmienne sa przygotowywane ?

 

Może koledzy wiedzą też który kontroler jest odpowiedzialny za złożenie zamówienia w sklepie. Chodzi mi o końcową fazę tzn moment kiedy kontroler zapisuje dane do tabeli 'oreders', 'order_detail', ' order_histry' itd.

 

Próbuje obejść jedną żecz. A mianowicie nie wiem jak zrobić aby koszty wysyłki były wliczane w ceny produktów netto. I zrobiłem jak gdyby połowę. Dopisałem do tabeli order_history rtigger który po złożeniu zamówienia zmioenia mi dane w tabelach ordes i orders_detail. Przelicza cene dostawy i wlicza w ceny produktów. Wszystko fajnie bo na stronie po złożeniu zamówienia ładnie wszystko jest wyliczone. W historii zamówień też 'bajka', problem z tym że do klienta trafa zamówienie maile w starej formie.

Znalazłem kontroler odpowiedzialny za wysyłanie maila jak klient płaci przelewem i spoko tam tez mogę pozmieniać wyliczenia ale nie mogę teraz znaleść kontrolera który poprostu wysyła potwierdzenie złożenia zamówienia. I tak klient na stronie ma co innego a w mailu co innego i ty mam problem.

Wiem że takie obejście problemu jest mało prof. ale bardzie znam się na bazach danych niż na samej prescie. Może ktoś ma pomysł.

Będę wdzieczny za każdą pomoc lub wskazówkę.

 

(ps. ktoś się może dziwić po co wliczać koszty przesyłki w produkty ? Hmmm niestety większość o tym nie wie ale jak sporzy się na ustawę o VAT to wyraźnie jest napisane że nie można sprzedawać np książek z VAT 5% i dodawać wysyłkę z 23% VAT. Do pierwszej kontroli US jest ok a później trzeb zmienić sposób wystawiania faktur. - po to to wszystko)

 

Dziekuje, pozdrawiam

Link to comment
Share on other sites

  • 0

chodzi o klasę PaymentModule.php

jest tam taki kod:

	// Send an e-mail to customer (one order = one email)
					if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && $this->context->customer->id)
					{
						$invoice = new Address($order->id_address_invoice);
						$delivery = new Address($order->id_address_delivery);
						$delivery_state = $delivery->id_state ? new State($delivery->id_state) : false;
						$invoice_state = $invoice->id_state ? new State($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 ? Tools::displayError('No carrier') : $carrier->name,
						'{payment}' => Tools::substr($order->payment, 0, 32),
						'{products}' => $this->formatProductAndVoucherForEmail($products_list),
						'{discounts}' => $this->formatProductAndVoucherForEmail($cart_rules_list),
						'{total_paid}' => Tools::displayPrice($order->total_paid, $this->context->currency, false),
						'{total_products}' => Tools::displayPrice($order->total_paid - $order->total_shipping - $order->total_wrapping + $order->total_discounts, $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));

						if (is_array($extra_vars))
							$data = array_merge($data, $extra_vars);

						// Join PDF invoice
						if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number)
						{
							$pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty);
							$file_attachement['content'] = $pdf->render(false);
							$file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf';
							$file_attachement['mime'] = 'application/pdf';
						}
						else
							$file_attachement = null;

						if (Validate::isEmail($this->context->customer->email))
							Mail::Send(
								(int)$order->id_lang,
								'order_conf',
								Mail::l('Order confirmation', (int)$order->id_lang),
								$data,
								$this->context->customer->email,
								$this->context->customer->firstname.' '.$this->context->customer->lastname,
								null,
								null,
								$file_attachement,
								null, _PS_MAIL_DIR_, false, (int)$order->id_shop
							);
					}

listę zmiennych chyba widać dobrze ;)

Link to comment
Share on other sites

  • 0

chodzi o klasę PaymentModule.php

jest tam taki kod:

	// Send an e-mail to customer (one order = one email)
					if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && $this->context->customer->id)
					{
						$invoice = new Address($order->id_address_invoice);
						$delivery = new Address($order->id_address_delivery);
						$delivery_state = $delivery->id_state ? new State($delivery->id_state) : false;
						$invoice_state = $invoice->id_state ? new State($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 ? Tools::displayError('No carrier') : $carrier->name,
						'{payment}' => Tools::substr($order->payment, 0, 32),
						'{products}' => $this->formatProductAndVoucherForEmail($products_list),
						'{discounts}' => $this->formatProductAndVoucherForEmail($cart_rules_list),
						'{total_paid}' => Tools::displayPrice($order->total_paid, $this->context->currency, false),
						'{total_products}' => Tools::displayPrice($order->total_paid - $order->total_shipping - $order->total_wrapping + $order->total_discounts, $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));

						if (is_array($extra_vars))
							$data = array_merge($data, $extra_vars);

						// Join PDF invoice
						if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number)
						{
							$pdf = new PDF($order->getInvoicesCollection(), PDF::TEMPLATE_INVOICE, $this->context->smarty);
							$file_attachement['content'] = $pdf->render(false);
							$file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf';
							$file_attachement['mime'] = 'application/pdf';
						}
						else
							$file_attachement = null;

						if (Validate::isEmail($this->context->customer->email))
							Mail::Send(
								(int)$order->id_lang,
								'order_conf',
								Mail::l('Order confirmation', (int)$order->id_lang),
								$data,
								$this->context->customer->email,
								$this->context->customer->firstname.' '.$this->context->customer->lastname,
								null,
								null,
								$file_attachement,
								null, _PS_MAIL_DIR_, false, (int)$order->id_shop
							);
					}

listę zmiennych chyba widać dobrze ;)

Witam

Dziekuje za szybką podpowiedź.

rozumiem, że jest to klasa odpowiedzialna za przygotowanie zmiennych do wysyłki maila, nie zaś za zapis danych zamówienia do bazy.

 

Czytałem kilka postów kolegi (m.in i pobieraniu danych z bazy dopisując funkcję we frontcontroler) i wpadłem tez na pomysł, że aby tego (tej klasy powyżej) nie modyfikować można by we frontcontrolerze dopisać funkcję, która pobierałaby z bazy dane zamówienia (czyli z bazy orders i order_detail, bo tam trigger już wszystko ładnie powyliczał) i odnosić się do niej w szablonach maili.

Co kolega o tym sądzi ?

 

Troche to partyzantka, ale sam modułu nie napisze, który mógłby zapisywać koszty do towarów.

 

Dziękuje i pozdrawaim.

 

(PS jak się uporam z tematem to chętnie przekaże innym chetnym)

Link to comment
Share on other sites

  • 0

 

 

Czytałem kilka postów kolegi (m.in i pobieraniu danych z bazy dopisując funkcję we frontcontroler) i wpadłem tez na pomysł, że aby tego (tej klasy powyżej) nie modyfikować można by we frontcontrolerze dopisać funkcję, która pobierałaby z bazy dane zamówienia (czyli z bazy orders i order_detail, bo tam trigger już wszystko ładnie powyliczał) i odnosić się do niej w szablonach maili.

myślę, że może być,

ale na jedno wyjdzie czy zmodyfikujemy front controller, czy klasę paymentmodule

a nie lepiej mieć wszystko w jednym miejscu? ;)

Link to comment
Share on other sites

  • 0

myślę, że może być,

ale na jedno wyjdzie czy zmodyfikujemy front controller, czy klasę paymentmodule

a nie lepiej mieć wszystko w jednym miejscu? ;)

 

I tu sie z kolegą zgodzę. Najlepiej mieć wszystko w jednym miejscu.

Zauważyłem że w klasie paymentmodule jest kod odpowiedzialny za przepisanie koszyka do order_detail .... hmmm prowokuje mnie to do usunięcia triggera i ingerencji w ten kod.

 

Dziękuje za pomoc.

Zamkne post jak napiszę rozwiązanie.

Pozdrawiam

Link to comment
Share on other sites

  • 0

I tu sie z kolegą zgodzę. Najlepiej mieć wszystko w jednym miejscu.

Zauważyłem że w klasie paymentmodule jest kod odpowiedzialny za przepisanie koszyka do order_detail .... hmmm prowokuje mnie to do usunięcia triggera i ingerencji w ten kod.

 

Dziękuje za pomoc.

Zamkne post jak napiszę rozwiązanie.

Pozdrawiam

 

Posze jeszcze o podpowiedź:

 

Jak zmienić wartość: $cart->getOrderTotal(true, Cart::ONLY_PRODUCTS); ???

 

Pozdrawiam

 

P.S. Utknąłem przez to ;)

Link to comment
Share on other sites

  • 0

można np. podstawić ją do zmiennej

$value=$cart->getOrderTotal(true, Cart::ONLY_PRODUCTS);

wtedy możesz robić co chcesz na zmiennej $value

 

ale coś mi mówi, że nie o to pytasz... 

Tak. Kolego. To potrafię. Ale w takim wypadku $value dostępne jest od momentu przypisania i tym kodzie.

Natomiast gdyby była możliwość :

$cart->getOrderTotal(true, Cart::ONLY_PRODUCTS) = "jakas nowa wartość";

To byloby to czego potrzebuję.

 

Pytanie tylko jak ? Czy się da ?

 

Pozdrawiam

Link to comment
Share on other sites

  • 0

w classes/Cart.php jest funkcja getOrderTotal (jest ona dość spora więc jej tu nie wkleję, sądzę jednak, że wiesz o co chodzi, więc nie ma potrzeby wklejania jej tutaj w całości)

 

generalnie, najprościej rzecz ujmując, całość najistotniejszych operacji odbywa się na zmiennej $order_total i to ona jest zwracana.

i to na niej musiałbyś wykonać odpowiednie operacje

Link to comment
Share on other sites

  • 0

Witam kolege ponownie.

Ugrzązłem w Cart.php. Już prawie wszytskoł ładnie chodzi ale napotkałem problem z którym nie potrafię sobie poradzić.

Otóż. Aby móc dodac cenę przesyłki do towaru to biorę koszty wysyłki ($przesylka)  i dziele je na ilość towaru w koszytku (nbProducts()), po czym dodaje to co wyjedzie ($dolicz) do każdej sztuki towaru.

 

$przesylka = $this->getOrderShippingCost();

lub
$przesylka = $this->getOrderTotal(true, Cart::ONLY_SHIPPING);

 

$dolicz = $przesylka / $this->nbProducts();

 

 

 

Ładnie chodzi ale przy pobieraniu kosztów wysyłki (linia wyboldowana poniżej) :

.................................................

Cerd.php (public function getProducts) od linii 370: i dalej:

 

      // Thus you can avoid one query per product, because there will be only one query for all the products of the cart
      Product::cacheProductsFeatures($productsIds);

      self::cacheSomeAttributesLists($paIds, $this->id_lang);
        
        
        $this->_products = array();
        if (empty($result))
            return array();

       $przesylka = $this->getOrderShippingCost();

lub
      $przesylka = $this->getOrderTotal(true, Cart::ONLY_SHIPPING);

 

        foreach ($result AS $row)
        {
            if (isset($row['ecotax_attr']) AND $row['ecotax_attr'] > 0)
                $row['ecotax'] = (float)($row['ecotax_attr']);
            $row['stock_quantity'] = (int)($row['quantity']);

........................................................................................

wystarczy ze którąś z tych lini włącze i pojawia się problem z dodawaniem rabatów.

Nie działa dodawanie rabatów ani ilościowych ani kosztwoych, żadnych.

 

Czy Kolega mógłby zerknąć i może naprowadzi mnie gdzie moze być bład.

Wkońcu przypisanie do zmiennej wartości funkcji nie powinno blokować niczego.

 

Stoje już 3 dzień i nie mogę soebie z tym poradzić.

 

Bardzo rposze o pomoc.

Pozdrawiam

Viktor

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