_user instanceof UserModel) { $usersAddressBook = new UsersAddressBook(); $addressMultiOptions = $usersAddressBook->getMultiOptions($this->_user, '
', true); if (count($addressMultiOptions) > 0) { $addressMultiOptions[0] = array( 'title' => $this->getTranslate()->_('New address'), 'locationId' => null, 'postCode' => null, ); } $this->_addressMultiOptions = $addressMultiOptions; } return $this; } /** * * set user * * @param \Ppb\Db\Table\Row\User $user * @return $this */ public function setUser(UserModel $user = null) { parent::setUser($user); if ($this->_user instanceof UserModel) { $this->setAddressMultiOptions(); } return $this; } /** * * get address multi options * * @return array */ public function getAddressMultiOptions() { return $this->_addressMultiOptions; } public function getElements() { $allElements = parent::getElements(); $settings = $this->getSettings(); $translate = $this->getTranslate(); // first we add the global and billing address fields, and merge with the address_id and alternate shipping checkbox fields $elements = array_merge( $this->getElementsWithFilter('form_id', array('global', 'address'), $allElements), array( array( 'form_id' => 'address', 'id' => 'address_id', 'element' => (count($this->_addressMultiOptions) > 0) ? '\Ppb\Form\Element\SelectAddress' : 'hidden', 'label' => $this->_('Select Address'), 'multiOptions' => $this->_addressMultiOptions, 'attributes' => array( 'onchange' => 'this.form.submit();', ), 'bodyCode' => ' ', ), array( 'form_id' => 'sale_id', 'id' => 'sale_id', 'element' => 'hidden', 'bodyCode' => ' ' ), array( 'form_id' => 'shipping_checkbox', 'id' => 'alt_ship', 'element' => ($settings['enable_shipping']) ? 'checkbox' : false, 'multiOptions' => array( 1 => $translate->_('Ship to a different address'), ), 'attributes' => array( 'onchange' => 'javascript:displayShippingAddress()', ), 'bodyCode' => '' ), ) ); $object = $this; array_walk($elements, function (&$element) use (&$object) { $element = $object->prepareElementData($element, CartCheckout::PRF_BLG); }); // if the user is not registered, add basic registration fields if (!$this->_user) { $elements = array_merge($elements, $this->getElementsWithFilter('form_id', array('basic'), $allElements)); } if ($settings['enable_shipping']) { // now add shipping address fields $shippingAddressElements = $this->getElementsWithFilter('form_id', array('address'), $allElements); array_walk($shippingAddressElements, function (&$element) use (&$object) { $element = $object->prepareElementData($element, CartCheckout::PRF_SHP); }); $elements = array_merge($elements, $shippingAddressElements); } return $elements; } /** * * processes an element array item * * @param array $element * @param string $prefix * @return array */ public function prepareElementData($element, $prefix) { $data = $this->getData(); // check if we are using an existing address $existingAddress = $this->getData($prefix . 'address_id'); // alter body code column in all rows if (!empty($element['bodyCode'])) { $element['bodyCode'] = str_replace( array( "[name=\"country\"]", "[name=\"state\"]", "name: 'state'", 'ChangeState()', 'AddressSelect()', ), array( "[name=\"" . $prefix . "country\"]", "[name=\"" . $prefix . "state\"]", "name: '" . $prefix . "state'", $prefix . 'ChangeState()', $prefix . 'AddressSelect()', ), $element['bodyCode']); } // generate state field to work correctly if ($element['id'] == 'state' && !empty($data[$prefix . "country"])) { $states = $this->getLocations()->getMultiOptions( $data[$prefix . "country"]); if (count($states) > 0) { $element['multiOptions'] = $states; } else { unset($element['multiOptions']); $element['element'] = 'text'; } } if ($prefix == self::PRF_SHP && !$this->getData('alt_ship')) { $element['required'] = false; $element['validators'] = array(); } // if we select an existing address, the address form fields will not be required and will be hidden using javascript if (array_intersect((array)$element['form_id'], array('address'))) { if ($existingAddress && $element['id'] != 'address_id') { $element['required'] = false; $element['validators'] = array(); if (!empty($element['attributes']['class'])) { $element['attributes']['class'] .= ' address-field'; } else { $element['attributes']['class'] = 'address-field'; } } $element['id'] = $prefix . $element['id']; } return $element; } }