_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;
}
}