There's still a problem I did not notice before.
When the customer now edits the shipping address, the billing address is updated as well and vice versa. Those should be independent.
This is the checkout/address_select view I use:
<?php
/**
* @package HikaShop for Joomla!
* @version 2.6.3
* @author hikashop.com
* @copyright (C) 2010-2016 HIKARI SOFTWARE. All rights reserved.
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
*/
defined('_JEXEC') or die('Restricted access');
?><div id="hikashop_checkout_<?php echo $this->type; ?>_address_selection"<?php if(empty($this->addresses)) { echo ' style="display:none;"'; } ?>>
<?php
$config = hikashop_config();
$address_selector = (int)$config->get('checkout_address_selector', 0);
$other_type = ($this->type == 'billing') ? 'shipping' : 'billing';
$t = $this->type . '_address';
$current = $this->$t;
if($address_selector == 1) {
if(!empty($this->addresses)) {
foreach($this->addresses as $address) {
$checked = '';
if($address->address_id == $current)
$checked = ' checked="checked"';
else continue;
if($config->get('auto_submit_methods', 1) && empty($checked))
$checked = ' onclick="this.form.submit();return false;"';
?>
<div id="hikashop_address_<?php echo $this->type; ?>_selection_<?php echo $address->address_id; ?>" class="address_selection<?php echo ($address->address_id == $current) ? ' address_selected':''; ?>">
<input id="hikashop_checkout_<?php echo $this->type;?>_address_radio_<?php echo $address->address_id;?>" class="checkout_<?php echo $this->type;?>_address_radio" type="hidden" name="hikashop_address_<?php echo $this->type;?>" value="<?php echo $address->address_id;?>"<?php echo $checked; ?>/>
<?php
$js = '';
$params = new stdClass();
$params->type = $this->type;
$params->address_id = (int)$address->address_id;
$params->fieldset_id = 'hikashop_checkout_'.$this->type.'_address_zone';
echo hikashop_getLayout('address', 'show', $params, $js);
?>
</div>
<?php
}
}
?>
<div id="hikashop_checkout_<?php echo $this->type; ?>_address_template" class="address_selection" style="display:none;">
<input id="hikashop_checkout_<?php echo $this->type;?>_address_radio_{VALUE}" class="checkout_<?php echo $this->type;?>_address_radio" type="radio" name="hikashop_address_<?php echo $this->type;?>" value="{VALUE}"/>
{CONTENT}
</div>
<?php
}
if($address_selector == 2) {
$values = array();
if(!empty($this->addresses)) {
$addressClass = hikashop_get('class.address');
foreach($this->addresses as $k => $address) {
$addr = $addressClass->miniFormat($address);
$values[] = JHTML::_('select.option', $k, $addr);
}
}
$values[] = JHTML::_('select.option', 0, JText::_('HIKASHOP_NEW_ADDRESS_ITEM'));
echo JHTML::_('select.genericlist', $values, 'hikashop_address_'.$this->type, 'class="hikashop_field_dropdown" onchange="window.localPage.switchAddr(this, \''.$this->type.'\','.(int)$current.');"', 'value', 'text', $current, 'hikashop_checkout_address_'.$this->type.'_selector');
?><div id="hikashop_checkout_selected_<?php echo $this->type; ?>_address">
<?php
if(isset($this->addresses[$current]))
$address = $this->addresses[$current];
else
$address = reset($this->addresses);
$js = '';
$params = new stdClass();
$params->type = $this->type;
$params->address_id = (int)$address->address_id;
$params->fieldset_id = 'hikashop_checkout_'.$this->type.'_address_zone';
$params->cancel_url = '';
echo hikashop_getLayout('address', 'show', $params, $js);
?>
</div>
<?php
}
?>
</div>
<div id="hikashop_checkout_<?php echo $this->type; ?>_address_zone">
<?php
if(empty($this->addresses)) {
$js = '';
$params = new stdClass();
$params->type = $this->type;
$params->address_id = 0; //(int)$address->address_id;
$params->edit = true;
$params->fieldset_id = 'hikashop_checkout_'.$this->type.'_address_zone';
echo hikashop_getLayout('address', 'show', $params, $js);
}
?>
</div>
<?php
static $hikashop_address_select_once = false;
if(!$hikashop_address_select_once) {
$hikashop_address_select_once = true;
?>
<script type="text/javascript">
if(!window.localPage) window.localPage = {};
window.localPage.currentsAddr = {};
window.localPage.switchAddr = function(el, type, old) {
var d = document, w = window, o = w.Oby, target = d.getElementById('hikashop_checkout_selected_' + type + '_address');
if(el === 0 || el.value == '0') {
window.localPage.currentsAddr[type] = old;
if(target)
target.innerHTML = '';
var dest = d.getElementById('hikashop_checkout_' + type + '_address_zone'),
url = '<?php echo hikashop_completeLink('address&task=edit&cid=0&address_type={TYPE}&fid=hikashop_checkout_{TYPE}_address_zone', true, true); ?>'.replace(/\{TYPE\}/g, type);
o.xRequest(url, {update:dest});
if(el === 0)
return false;
return;
}
<?php if($config->get('auto_submit_methods', 1)) { ?>
if(old === undefined || (old !== undefined && old !== 'reset')) {
el.form.submit();
return;
}
<?php }?>
if(!target)
return;
var url = '<?php echo hikashop_completeLink('address&task=show&cid={CID}&address_type={TYPE}&fid=hikashop_checkout_{TYPE}_address_zone', true, true); ?>'.replace(/\{CID\}/g, el.value).replace(/\{TYPE\}/g, type);
o.xRequest(url, {update:target});
}
window.Oby.registerAjax('hikashop_address_changed', function(params) {
if(!params || !params.type)
return;
var d = document,
other_type = (params.type == 'billing') ? 'shipping' : 'billing',
el_show = d.getElementById('hikashop_checkout_'+params.type+'_address_selection'),
el_edit = d.getElementById('hikashop_checkout_'+params.type+'_address_zone'),
el_sel = d.getElementById('hikashop_checkout_address_'+params.type+'_selector');
var radios = document.getElementsByName("checkout_'+params.type+'_address_radio");
var selected = false;
if(radios){
for (var i = 0, len = radios.length; i < len; i++) {
if (radios[i].checked) {
selected = true;
}
}
}
if(params.edit) {
el_show.style.display = 'none';
el_edit.style.display = '';
return;
}else if(params.cid == 0 && params.task == 'show' && window.localPage.currentsAddr[params.type]) {
if(el_sel) {
el_sel.value = window.localPage.currentsAddr[params.type];
window.localPage.switchAddr(el_sel, params.type, 'reset');
}
}else if(params.type=='shipping' && params.task == 'save' && (!selected || d.getElementById('hikashop_shipping_methods') || d.getElementById('hikashop_payment_methods') || d.getElementById('hikashop_checkout_cart') )){
d.forms['hikashop_checkout_form'].submit();
}else if(window.localPage.currentsAddr[params.type] == params.cid && params.cid != 0 && params.type=='billing' && (!d.getElementById('hikashop_checkout_shipping_address') || (d.getElementById('same_address') && d.getElementById('same_address').checked) || !selected) && (d.getElementById('hikashop_shipping_methods') || d.getElementById('hikashop_payment_methods') || d.getElementById('hikashop_checkout_cart') )){
window.location.reload();
}
if(el_edit.children.length == 0)
return;
var el_cur = d.getElementById('hikashop_checkout_selected_'+params.type+'_address'),
content = el_edit.firstChild.innerHTML,
reg = new RegExp(params.type, 'g');
el_edit.style.display = 'none';
el_edit.innerHTML = '';
if(el_sel && el_cur && params.cid > 0) {
for(var k in el_sel.options) {
if(!el_sel.options.hasOwnProperty(k))
continue;
if(params.previous_cid && el_sel.options[k].value == params.previous_cid && params.previous_cid != 0 && params.previous_cid != params.cid)
el_sel.options[k].value = params.cid;
if(el_sel.options[k].value == params.cid)
el_sel.options[k].text = params.miniFormat;
}
if(params.previous_cid !== undefined && params.previous_cid === 0) {
var o = d.createElement('option');
o.text = params.miniFormat;
o.value = params.cid;
el_sel.add(o, el_sel.options[el_sel.selectedIndex]);
el_sel.selectedIndex--;
}
if(el_sel.options[el_sel.selectedIndex].value == params.cid)
el_cur.innerHTML = content;
var ot_cur = d.getElementById('hikashop_checkout_selected_'+other_type+'_address'),
ot_sel = d.getElementById('hikashop_checkout_address_'+other_type+'_selector');
if(ot_sel) {
for(var k in ot_sel.options) {
if(!ot_sel.options.hasOwnProperty(k))
continue;
if(params.previous_cid && ot_sel.options[k].value == params.previous_cid && params.previous_cid != 0 && params.previous_cid != params.cid)
ot_sel.options[k].value = params.cid;
if(ot_sel.options[k].value == params.cid)
ot_sel.options[k].text = params.miniFormat;
}
if(params.previous_cid !== undefined && params.previous_cid === 0) {
var o = d.createElement('option');
o.text = params.miniFormat;
o.value = params.cid;
ot_sel.add(o, el_sel.options[el_sel.options.length]);
}
if(ot_sel.options[ot_sel.selectedIndex].value == params.cid)
ot_cur.innerHTML = content.replace(reg, other_type);
}
if(params.type=='billing' && params.task == 'save' && (!d.getElementById('hikashop_checkout_shipping_address') || (d.getElementById('same_address') && d.getElementById('same_address').checked) || !selected) && (d.getElementById('hikashop_shipping_methods') || d.getElementById('hikashop_payment_methods') || d.getElementById('hikashop_checkout_cart') )){
d.forms['hikashop_checkout_form'].submit();
}
} else if(!el_sel || !el_cur) {
var target_id = params.previous_cid || params.cid,
target = d.getElementById('hikashop_address_'+params.type+'_' + target_id),
other_target = d.getElementById('hikashop_address_'+other_type+'_' + target_id);
if(target) {
target.innerHTML = content;
} else if(params.cid > 0) {
window.hikashop.dup('hikashop_checkout_'+params.type+'_address_template', {'VALUE':params.cid, 'CONTENT':content}, null);
window.hikashop.dup('hikashop_checkout_'+other_type+'_address_template', {'VALUE':params.cid, 'CONTENT': content.replace(reg, other_type) }, null);
}
if(other_target)
other_target.innerHTML = content.replace(reg, other_type);
}
el_show.style.display = '';
});
window.Oby.registerAjax('hikashop_address_deleted', function(params) {
if(!params || !params.type)
return;
var d = document, w = window, o = w.Oby,
other_type = (params.type == 'billing') ? 'shipping' : 'billing',
el_show = d.getElementById('hikashop_checkout_'+params.type+'_address_selection'),
el_edit = d.getElementById('hikashop_checkout_'+params.type+'_address_zone'),
el_cur = d.getElementById('hikashop_checkout_selected_'+params.type+'_address'),
el_sel = d.getElementById('hikashop_checkout_address_'+params.type+'_selector');
reg = new RegExp(params.type, 'g');
if(params.cid <= 0)
return;
if(el_sel && el_cur) {
for(var k in el_sel.options) {
if(!el_sel.options.hasOwnProperty(k))
continue;
if(el_sel.options[k].value == params.cid) {
el_sel.remove(k);
break;
}
}
o.fireEvent(el_sel,'change');
var ot_cur = d.getElementById('hikashop_checkout_selected_'+other_type+'_address'),
ot_sel = d.getElementById('hikashop_checkout_address_'+other_type+'_selector');
if(ot_sel) {
for(var k in el_sel.options) {
if(!el_sel.options.hasOwnProperty(k))
continue;
if(ot_sel.options[k].value == params.cid) {
ot_sel.remove(k);
break;
}
}
o.fireEvent(ot_sel,'change');
}
} else {
var targets = ['hikashop_address_' + params.type + '_selection_' + params.cid, 'hikashop_address_' + other_type + '_selection_' + params.cid];
for(var i = 0; i < targets.length; i++) {
var s = d.getElementById(targets[i]);
if(s)
s.parentNode.removeChild(s);
}
}
});
window.Oby.registerAjax('hikashop_address_click', function(params) {
if(!params.type || !params.cid)
return;
var d = document, w = window, o = w.Oby,
r = d.getElementById('hikashop_checkout_' + params.type + '_address_radio_' + params.cid);
if(r)
r.checked = 'checked';
r = d.getElementById('hikashop_checkout_' + params.type + '_address_selection');
for(var i = r.childNodes.length - 1; i >= 0; i--) {
var e = r.childNodes[i];
if(!e) continue;
if(!e.tagName || e.tagName.toLowerCase() != 'div') continue;
o.removeClass(e, 'address_selected');
}
r = d.getElementById('hikashop_address_' + params.type + '_selection_' + params.cid);
o.addClass(r, 'address_selected');
});
</script>
<?php
}
However the same bug happens also when I use the default 2.6.3 checkout/address_select.php file
In fact in all versions of the view file it is the same. Those changes don't solve the problem, it just makes the shipping and billing address the same and the changes happening to both of them. That is pointless.
I need one billing address on the left side that can be edited and one independent pre filled shipping address on the right side that can be edited.