CartCheckout.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <?php
  2. /**
  3. *
  4. * PHP Pro Bid $Id$ AK2f2dfE6ZXBf1A141aK5o3NrWInPDTOWySAnGZynaA=
  5. *
  6. * @link http://www.phpprobid.com
  7. * @copyright Copyright (c) 2017 Online Ventures Software & CodeCube SRL
  8. * @license http://www.phpprobid.com/license Commercial License
  9. *
  10. * @version 7.9 [rev.7.9.02]
  11. */
  12. /**
  13. * this model is used for creating the cart checkout page, specifically the address
  14. * and user registration sections
  15. */
  16. namespace Ppb\Model\Elements\User;
  17. use Ppb\Model\Elements\User,
  18. Ppb\Db\Table\Row\User as UserModel,
  19. Ppb\Service\UsersAddressBook;
  20. class CartCheckout extends User
  21. {
  22. /**
  23. * billing address fields prefix
  24. */
  25. const PRF_BLG = 'blg_';
  26. /**
  27. * shipping address fields prefix
  28. */
  29. const PRF_SHP = 'shp_';
  30. /**
  31. *
  32. * populated with the available addresses from the address book
  33. *
  34. * @var array
  35. */
  36. protected $_addressMultiOptions = array();
  37. /**
  38. *
  39. * set address multi options
  40. *
  41. * @return $this
  42. */
  43. public function setAddressMultiOptions()
  44. {
  45. if ($this->_user instanceof UserModel) {
  46. $usersAddressBook = new UsersAddressBook();
  47. $addressMultiOptions = $usersAddressBook->getMultiOptions($this->_user, '<br>', true);
  48. if (count($addressMultiOptions) > 0) {
  49. $addressMultiOptions[0] = array(
  50. 'title' => $this->getTranslate()->_('New address'),
  51. 'locationId' => null,
  52. 'postCode' => null,
  53. );
  54. }
  55. $this->_addressMultiOptions = $addressMultiOptions;
  56. }
  57. return $this;
  58. }
  59. /**
  60. *
  61. * set user
  62. *
  63. * @param \Ppb\Db\Table\Row\User $user
  64. * @return $this
  65. */
  66. public function setUser(UserModel $user = null)
  67. {
  68. parent::setUser($user);
  69. if ($this->_user instanceof UserModel) {
  70. $this->setAddressMultiOptions();
  71. }
  72. return $this;
  73. }
  74. /**
  75. *
  76. * get address multi options
  77. *
  78. * @return array
  79. */
  80. public function getAddressMultiOptions()
  81. {
  82. return $this->_addressMultiOptions;
  83. }
  84. public function getElements()
  85. {
  86. $allElements = parent::getElements();
  87. $settings = $this->getSettings();
  88. $translate = $this->getTranslate();
  89. // first we add the global and billing address fields, and merge with the address_id and alternate shipping checkbox fields
  90. $elements = array_merge(
  91. $this->getElementsWithFilter('form_id', array('global', 'address'), $allElements),
  92. array(
  93. array(
  94. 'form_id' => 'address',
  95. 'id' => 'address_id',
  96. 'element' => (count($this->_addressMultiOptions) > 0) ? '\Ppb\Form\Element\SelectAddress' : 'hidden',
  97. 'label' => $this->_('Select Address'),
  98. 'multiOptions' => $this->_addressMultiOptions,
  99. 'attributes' => array(
  100. 'onchange' => 'this.form.submit();',
  101. ),
  102. 'bodyCode' => '
  103. <script type="text/javascript">
  104. AddressSelect();
  105. $(document).on(\'change\', \'[name="' . self::PRF_BLG . 'address_id"]\', function() {
  106. AddressSelect();
  107. });
  108. function AddressSelect() {
  109. var addressId = parseInt($(\'input:radio[name="' . self::PRF_BLG . 'address_id"]:checked\').val());
  110. if (addressId > 0) {
  111. $(\'[name^="' . self::PRF_BLG . '"]\').closest(\'.form-group\').hide();
  112. }
  113. else {
  114. $(\'[name^="' . self::PRF_BLG . '"]\').closest(\'.form-group\').show();
  115. }
  116. $(\'[name="' . self::PRF_BLG . 'address_id"]\').closest(\'.form-group\').show();
  117. }
  118. </script>',
  119. ),
  120. array(
  121. 'form_id' => 'sale_id',
  122. 'id' => 'sale_id',
  123. 'element' => 'hidden',
  124. 'bodyCode' => '<script type="text/javascript">
  125. CalculateOrderPostage();
  126. $(document).on(\'change\', \'[name="alt_ship"], [name$="address_id"], [name$="zip_code"], [name$="country"]\', function() {
  127. $(\'#shipping-options\').html("' . $translate->_('Please wait ...') . '");
  128. setTimeout(function() {
  129. CalculateOrderPostage();
  130. }, 500);
  131. });
  132. function CalculateOrderPostage() {
  133. var postCode = "";
  134. var locationId = "";
  135. if ($(\'input:checkbox[name="alt_ship"]\').is(\':checked\')) {
  136. var selectedAddress = $(\'input:radio[name="' . self::PRF_SHP . 'address_id"]:checked\');
  137. var addressId = parseInt(selectedAddress.val());
  138. if (addressId > 0) {
  139. postCode = selectedAddress.attr(\'data-post-code\');
  140. locationId = selectedAddress.attr(\'data-location-id\');
  141. }
  142. else {
  143. postCode = $(\'[name="' . self::PRF_SHP . 'zip_code"]\').val();
  144. locationId = $(\'[name="' . self::PRF_SHP . 'country"]\').val();
  145. }
  146. }
  147. else {
  148. var selectedAddress = $(\'input:radio[name="' . self::PRF_BLG . 'address_id"]:checked\');
  149. var addressId = parseInt(selectedAddress.val());
  150. if (addressId > 0) {
  151. postCode = selectedAddress.attr(\'data-post-code\');
  152. locationId = selectedAddress.attr(\'data-location-id\');
  153. }
  154. else {
  155. postCode = $(\'[name="' . self::PRF_BLG . 'zip_code"]\').val();
  156. locationId = $(\'[name="' . self::PRF_BLG . 'country"]\').val();
  157. }
  158. }
  159. if (postCode && locationId) {
  160. $(\'#shipping-options\').calculatePostage({
  161. selector: \'.form-checkout\',
  162. postUrl: paths.calculatePostage,
  163. locationId: locationId,
  164. postCode: postCode,
  165. postageId: $(\'[name="postage_id"]\').val(),
  166. enableSelection: 1
  167. });
  168. }
  169. else {
  170. $(\'#shipping-options\').html("' . $translate->_('Please enter your shipping address.') . '");
  171. }
  172. }
  173. // $(document).on(\'change\', \'[name="blg_state"]\', function() {
  174. // $(this).closest(\'form\').submit();
  175. // });
  176. </script > '
  177. ),
  178. array(
  179. 'form_id' => 'shipping_checkbox',
  180. 'id' => 'alt_ship',
  181. 'element' => ($settings['enable_shipping']) ? 'checkbox' : false,
  182. 'multiOptions' => array(
  183. 1 => $translate->_('Ship to a different address'),
  184. ),
  185. 'attributes' => array(
  186. 'onchange' => 'javascript:displayShippingAddress()',
  187. ),
  188. 'bodyCode' => '<script type="text/javascript">
  189. displayShippingAddress();
  190. function displayShippingAddress() {
  191. if ($(\'input:checkbox[name="alt_ship"]\').is(\':checked\')) {
  192. $("[name^=\'' . self::PRF_SHP . '\']").closest(\'.form-group\').show();
  193. $("#shipping-address-subtitle").show();
  194. }
  195. else {
  196. $("[name^=\'' . self::PRF_SHP . '\']").closest(\'.form-group\').hide();
  197. $("#shipping-address-subtitle").hide();
  198. }
  199. }
  200. </script>'
  201. ),
  202. )
  203. );
  204. $object = $this;
  205. array_walk($elements, function (&$element) use (&$object) {
  206. $element = $object->prepareElementData($element, CartCheckout::PRF_BLG);
  207. });
  208. // if the user is not registered, add basic registration fields
  209. if (!$this->_user) {
  210. $elements = array_merge($elements, $this->getElementsWithFilter('form_id', array('basic'), $allElements));
  211. }
  212. if ($settings['enable_shipping']) {
  213. // now add shipping address fields
  214. $shippingAddressElements = $this->getElementsWithFilter('form_id', array('address'), $allElements);
  215. array_walk($shippingAddressElements, function (&$element) use (&$object) {
  216. $element = $object->prepareElementData($element, CartCheckout::PRF_SHP);
  217. });
  218. $elements = array_merge($elements, $shippingAddressElements);
  219. }
  220. return $elements;
  221. }
  222. /**
  223. *
  224. * processes an element array item
  225. *
  226. * @param array $element
  227. * @param string $prefix
  228. * @return array
  229. */
  230. public function prepareElementData($element, $prefix)
  231. {
  232. $data = $this->getData();
  233. // check if we are using an existing address
  234. $existingAddress = $this->getData($prefix . 'address_id');
  235. // alter body code column in all rows
  236. if (!empty($element['bodyCode'])) {
  237. $element['bodyCode'] = str_replace(
  238. array(
  239. "[name=\"country\"]",
  240. "[name=\"state\"]",
  241. "name: 'state'",
  242. 'ChangeState()',
  243. 'AddressSelect()',
  244. ),
  245. array(
  246. "[name=\"" . $prefix . "country\"]",
  247. "[name=\"" . $prefix . "state\"]",
  248. "name: '" . $prefix . "state'",
  249. $prefix . 'ChangeState()',
  250. $prefix . 'AddressSelect()',
  251. ), $element['bodyCode']);
  252. }
  253. // generate state field to work correctly
  254. if ($element['id'] == 'state' && !empty($data[$prefix . "country"])) {
  255. $states = $this->getLocations()->getMultiOptions(
  256. $data[$prefix . "country"]);
  257. if (count($states) > 0) {
  258. $element['multiOptions'] = $states;
  259. }
  260. else {
  261. unset($element['multiOptions']);
  262. $element['element'] = 'text';
  263. }
  264. }
  265. if ($prefix == self::PRF_SHP && !$this->getData('alt_ship')) {
  266. $element['required'] = false;
  267. $element['validators'] = array();
  268. }
  269. // if we select an existing address, the address form fields will not be required and will be hidden using javascript
  270. if (array_intersect((array)$element['form_id'], array('address'))) {
  271. if ($existingAddress && $element['id'] != 'address_id') {
  272. $element['required'] = false;
  273. $element['validators'] = array();
  274. if (!empty($element['attributes']['class'])) {
  275. $element['attributes']['class'] .= ' address-field';
  276. }
  277. else {
  278. $element['attributes']['class'] = 'address-field';
  279. }
  280. }
  281. $element['id'] = $prefix . $element['id'];
  282. }
  283. return $element;
  284. }
  285. }