I wanted my users to have a better UI on the Customer Info page on checkout, we have US and International users.
What I have set up is a user will select their country, then if the country is the US they will see a state selection field, and they will not see the Other State/Province field. If the user selects a country that is not the US, they will see the Other State/Province field, but not the state selection field.
Ive been testing this and it's so close to working perfectly.
The last issue that I can see, is that if a user selects the united states first, and selects a state, but then changes to international, and fills in a state, on the next screen (Shipping & Payment Options) I can see that the US state that they selected shows, instead of the state that they typed. It's a bug, and a user may never replicate how I got it, but I'd like to see if someone can find a solution, and I also want to share the code, since I see a lot of messages on here regarding the layout of these fields.
This requires that each US state is filled in as a selection option so I only have a couple options for testing purposes.
Shipping Info Country & State:
Billing Info Country & State:
JS:
What I have set up is a user will select their country, then if the country is the US they will see a state selection field, and they will not see the Other State/Province field. If the user selects a country that is not the US, they will see the Other State/Province field, but not the state selection field.
Ive been testing this and it's so close to working perfectly.
The last issue that I can see, is that if a user selects the united states first, and selects a state, but then changes to international, and fills in a state, on the next screen (Shipping & Payment Options) I can see that the US state that they selected shows, instead of the state that they typed. It's a bug, and a user may never replicate how I got it, but I'd like to see if someone can find a solution, and I also want to share the code, since I see a lot of messages on here regarding the layout of these fields.
This requires that each US state is filled in as a selection option so I only have a couple options for testing purposes.
Shipping Info Country & State:
Code:
<div class="&mvte:global:ShipCountry_Row;"> <label class="control-label required" for="ShipCountry">Country:</label> <mvt:item name="countries" param="ShipCountry" /> </div> <div class="&mvte:global:ShipState_Row; shipstateselect"> <label class="required" for="ShipStateSelect"><span>* </span>State:</label> <select name="ShipStateSelect" id="ShipStateSelect"> <option value="" class="shipus-states" selected>Select State</option> <mvt:if expr="g.ShipStateSelect EQ 'AL'"> <option class="shipus-states" value="AL" selected>Alabama</option> <mvt:else> <option class="shipus-states" value="AL">Alabama</option> </mvt:if> <mvt:if expr="g.ShipStateSelect EQ 'AK'"> <option class="shipus-states" value="AK" selected>Alaska</option> <mvt:else> <option class="shipus-states" value="AK">Alaska</option> </mvt:if> <mvt:if expr="g.ShipStateSelect EQ 'AZ'"> <option class="shipus-states" value="AZ" selected>Arizona</option> <mvt:else> <option class="shipus-states" value="AZ">Arizona</option> </mvt:if> <mvt:if expr="g.ShipStateSelect EQ ''"> <option class="shipus-states" value="" selected>Outside US</option> <mvt:else> <option class="shipus-states" value="">Outside US</option> </mvt:if> </select> </div> <div class="&mvte:global:ShipState_Row; otherShipState"> <label class="italic" for="ShipState">Other State/Province:</label> <input type="text" name="ShipState" id="ShipState" value="&mvte:global:ShipState;" class="textfield" /> </div>
Code:
<div class="&mvt:global:BillCountry_Row;"> <label class="control-label required" for="BillCountry">Country:</label> <mvt:item name="countries" param="BillCountry" /> </div> <div class="&mvte:global:BillState_Row; billstateselect"> <label class="required" for="BillStateSelect"><span>* </span>State:</label> <select name="BillStateSelect" id="BillStateSelect"> <option value="" class="billus-states" selected>Select State</option> <mvt:if expr="g.BillStateSelect EQ 'AL'"> <option class="billus-states" value="AL" selected>Alabama</option> <mvt:else> <option class="billus-states" value="AL">Alabama</option> </mvt:if> <mvt:if expr="g.BillStateSelect EQ 'AK'"> <option class="billus-states" value="AK" selected>Alaska</option> <mvt:else> <option class="billus-states" value="AK">Alaska</option> </mvt:if> <mvt:if expr="g.BillStateSelect EQ 'AZ'"> <option class="billus-states" value="AZ" selected>Arizona</option> <mvt:else> <option class="billus-states" value="AZ">Arizona</option> </mvt:if> <mvt:if expr="g.BillStateSelect EQ ''"> <option class="billus-states" value="" selected>Outside US</option> <mvt:else> <option class="billus-states" value="">Outside US</option> </mvt:if> </select> </div> <div class="&mvte:global:BillState_Row; otherBillState"> <label class="italic" for="BillState">Other State/Province:</label> <input type="text" name="BillState" id="BillState" value="&mvte:global:BillState;" class="textfield" /> </div>
Code:
<script> var billSelect = document.getElementById('BillStateSelect'); var shipSelect = document.getElementById('ShipStateSelect'); var billState = '&mvte:global:basket:bill_state;'; var shipState = '&mvte:global:basket:ship_state;'; var billCountrySelect = document.getElementById('BillCountry'); var shipCountrySelect = document.getElementById('ShipCountry'); var billCountry = '&mvte:global:basket:bill_cntry;'; var shipCountry = '&mvte:global:basket:ship_cntry;'; var otherShipState = document.getElementById('ShipState'); var otherBillState = document.getElementById('BillState'); console.log(shipSelect.value); if (billState != '' && billSelect.value != billState) { billSelect.value = .billus-state; } if (shipState != '' && shipSelect.value != shipState) { shipSelect.value = .shipus-state; } if (billCountry != '' && billCountrySelect.value != billCountry) { billCountrySelect.value = billCountry; } if (shipCountry != '' && shipCountrySelect.value != shipCountry) { shipCountrySelect.value = shipCountry; } </script> <script type="text/javascript"> $(function(){ checkCountry(); $("#BillCountry").on('change',checkCountry); function checkCountry() { var bcountry = $("#BillCountry").val(); if( bcountry!='US') { $(".otherBillState").show(); $(".billstateselect").hide(); } else if(bcountry=='US') { $(".otherBillState").hide(); $(".billus-state").show(); } else { $(".otherBillState").css("display", "block"); } if( bcountry=='US') { $(".otherBillState").hide(); $(".billstateselect").show(); } }; }); </script> <script type="text/javascript"> $(function(){ checkCountry(); $("#ShipCountry").on('change',checkCountry); function checkCountry() { var scountry = $("#ShipCountry").val(); if( scountry!='US') { $(".otherShipState").show(); $(".shipstateselect").hide(); } else if(scountry=='US') { $(".otherShipState").hide(); $(".shipus-state").show(); } else { $(".otherShipState").css("display", "block"); } if( scountry=='US') { $(".otherShipState").hide(); $(".shipstateselect").show(); } }; }); </script>
Comment