PageRenderTime 57ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/controllers/checkout/controller.php

https://bitbucket.org/pooshonk/esw
PHP | 514 lines | 417 code | 54 blank | 43 comment | 54 complexity | 5b79f891df678609958755588b24757e MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. class Checkoutcontroller {
  3. private $required = array('address_name', 'address_lineone', 'address_city' );
  4. public function __construct( PeacockCarterFrameworkRegistry $registry, $directCall )
  5. {
  6. $this->registry = $registry;
  7. if( $directCall == true )
  8. {
  9. // temp
  10. $sql = "SELECT c.ID FROM content c, content_types t, content_versions v, content_versions_pages p WHERE c.type=t.ID AND t.reference='page' AND p.version_id=v.ID AND v.ID=c.current_revision AND c.`order` >= 0 ORDER BY c.`order` ASC LIMIT 1";
  11. $this->registry->getObject('db')->executeQuery( $sql );
  12. $p = $this->registry->getObject('db')->getRows();
  13. $this->registry->getObject('menubuilder')->buildMenu( $p['ID'] );
  14. require_once FRAMEWORK_PATH . 'models/store/basket.php';
  15. $this->basket = new Basket( $this->registry );
  16. if( $this->basket->isChecked() == false ) { $this->basket->checkBasket(); }
  17. $urlBits = $this->registry->getURLBits();
  18. if( !isset( $urlBits[1] ) )
  19. {
  20. $this->setDelivery();
  21. }
  22. else
  23. {
  24. switch( $urlBits[1] )
  25. {
  26. case 'select-payment':
  27. $this->setPayment();
  28. break;
  29. case 'review':
  30. $this->orderDetails();
  31. break;
  32. case 'confirm':
  33. $this->confirmOrder();
  34. break;
  35. case 'delivery':
  36. $this->setDelivery();
  37. break;
  38. default:
  39. $this->setDelivery();
  40. }
  41. }
  42. }
  43. }
  44. private function setDelivery()
  45. {
  46. if( $this->basket->isEmpty() )
  47. {
  48. // basket is empty fool!
  49. $this->registry->errorPage('Basket is empty', 'Sorry, you cannot checkout as you have no products in your basket');
  50. }
  51. else
  52. {
  53. if( isset( $_POST['set_delivery'] ) )
  54. {
  55. // set delivery address. Header redirect to next step.
  56. $n = ( $_POST['address_name'] );
  57. $a = ( $_POST['address_lineone'] );
  58. $al2 = ( $_POST['address_linetwo'] );
  59. $c = ( $_POST['address_city'] );
  60. $p = ( $_POST['address_postcode'] );
  61. $country = ( $_POST['address_country'] );
  62. $notes = ( $_POST['delivery_notes'] );
  63. $this->basket->setDeliveryAddress( $n, $a, $al2, $c, $p, $country, $notes );
  64. $notall = false;
  65. foreach( $this->required as $field )
  66. {
  67. if( ! isset( $_POST[ $field ] ) || $_POST[ $field ] == '' )
  68. {
  69. $notall = true;
  70. }
  71. }
  72. $inner = "";
  73. if( ! $this->registry->getObject('authenticate')->isLoggedIn() && $this->basket->getEmailAddress() == '' )
  74. {
  75. if( isset( $_POST['email_address'] ) )
  76. {
  77. if( ! preg_match( "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})^", $_POST[ 'email_address' ] ) )
  78. {
  79. $notall = true;
  80. $inner = " We also require a valid email address to email dispatch and payment confirmation.";
  81. }
  82. else
  83. {
  84. $this->basket->setEmailAddress( $_POST['email_address'] );
  85. }
  86. }
  87. else
  88. {
  89. $notall = true;
  90. $inner = " We also require a valid email address to email dispatch and payment confirmation.";
  91. }
  92. }
  93. if( $notall == true )
  94. {
  95. // shown the delivery method page
  96. $this->registry->getObject('template')->buildFromTemplates( 'header.tpl.php', 'store/checkout/delivery.tpl.php', 'footer.tpl.php' );
  97. // if delviery details is set
  98. $da = $this->basket->getDeliveryAddress();
  99. if( ! empty( $da ) )
  100. {
  101. $address = $da;
  102. $this->registry->getObject('template')->getPage()->addTag( 'form_address_name', $address['address_name'] );
  103. $this->registry->getObject('template')->getPage()->addTag( 'form_address_lineone', $address['address_lineone'] );
  104. $this->registry->getObject('template')->getPage()->addTag( 'form_address_linetwo', $address['address_linetwo'] );
  105. $this->registry->getObject('template')->getPage()->addTag( 'form_address_city', $address['address_city'] );
  106. $this->registry->getObject('template')->getPage()->addTag( 'form_address_postcode', $address['address_postcode'] );
  107. $this->registry->getObject('template')->getPage()->addTag( 'form_address_country', $address['address_country'] );
  108. $this->registry->getObject('template')->getPage()->addTag( 'form_delivery_notes', $address['delivery_notes'] );
  109. }
  110. $msg = "<p>You must at least supply your name, first line of your address, and your city." . $inner . "</p>";
  111. $this->registry->getObject('template')->getPage()->addTag( 'address_message', $msg );
  112. $this->requestEmail();
  113. }
  114. else
  115. {
  116. // bounce them
  117. header('Location: ' . $this->registry->buildURL(array('checkout', 'review'), '', false ) );
  118. exit();
  119. }
  120. }
  121. else
  122. {
  123. // shown the delivery method page
  124. $this->registry->getObject('template')->buildFromTemplates( 'header.tpl.php', 'store/checkout/delivery.tpl.php', 'footer.tpl.php' );
  125. $this->registry->getObject('template')->getPage()->addTag( 'address_message', '' );
  126. // if delviery details is set
  127. $da = $this->basket->getDeliveryAddress();
  128. if( ! empty( $da ) )
  129. {
  130. $address = $da;
  131. $this->registry->getObject('template')->getPage()->addTag( 'form_address_name', $address['address_name'] );
  132. $this->registry->getObject('template')->getPage()->addTag( 'form_address_lineone', $address['address_lineone'] );
  133. $this->registry->getObject('template')->getPage()->addTag( 'form_address_linetwo', $address['address_linetwo'] );
  134. $this->registry->getObject('template')->getPage()->addTag( 'form_address_city', $address['address_city'] );
  135. $this->registry->getObject('template')->getPage()->addTag( 'form_address_postcode', $address['address_postcode'] );
  136. $this->registry->getObject('template')->getPage()->addTag( 'form_address_country', $address['address_country'] );
  137. $this->registry->getObject('template')->getPage()->addTag( 'form_delivery_notes', $address['delivery_notes'] );
  138. }
  139. $this->requestEmail();
  140. }
  141. }
  142. }
  143. private function requestEmail()
  144. {
  145. if( ! $this->registry->getObject('authenticate')->isLoggedIn() )
  146. {
  147. $this->registry->getObject('template')->getPage()->addTag( 'email_address', $this->basket->getEmailAddress() );
  148. $this->registry->getObject('template')->addTemplateBit( 'email_request', 'store/checkout/email_request.tpl.php' );
  149. }
  150. else
  151. {
  152. $this->registry->getObject('template')->getPage()->addTag( 'email_request', '' );
  153. }
  154. }
  155. private function orderDetails()
  156. {
  157. $dd = $this->basket->getDeliveryAddress();
  158. $notall = false;
  159. foreach( $this->required as $field )
  160. {
  161. if( ! isset( $dd[ $field ] ) || $dd[ $field ] == '' )
  162. {
  163. $notall = true;
  164. }
  165. }
  166. if( $notall == true )
  167. {
  168. $this->registry->redirectUser( array( 'checkout'), 'Delivery Details', 'Your delivery address details were not complete. Please complete them in order to proceed with your order', false );
  169. }
  170. else
  171. {
  172. if( $this->basket->isEmpty() )
  173. {
  174. $this->registry->getObject('template')->buildFromTemplates('header.tpl.php', 'store/checkout/empty.tpl.php','footer.tpl.php');
  175. }
  176. else
  177. {
  178. $this->registry->getObject('template')->buildFromTemplates('header.tpl.php', 'store/checkout/review.tpl.php','footer.tpl.php');
  179. $contents = $this->basket->getContents();
  180. $products = array();
  181. //echo '<pre>' . print_r( $contents, true ) . '</pre>';
  182. foreach( $contents as $reference => $data )
  183. {
  184. $products[] = $data;
  185. }
  186. $basketCache = $this->registry->getObject('db')->cacheData( $products );
  187. $this->registry->getObject('template')->getPage()->addTag( 'voucher_code', $this->basket->getVoucherCode() );
  188. $this->registry->getObject('template')->getPage()->addTag( 'basket_items', array( 'DATA', $basketCache ) );
  189. $this->registry->getObject('template')->getPage()->addTag( 'basket_subtotal', $this->basket->getCost() );
  190. $this->registry->getObject('template')->getPage()->addTag( 'shipping_costs', $this->basket->getShippingCost() );
  191. $this->registry->getObject('template')->getPage()->addTag( 'basket_total', $this->basket->getTotal() );
  192. // delivery address
  193. $address = "";
  194. $note = "";
  195. foreach( $dd as $field => $data )
  196. {
  197. if( $field != 'delivery_notes' )
  198. {
  199. if( $data != '' )
  200. {
  201. $address .= $data . ",";
  202. }
  203. }
  204. else
  205. {
  206. $note = $data;
  207. }
  208. }
  209. $note = ( $note == "" ) ? "No instructions supplied" : $note;
  210. $address = substr_replace($address,"",-1);
  211. $this->registry->getObject('template')->getPage()->addTag( 'delivery_address', $address );
  212. $this->registry->getObject('template')->getPage()->addTag( 'delivery_instructions', $note );
  213. $vc = $this->basket->getVoucherCode();
  214. $vc = ( $vc == '' ) ? 'No voucher code supplied' : $vc;
  215. $this->registry->getObject('template')->getPage()->addTag( 'voucher_code', $vc );
  216. $payment_id = intval( $this->basket->getPaymentMethod() );
  217. $shipping_id = intval( $this->basket->getShippingMethod() );
  218. $sql = "SELECT name FROM store_shipping_methods WHERE ID={$shipping_id} AND active=1";
  219. $this->registry->getObject('db')->executeQuery( $sql );
  220. if( $this->registry->getObject('db')->numRows() == 1 )
  221. {
  222. $data = $this->registry->getObject('db')->getRows();
  223. $sm = $data['name'];
  224. }
  225. else
  226. {
  227. $sm = "Error - invalid or inactive shipping method";
  228. }
  229. $sql = "SELECT name FROM store_payment_methods WHERE ID={$payment_id} AND active=1";
  230. $this->registry->getObject('db')->executeQuery( $sql );
  231. if( $this->registry->getObject('db')->numRows() == 1 )
  232. {
  233. $data = $this->registry->getObject('db')->getRows();
  234. $pm = $data['name'];
  235. }
  236. else
  237. {
  238. $pm = "Error - invalid or inactive payment method";
  239. }
  240. $this->registry->getObject('template')->getPage()->addTag( 'delivery_method', $sm );
  241. $this->registry->getObject('template')->getPage()->addTag( 'payment_method', $pm );
  242. }
  243. }
  244. }
  245. private function confirmOrder()
  246. {
  247. // basket empty
  248. if( $this->basket->isEmpty() )
  249. {
  250. $this->registry->getObject('template')->buildFromTemplates('header.tpl.php', 'store/checkout/empty.tpl.php','footer.tpl.php');
  251. }
  252. else
  253. {
  254. $dd = $this->basket->getDeliveryAddress();
  255. if( empty( $dd ) )
  256. {
  257. // delivery details empty
  258. $this->registry->redirectUser( array('checkout'), 'Delivery address missing', 'Please supply us with a delivery address', false );
  259. }
  260. else
  261. {
  262. $notall = false;
  263. foreach( $this->required as $field )
  264. {
  265. if( ! isset( $dd[ $field ] ) || $dd[ $field ] == '' )
  266. {
  267. $notall = true;
  268. }
  269. }
  270. if( $notall == true )
  271. {
  272. // delivery address not complete
  273. $this->registry->redirectUser( array('checkout'), 'Delivery address incomplete', 'Please supply us with a complete delivery address', false );
  274. }
  275. else
  276. {
  277. // shipping and payment details valid
  278. $sql = "SELECT * FROM store_shipping_methods WHERE active=1 AND ID=" . $this->basket->getShippingMethod();
  279. $this->registry->getObject('db')->executeQuery( $sql );
  280. if( $this->registry->getObject('db')->numRows() == 0 )
  281. {
  282. $this->registry->redirectUser( array('basket'), 'Invalid shipping method', 'You have selected an invalid shipping method', false );
  283. }
  284. else
  285. {
  286. $sql = "SELECT * FROM store_payment_methods WHERE active=1 AND ID=" . $this->basket->getPaymentMethod();
  287. $this->registry->getObject('db')->executeQuery( $sql );
  288. if( $this->registry->getObject('db')->numRows() == 0 )
  289. {
  290. $this->registry->redirectUser( array('basket'), 'Invalid payment method', 'You have selected an invalid payment method', false );
  291. }
  292. else
  293. {
  294. // voucher code
  295. // done in checkBasket()
  296. // user account
  297. if( $this->registry->getObject('authenticate')->isLoggedIn() == true )
  298. {
  299. // loggedin: transfer
  300. $this->basket->transferToUser( $this->registry->getObject('authenticate')->getUserID() );
  301. }
  302. else
  303. {
  304. // not logged in: create
  305. $insert = array();
  306. $username = "guest_" . str_replace( ' ', '', $dd['address_name'] ) . $this->randomString(5);
  307. $password = $this->randomString(5);
  308. $insert['username'] = $this->registry->getObject('db')->sanitizeData( $username );
  309. $insert['password_hash'] = md5( $password );
  310. $insert['email'] = $this->registry->getObject('db')->sanitizeData( $this->basket->getEmailAddress() );
  311. $insert['admin'] = 0;
  312. $insert['active'] = 1;
  313. $insert['banned'] = 0;
  314. $insert['name'] = $this->registry->getObject('db')->sanitizeData( $dd['address_name'] );
  315. $this->registry->getObject('db')->insertRecords( 'users', $insert );
  316. $uid = $this->registry->getObject('db')->lastInsertID();
  317. /*$insert = array();
  318. $insert['user_id'] = $uid;
  319. $insert['default_delivery_name'] = $this->registry->getObject('db')->sanitizeData( $dd['address_name'] );
  320. $insert['default_delivery_address'] = $this->registry->getObject('db')->sanitizeData( $dd['address_lineone'] );
  321. $insert['default_delivery_address2'] = $this->registry->getObject('db')->sanitizeData( $dd['address_linetwo'] );
  322. $insert['default_delivery_city'] = $this->registry->getObject('db')->sanitizeData( $dd['address_city'] );
  323. $insert['default_delivery_postcode'] = $this->registry->getObject('db')->sanitizeData( $dd['address_postcode'] );
  324. $insert['default_delivery_country'] = $this->registry->getObject('db')->sanitizeData( $dd['address_country'] );
  325. $this->registry->getObject('db')->insertRecords( 'users_extra', $insert );*/
  326. // not logged in: email
  327. $this->emailLoginDetails( $username, $password, $this->basket->getEmailAddress());
  328. // not logged in: login
  329. $u = $this->registry->getObject('db')->sanitizeData( $username );
  330. $p = md5( $password );
  331. $this->registry->getObject('authenticate')->forceLogin( $u, $p );
  332. // now logged in: transfer
  333. $this->basket->transferToUser( $this->registry->getObject('authenticate')->getUserID() );
  334. }
  335. // create order
  336. $order = array();
  337. $order['user_id'] = $uid;
  338. $order['ip'] = $_SERVER['REMOTE_ADDR'];
  339. $order['status'] = 1;
  340. $order['delivery_comment'] = $this->registry->getObject('db')->sanitizeData( $dd['delivery_notes'] );
  341. $order['shipping_method'] = $this->basket->getShippingMethod();
  342. $order['payment_method'] = $this->basket->getPaymentMethod();
  343. $order['shipping_name'] = $this->registry->getObject('db')->sanitizeData( $dd['address_name'] );
  344. $order['shipping_address'] = $this->registry->getObject('db')->sanitizeData( $dd['address_lineone'] );
  345. $order['shipping_address2'] = $this->registry->getObject('db')->sanitizeData( $dd['address_linetwo'] );
  346. $order['shipping_city'] = $this->registry->getObject('db')->sanitizeData( $dd['address_city'] );
  347. $order['shipping_postcode'] = $this->registry->getObject('db')->sanitizeData( $dd['address_postcode'] );
  348. $order['shipping_country'] = $this->registry->getObject('db')->sanitizeData( $dd['address_country'] );
  349. $order['products_cost'] = $this->basket->getCost();
  350. $order['shipping_cost'] = $this->basket->getShippingCost();
  351. $order['voucher_code'] = $this->basket->getVoucherCode();
  352. $order['voucher_code_text'] = $this->basket->getVoucherCodeText();
  353. $this->registry->getObject('db')->insertRecords( 'store_orders', $order );
  354. $order_id = $this->registry->getObject('db')->lastInsertID();
  355. // order items
  356. $order_items_sql = "";
  357. $variations = array();
  358. $someVariations = false;
  359. foreach( $this->basket->getContents() as $reference => $data )
  360. {
  361. $order_item = array();
  362. $order_item['order_id'] = $order_id;
  363. $order_item['product_id'] = $data['product'];
  364. $order_item['qty'] = $data['quantity'];
  365. $order_item['uploaded_file'] = $data['file'];
  366. $order_item['custom_text_values'] = $data['custom_text_values'];
  367. $order_item['standard'] = $data['standard'];
  368. $this->registry->getObject('db')->insertRecords( 'store_orders_items', $order_item );
  369. $order_item_id = $this->registry->getObject('db')->lastInsertID();
  370. if( $data['variation_ids'] != '' )
  371. {
  372. $variations[ $order_item_id ] = explode( ',', $data['variation_ids'] );
  373. $someVariations = true;
  374. }
  375. }
  376. if( $someVariations == true )
  377. {
  378. $order_variations_sql = "INSERT INTO store_orders_items_variation_value_association (order_item_id, variation_id) VALUES ";
  379. // variations
  380. foreach( $variations as $oiid => $vars )
  381. {
  382. foreach( $vars as $var )
  383. {
  384. $order_variations_sql .= "( " . $oiid . ", " . $var . "), ";
  385. }
  386. }
  387. $order_variations_sql = substr_replace( $order_variations_sql, '', -2 );
  388. $this->registry->getObject('db')->executeQuery( $order_variations_sql );
  389. }
  390. // email user
  391. $this->emailOrderDetails( $order_id );
  392. $u = $this->registry->getObject('authenticate')->getUserID();
  393. // empty the basket!
  394. $s = session_id();
  395. $i = $_SERVER ['REMOTE_ADDR'];
  396. /*$sql = "DELETE FROM store_basket_variant_value_association WHERE basket_id IN (SELECT ID FROM store_basket_contents WHERE ( user_id={$u} AND {$u} > 0 ) OR ( session_id='{$s}' AND ip_address='{$i}' ))";
  397. $this->registry->getObject('db')->executeQuery( $sql );*/
  398. /*$sql = "DELETE FROM store_basket_contents WHERE ( user_id={$u} AND {$u} > 0 ) OR (session_id='{$s}' AND ip_address='{$i}')";
  399. print_r($sql);
  400. print_r($u);
  401. $this->registry->getObject('db')->executeQuery( $sql );*/
  402. // payment page bounce.
  403. header('Location: ' . $this->registry->buildURL(array('orders', 'payment', $order_id), '', false ) );
  404. exit();
  405. }
  406. }
  407. }
  408. }
  409. }
  410. }
  411. private function randomString( $length=8 )
  412. {
  413. $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
  414. $string = "";
  415. for ($i = 0; $i < $length; $i++ )
  416. {
  417. $string .= $characters[mt_rand(0, strlen($characters)-1)];
  418. }
  419. return $string;
  420. }
  421. private function emailLoginDetails( $username, $password, $email )
  422. {
  423. $this->registry->getObject('mailout')->startFresh();
  424. $this->registry->getObject('mailout')->setTo( $email );
  425. $this->registry->getObject('mailout')->setSender( $this->registry->getSetting('adminEmailAddress') );
  426. $this->registry->getObject('mailout')->setFromName( $this->registry->getSetting('cms_name') );
  427. $this->registry->getObject('mailout')->setSubject( 'Login details for ' .$this->registry->getSetting('sitename') );
  428. $this->registry->getObject('mailout')->buildFromTemplates('store/login.tpl.php');
  429. $tags = $this->values;
  430. $tags[ 'sitename' ] = $this->registry->getSetting('sitename');
  431. $tags['username'] = $username;
  432. $tags['password'] = $password;
  433. $tags['siteurl'] = $this->registry->getSetting('site_url');
  434. $this->registry->getObject('mailout')->replaceTags( $tags );
  435. $this->registry->getObject('mailout')->setMethod('sendmail');
  436. $this->registry->getObject('mailout')->send();
  437. }
  438. private function emailOrderDetails( $order )
  439. {
  440. $sql = "SELECT u.email FROM users u, store_orders o WHERE u.ID=o.user_id AND o.ID=" . $order;
  441. $this->registry->getObject('db')->executeQuery( $sql );
  442. $data = $this->registry->getObject('db')->getRows();
  443. $this->registry->getObject('mailout')->startFresh();
  444. $this->registry->getObject('mailout')->setTo( $data['email'], 'info@equalitysouthwest.org.uk', 'bookings@equalitysouthwest.org.uk' );
  445. $this->registry->getObject('mailout')->setSender( $this->registry->getSetting('adminEmailAddress') );
  446. $this->registry->getObject('mailout')->setFromName( $this->registry->getSetting('cms_name') );
  447. $this->registry->getObject('mailout')->appendHeader('Cc: ' . $this->registry->getSetting('adminEmailAddress') );
  448. $this->registry->getObject('mailout')->setSubject( 'Order placed on ' . $this->registry->getSetting('sitename') . ' - ref: #' . $order);
  449. $this->registry->getObject('mailout')->buildFromTemplates('store/order.tpl.php');
  450. $tags = $this->values;
  451. $tags[ 'order' ] = $order;
  452. $tags[ 'sitename' ] = $this->registry->getSetting('sitename');
  453. $tags['siteurl'] = $this->registry->getSetting('site_url');
  454. $tags[ 'link' ] = $this->registry->buildURL( array('orders', 'payment', $order), '', false );
  455. $this->registry->getObject('mailout')->replaceTags( $tags );
  456. $this->registry->getObject('mailout')->setMethod('sendmail');
  457. $this->registry->getObject('mailout')->send();
  458. }
  459. }
  460. ?>