From 47ab1e09553524a61b08e7dd69c96f811996069c Mon Sep 17 00:00:00 2001 From: Konrad Rosenbaum Date: Fri, 8 Jul 2016 22:06:50 +0200 Subject: [PATCH] update twig, some cleanup/docu, update ordermail example for MIME --- twig | 2 +- www/inc/classes/basevars.php | 3 - www/inc/rendering/order_listing.php | 256 ------------------------- www/inc/rendering/twig_extensions.php | 14 ++- www/index.php | 50 ++--- www/template/en/ordermail.txt | 336 +++++++++++++++++++++++++++++++- 6 files changed, 358 insertions(+), 303 deletions(-) delete mode 100644 www/inc/rendering/order_listing.php diff --git a/twig b/twig index 27f3428..42f758d 160000 --- a/twig +++ b/twig @@ -1 +1 @@ -Subproject commit 27f3428b08c7f656d6824359a9d9dee3f5fce31b +Subproject commit 42f758d9fe2146d1f0470604fc05ee43580873fc diff --git a/www/inc/classes/basevars.php b/www/inc/classes/basevars.php index 23b40ec..385926c 100644 --- a/www/inc/classes/basevars.php +++ b/www/inc/classes/basevars.php @@ -110,9 +110,6 @@ public static function initPriv(){ $basevars['script']['changeInvoiceAddress']=$BaseUrl."?mode=changeInvoiceAddress"; $basevars['script']['changeDeliveryAddress']=$BaseUrl."?mode=changeDeliveryAddress"; $basevars['script']['customerResetLogin']=$BaseUrl."?mode=customerResetLogin"; - //$basevars['script']['orderOverview']=$BaseUrl."?mode=orderOverview"; - //$basevars['script']['editShippingAddress']=$BaseUrl."?mode=editShippingAddress"; - //$basevars['script']['editOrderComments']=$BaseUrl."?mode=editOrderComments"; $basevars['script']['setlanguage']=$BaseUrl."?mode=setlanguage&lang="; // form elements $basevars['inputnames']['amountTickets']="amountTickets"; diff --git a/www/inc/rendering/order_listing.php b/www/inc/rendering/order_listing.php deleted file mode 100644 index ec554fc..0000000 --- a/www/inc/rendering/order_listing.php +++ /dev/null @@ -1,256 +0,0 @@ -destroySession(); - - $localParser = new Parser("orderlogin.html"); - - $localParser->setVar("fieldEMAIL", "ms_email"); - $localParser->setVar("radioIS_CUSTOMER", "ms_isCustomer"); - $localParser->setVar("fieldPASSWORD", "ms_password"); - $localParser->setVar("buttonCONTINUE", "ms_loginContinue"); - - if (!empty($_POST["ms_email"])) { - $localParser->setVar("valueEMAIL", $_POST["ms_email"]); - } else { - $localParser->setVar("valueEMAIL", ""); - } - - // set error message - if ($error->exists()) { - $localParser->setVar("IS_ERROR", "true"); - $localParser->setVar("ERRORAREA", $error->getAllFormatted()); - } - - // create page - $parser->setVAR("PAGE", $localParser->parseFile("orderlogin.html")); -} - -/** creates the view to register a new customer */ -function createCustomerRegistration() -{ - global $parser; - - $error = ErrorManager::singleton(); - - $localParser = new Parser("customerregistration.html"); - - $email = ""; - - // check if email is set and is an correct eMail-Address - if (isset($_GET["email"]) && isEmail($_GET["email"])) { - $email = $_GET["email"]; - - // set new POST-Url - $fullUrl = $parser->getVar("FULLURL"); - $newUrl = substr($fullUrl, 0, (strpos($fullUrl, "&")) - strlen($fullUrl)); - $localParser->setVar("FULLURL", $newUrl); - } - - // if email not available and no error, then it must be an intrusion - if (empty($email) && !$error->exists()) { - redirectHome(); - exit(); - } - - // set input fields - $localParser->setVar("fieldCUST_EMAIL", "ms_custEmail"); - $localParser->setVar("fieldCUST_NAME", "ms_custName"); - $localParser->setVar("fieldCUST_ADDRESS", "ms_custAddress"); - $localParser->setVar("fieldCUST_CONTACT", "ms_custContact"); - $localParser->setVar("fieldCUST_PASSWD", "ms_custPasswd"); - $localParser->setVar("fieldCUST_PASSWD2", "ms_custPasswd2"); - $localParser->setVar("buttonCUST_REGISTER", "ms_custRegister"); - - // set data - if (!$error->exists()) { - $localParser->setVar("CUST_EMAIL", $email); - $localParser->setVar("CUST_NAME", ""); - $localParser->setVar("CUST_ADDRESS", ""); - $localParser->setVar("CUST_CONTACT", ""); - } else { - $localParser->setVar("CUST_EMAIL", $_POST["ms_custEmail"]); - $localParser->setVar("CUST_NAME", $_POST["ms_custName"]); - $localParser->setVar("CUST_ADDRESS", $_POST["ms_custAddress"]); - $localParser->setVar("CUST_CONTACT", $_POST["ms_custContact"]); - } - - // set error message - if ($error->exists()) { - $localParser->setVar("ERROR", "true"); - $localParser->setVar("ERRORAREA", $error->getAllFormatted()); - } - - // create page - $parser->setVAR("PAGE", $localParser->parseFile("customerregistration.html")); -} - -/**creates the overview of an order */ -function createOrderOverview() -{ - global $parser; - - $error = ErrorManager::singleton(); - $lang = LanguageManager::singleton(); - - $p = new Parser("orderoverview.html"); - - // check if loggedin - $session = new WebSession(); - if (!$session->isAuthorized()) { - redirectHome(); - exit(); - } - - // set costumer data - $customer = $session->getCustomer(); - $p->setVars($customer->getParserData()); - - // set cart overview - $cart = new Cart($_COOKIE[COOKIE_CART]); - if ($cart->isValid()) { - // renew cart - $cart->renewCart(); - - $shippingAddress = ""; - $comments = ""; - - if (!isEmpty($shippingAddress = $cart->getShippingAddress())) - $shippingAddress .= " [".i18n("Change")."]"; - else - $shippingAddress = "[".i18n("Add")."]"; - - if (!isEmpty($comments = $cart->getOrderComments())) - $comments .= " [".i18n("Change")."]"; - else - $comments = "[".i18n("Add")."]"; - - $p->setVar("CUST_SHIPPINGADDRESS", $shippingAddress); - $p->setVar("CUST_COMMENTS", $comments); - } - - $tablerows = ""; - $totalsum = 0; - $hiddenfields = ""; - - // get tickets from cart - foreach ($cart->getTickets() as $ticket) - { - $cartRowTmpl = $p->getVar("ROW"); - $event = $ticket->eventObject(); - - // set event details - $p->setVars($event->getParserData()); - - // set amount - $p->setVar("AMOUNT", $ticket->getAmount()); - - // set row sum - $rowsum = $ticket->getAmount()*$event->getDefaultPrice(); - $p->setVar("ROWSUM", $lang->getPrice($rowsum)); - - $totalsum += $rowsum; - - $tablerows .= $p->parse($cartRowTmpl); - } - - // if no tickets in cart set EMPTYROWS and disable order button - if (count($cart->getTickets()) == 0) { - $tablerows = $p->getVar("EMPTYROWS"); - $p->setVar("attribDISABLED", "disabled=\"disabled\""); - } else { - $p->setVar("attribDISABLED", ""); - } - - $p->setVar("TABLEROWS", $tablerows); - $p->setVar("TOTALSUM", $lang->getPrice($totalsum)); - - // set edit links - $p->setVar("linkCHANGE_CART", "index.php?mode=cart&isOrder=true"); - - // set buttons - $p->setVar("buttonORDERTICKETS", "ms_orderTickets"); - - // create page - $parser->setVAR("PAGE", $p->parseFile("orderoverview.html")); -} - -/** creates the form to edit the shipping address */ -function editShippingAddress() -{ - global $parser; - - $p = new Parser("editshippingaddress.html"); - - // check if loggedin - $session = new WebSession(); - if (!$session->isAuthorized()) { - redirectHome(); - exit(); - } - - // get shipping address - $cart = new Cart($_COOKIE[COOKIE_CART]); - if ($cart->isValid()) { - $p->setVar("SHIPPINGADDRESS", $cart->getShippingAddress()); - } - - // set input fields - $p->setVar("fieldSHIPPINGADDRESS", "ms_shippingAddress"); - - // set buttons - $p->setVar("buttonSAVE_SHIPPINGADDRESS", "ms_saveShippingAddress"); - $p->setVar("buttonCANCEL_SHIPPINGADDRESS", "ms_cancelShippingAddress"); - - // create page - $parser->setVAR("PAGE", $p->parseFile("editshippingaddress.html")); -} - -/** creates the form to edit the order comments */ -function editOrderComments() -{ - global $parser; - - $p = new Parser("editordercomments.html"); - - // check if loggedin - $session = new WebSession(); - if (!$session->isAuthorized()) { - redirectHome(); - exit(); - } - - // get shipping address - $cart = new Cart($_COOKIE[COOKIE_CART]); - if ($cart->isValid()) { - $p->setVar("COMMENTS", $cart->getOrderComments()); - } - - // set input fields - $p->setVar("fieldCOMMENTS", "ms_comments"); - - // set buttons - $p->setVar("buttonSAVE_COMMENTS", "ms_saveComments"); - $p->setVar("buttonCANCEL_COMMENTS", "ms_cancelComments"); - - // create page - $parser->setVAR("PAGE", $p->parseFile("editordercomments.html")); -} - - -//eof -return; -?> \ No newline at end of file diff --git a/www/inc/rendering/twig_extensions.php b/www/inc/rendering/twig_extensions.php index 8cc1c3d..c21b856 100644 --- a/www/inc/rendering/twig_extensions.php +++ b/www/inc/rendering/twig_extensions.php @@ -1,5 +1,5 @@ new Twig_Filter_Method($this, 'getPrice', $safe), 'asMoneyPlain' => new Twig_Filter_Method($this, 'getPricePlain', $safe), + 'asMoneyHtml' => new Twig_Filter_Method($this, 'getPriceHtml', $safe), + 'asMoneyClient' => new Twig_Filter_Method($this, 'getPriceClient', $safe), 'asDate' => new Twig_Filter_Method($this, 'getDate'), 'asTime' => new Twig_Filter_Method($this, 'getTime'), 'asDateTime' => new Twig_Filter_Method($this, 'getDateTime'), @@ -32,6 +34,16 @@ class LangFilterExtension extends Twig_Extension $flags=LanguageManager::UseThousandSeparator | LanguageManager::MoneyShowCurrency | LanguageManager::MoneyCurrencyPlain; return $this->lang->getPrice($i,$flags); } + public function getPriceHtml($i) + { + $flags=LanguageManager::UseThousandSeparator | LanguageManager::MoneyShowCurrency | LanguageManager::MoneyCurrencyHTML; + return $this->lang->getPrice($i,$flags); + } + public function getPriceClient($i) + { + $flags=LanguageManager::UseThousandSeparator | LanguageManager::MoneyShowCurrency | LanguageManager::MoneyCurrencyClient; + return $this->lang->getPrice($i,$flags); + } public function getDate($i){return $this->lang->getDate($i);} public function getTime($i){return $this->lang->getTime($i);} public function getDateTime($i){return $this->lang->getDateTime($i);} diff --git a/www/index.php b/www/index.php index 174197a..660744b 100644 --- a/www/index.php +++ b/www/index.php @@ -44,75 +44,63 @@ $page="(internal error: no page text yet, probably no template defined)"; try{ //get page template and process it switch($mode){ - case "eventDetails": + case "eventDetails": // show details of an event $page=EventRender::createEventDetails(); break; - case "eventOrder": + case "eventOrder": // process of ordering tickets WebCart::addTickets(); break; - case "mycart": + case "mycart": // show users current cart (make sure he/she has one) //make sure cart exists WebCart::getOrCreateCart(); //fall through to show it - case "cart": + case "cart": // show current cart (can be called from anywhere in order process) $page=WebCart::createCartOverview(); break; - case "removeItem": + case "removeItem": // remove something from cart WebCart::removeItem(); break; - case "vouchers": + case "vouchers": // allow user to select voucher value to be added to cart $page=WebCart::createVoucherOverview(); break; - case "voucherOrder": + case "voucherOrder": // add selected voucher to cart, then redirect to cart WebCart::addVoucher(); break; - case "shop": + case "shop": // redirect to main page - anchor for flow resets redirectHome(); break; - case "checkout": + case "checkout": // redirection target during checkout from login/register pages $page=WebCart::checkout(); break; - case "orderLogin": + case "orderLogin": // log in or register to be able to checkout $page=WOCustomer::loginPage("Order"); break; - case "customerLoginOrder": + case "customerLoginOrder": // log in with a known customer login $page=WOCustomer::checkLogin("checkout",true); break; - case "customerRegistrationOrder": + case "customerRegistrationOrder": // log in with new customer data $page=WOCustomer::registerCustomer("checkout",true); break; case "changeDeliveryAddress": - case "changeInvoiceAddress": + case "changeInvoiceAddress": // change addresses $page=WebCart::changeAddressPage($mode); break; - case 'placeOrder': + case 'placeOrder': // convert cart to order $page=WebCart::placeOrder(); break; - case "customerResetLogin": + case "customerResetLogin": // reset login page (link came via mail) $page=WOCustomer::resetLoginPage(); break; -/* case "orderOverview": - orderTickets(); - createOrderOverview(); - break; - case "editShippingAddress": - saveShippingAddress(); - editShippingAddress(); - break; - case "editOrderComments": - saveOrderComments(); - editOrderComments(); - break;*/ - case "setlanguage": + case "setlanguage": // mini-links to change browser language LanguageManager::setLanguage(); break; - case "compile": + case "compile": // internal: compile the templates (the method asks for admin credentials) TemplateCompiler::execute(); break; - case "index": + case "index": // show the index page $page=$twig->loadTemplate("index.html")->render($basevars); break; - default: + default: // if in doubt: show the event page, customers will probably like it ;-) $page=EventRender::createEventList(); break; } diff --git a/www/template/en/ordermail.txt b/www/template/en/ordermail.txt index 9525d07..2a8c342 100644 --- a/www/template/en/ordermail.txt +++ b/www/template/en/ordermail.txt @@ -8,6 +8,11 @@ and after that the body of the mail. #} Order {{order.orderid}} Details at MagicSmoke.silmor.de From: no-reply@localdomain.com +Content-Type: multipart/alternative; boundary="------boundary-aYAmoTT04MIpviI" +MIME-Version: 1.0 + + This is a multi-part message in MIME format. +--------boundary-aYAmoTT04MIpviI Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit @@ -17,20 +22,20 @@ Your order number {{order.orderid}} is currently at the status {{order.str_statu {% if order.invoiceaddress|isObject %} Your order will be invoiced to the following address: -{{order.invoiceaddress.name}} -{{order.invoiceaddress.addr1}} -{{order.invoiceaddress.addr2}} -{{order.invoiceaddress.city}} {{order.invoiceaddress.state}} -{{order.invoiceaddress.zipcode}} {% if order.invoiceaddress.country|isObject %}{{order.invoiceaddress.country.name}}{% endif %} +{{order.invoiceaddress.name|raw}} +{{order.invoiceaddress.addr1|raw}} +{{order.invoiceaddress.addr2|raw}} +{{order.invoiceaddress.city|raw}} {{order.invoiceaddress.state|raw}} +{{order.invoiceaddress.zipcode|raw}} {% if order.invoiceaddress.country|isObject %}{{order.invoiceaddress.country.name|raw}}{% endif %} {% endif %} {% if order.deliveryaddress|isObject %} Your order will be delivered to the following address: -{{order.deliveryaddress.name}} -{{order.deliveryaddress.addr1}} -{{order.deliveryaddress.addr2}} -{{order.deliveryaddress.city}} {{order.deliveryaddress.state}} -{{order.deliveryaddress.zipcode}} {% if order.deliveryaddress.country|isObject %}{{order.deliveryaddress.country.name}}{% endif %} +{{order.deliveryaddress.name|raw}} +{{order.deliveryaddress.addr1|raw}} +{{order.deliveryaddress.addr2|raw}} +{{order.deliveryaddress.city|raw}} {{order.deliveryaddress.state|raw}} +{{order.deliveryaddress.zipcode|raw}} {% if order.deliveryaddress.country|isObject %}{{order.deliveryaddress.country.name|raw}}{% endif %} {% endif %} @@ -43,7 +48,7 @@ payment due : {{order.amountdue|asMoneyPlain}} Detailed listing: {% for ticket in order.tickets %} -Ticket: {{ticket.event.title}} ({{ticket.pricecategory.name}}) {{ticket.price|asMoneyPlain}} ({{ticket.str_status}}) +Ticket: {{ticket.event.title|raw}} ({{ticket.pricecategory.name|raw}}) {{ticket.price|asMoneyPlain}} ({{ticket.str_status|raw}}) {% endfor %} {% for voucher in order.vouchers %} Voucher (Value: {{voucher.value|asMoneyPlain}}): {{voucher.price|asMoneyPlain}} @@ -70,3 +75,312 @@ The order has been shipped {{order.senttime|asDateTime}}. with best regards, your MagicSmoke team + +--------boundary-aYAmoTT04MIpviI +Content-Type: multipart/related; boundary="iKETDhtPafV07ewA9JlUOMitE" +Content-Transfer-Encoding: 8bit + +--iKETDhtPafV07ewA9JlUOMitE +Content-Type: text/html; charset="utf-8" +Content-Transfer-Encoding: 8bit + + +

Hello {{customer.title}} {{customer.name}}!

+ +

Your order number {{order.orderid}} is currently at the status {{order.str_status}}.

+ +{% if order.invoiceaddress|isObject %} +

Your order will be invoiced to the following address:

+

{{order.invoiceaddress.name|e}}
+{{order.invoiceaddress.addr1|e}}
+{{order.invoiceaddress.addr2|e}}
+{{order.invoiceaddress.city|e}} {{order.invoiceaddress.state|e}}
+{{order.invoiceaddress.zipcode|e}} {% if order.invoiceaddress.country|isObject %}{{order.invoiceaddress.country.name|e}}{% endif %} +

+{% endif %} + +{% if order.deliveryaddress|isObject %} +

Your order will be delivered to the following address:

+

{{order.deliveryaddress.name|e}}
+{{order.deliveryaddress.addr1|e}}
+{{order.deliveryaddress.addr2|e}}
+{{order.deliveryaddress.city|e}} {{order.deliveryaddress.state|e}}
+{{order.deliveryaddress.zipcode|e}} {% if order.deliveryaddress.country|isObject %}{{order.deliveryaddress.country.name|e}}{% endif %} +

+{% endif %} + +

Payment information

+

+ + + + +
total price:{{order.totalprice|asMoneyHtml}}
already paid:{{order.amountpaid|asMoneyHtml}}
payment due:{{order.amountdue|asMoneyHtml}}
+

+ +

Please send the money to our account no. 456D-EADC-AT07 at Smelly Bank LLC, New York.

+ +

Detailed listing:

+ +

+{% for ticket in order.tickets %} + + + \ + +{% endfor %} +{% for voucher in order.vouchers %} + + + + +{% endfor %} +{% for item in order.items %} + +{% endfor %} +{% if order.shippingtype|isObject %} + + + + +{% endif %} +
Ticket: {{ticket.event.title}} ({{ticket.pricecategory.name}})Start: {{ticket.event.start|asDateTime}}{{ticket.price|asMoneyHtml}}({{ticket.str_status}})
Voucher{% if voucher.validtime|isNull %} + Valid unlimited. + {% else %} + Valid till: {{voucher.validtime|asDate}} + {% endif %} {{voucher.price|asMoneyHtml}}Value: {{voucher.value|asMoneyHtml}}
{{item.amount}}x {{item.productname}}{{item.totalprice|asMoneyHtml}}
Shipping:{{order.shippingtype.description}}{{order.shippingcosts|asMoneyHtml}} 

+ + +

The order was created {{order.ordertime|asDateTime}}.

+ +{% if not order.senttime|isNull %} +{% if order.senttime > 0 %} +

The order has been shipped {{order.senttime|asDateTime}}.

+{% endif %} +{% endif %} + +

+

+

+ + +   with best regards,
+   your MagicSmoke team + +--iKETDhtPafV07ewA9JlUOMitE +Content-ID: +Content-Transfer-Encoding: base64 +Content-Type: image/png; name="logo.png" + +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 + +--iKETDhtPafV07ewA9JlUOMitE-- + +--------boundary-aYAmoTT04MIpviI-- -- 1.7.2.5