Domanda

C'è un modo per ottenere la città e lo stato per selezionare correttamente una volta che i nostri operatori digitano il codice postale?Sembra che gli orari passino mentre si tenta di selezionare lo stato appropriato nel menu a discesa.

È stato utile?

Soluzione

Utilizzo di un servizio gratuito (per ora) gratuito, getziptastic.com , è possibile implementare una soluzione. Le forme contenenti la città, lo stato e i codici postali sono costruiti in questo file: app / design / adminhtml / predefinito / predefinito / modello / vendite / ordine / crea / modulo / indirizzo.phtml

Aggiornamento: Al test, ho trovato che l'indirizzo di spedizione potrebbe tornare ai valori originali dopo la fine della funzione del mio osservatore. Questo spiega perché ogni esempio su Internet per Autocompition Magento solo mostra l'indirizzo di fatturazione e rimanere in silenzio sull'indirizzo di spedizione. Guardando il codice, potrei dire a queste due linee erano il mio problema:

    order.bindAddressFields('<?php echo $_fieldsContainerId ?>');
    order.bindAddressFields('<?php echo $_addressChoiceContainerId ?>');
.

Grazie agli strumenti per gli sviluppatori di Chrome e all'espressione dell'orologio per order, alla fine ho trovato la funzione loadArea() è stata annidata all'interno di bindAddressFields() che sta già osservando il modulo. Piuttosto che manipolare gli elementi del modulo tramite prototipo o scriptaculaculaculaculaculaculacular, modifico invece l'oggetto Global Java order. Si noti inoltre come gli sviluppatori magenti resi il testo dell'ID dell'elemento appaiono come la notazione dell'oggetto.

Per utilizzare loadArea(), ho copiato da JS / Mage / Adminhtml / sales.js vicino alla linea 304.

Ho finito utilizzando funzioni separate per la fatturazione e la spedizione con il codice condiviso utilizzando
<?php echo $bs ?> Ho aggiunto Effect.Highlight() di ScriptaCular per il feedback all'utente.

Ho aggiunto questo in basso:
(scuse in anticipo per la mia codifica JavaScript Lame)

<?php if($this->getIsShipping()) { 
    $bs='shipping';
?>
<script type="text/javascript">
$('order-<?php echo $bs ?>_address_postcode').observe('change', function(event) {
    var data = order.serializeData(order.shippingAddressContainer);
    data = data.toObject();
    if( 'US' == data['order[shipping_address][country_id]'] ) {
        new Effect.Highlight( $('order-<?php echo $bs ?>_address_city'), { startcolor: "#ccddff", duration: 3 });
        new Effect.Highlight( $('order-<?php echo $bs ?>_address_region_id'), { startcolor: "#ccddff", duration: 3 });
        new Effect.Highlight( this, { startcolor: "#ccddff", duration: 3 });
        //  zip.php is our wrapper for JSON get of url = http://zip.getziptastic.com/v2/91941
        //  otherwise, Magento and javascript were mad about cross domain ajax call
        var url = '/var/export/zip.php?zip='+this.value;
        new Ajax.Request( url, {
            onSuccess: function(transport){
                var zcs = transport.responseText.evalJSON();    // zcs: zip city state
                data['order[shipping_address][postcode]'] = this.value;
                data['order[shipping_address][city]']=zcs.city;
                $$('select#order-<?php echo $bs ?>_address_region_id option').each(function(o) {
                  if(o.innerHTML == zcs.state) { // note, this compares strings
                    data['order[shipping_address][region_id]'] = o.value;
                  }
                });
                order.loadArea(['shipping_method', 'billing_method', 'shipping_address', 'totals', 'giftmessage'], true, data);
           }
        });
    }
});
</script>
<?php } else { 
    $bs='billing';
?>
<script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=true&libraries=places"></script>
<script type="text/javascript">
var el<?php echo $bs ?> = document.getElementById('order-<?php echo $bs ?>_address_postcode');
Event.observe( el<?php echo $bs ?> ,'change', function( ) {  
    var country = document.getElementById('order-<?php echo $bs ?>_address_country_id');
    //  If we're in the US of A, we'll do this thing
    var index = country.selectedIndex;
    if( country.options[index].value == 'US' ) {
        new Effect.Highlight( $('order-<?php echo $bs ?>_address_city'), { startcolor: "#ccddff", duration: 3 });
        new Effect.Highlight( $('order-<?php echo $bs ?>_address_region_id'), { startcolor: "#ccddff", duration: 3 });
        new Effect.Highlight( this, { startcolor: "#ccddff", duration: 3 });
        var url = '/var/export/zip.php?zip='+el<?php echo $bs ?>.value;
        new Ajax.Request( url, {
            onSuccess: function(transport){
                var data = transport.responseText.evalJSON();
                var city = document.getElementById('order-<?php echo $bs ?>_address_city');
                city.value =  data.city;
                // change SELECT derived from: http://stackoverflow.com/questions/1243595/how-do-i-select-an-option-using-prototype
                $$('select#order-<?php echo $bs ?>_address_region_id option').each(function(o) {
                  if(o.innerHTML == data.state) { // note, this compares strings
                    o.selected = true;
                  } else { 
                    o.selected = false;
                  }
                });
           }
        });
    }
});
</script>
<?php } ?>
.

Dopo aver trascorso alcune ore cercando di rendere il JavaScript una chiamata Ajax Domain Domain a GetZiptaStastic.com, ho rinunciato e realizzato un wrapper php per questa richiesta: Var / Export / Zip.php

<?php 
if( strlen( $_GET['zip'] ) ) {
    $url = 'https://zip.getziptastic.com/v2/'.$_GET['zip'];
    $json = file_get_contents( $url );
    echo $json;
}
?>
.


.

Un'alternativa alla procedura di cui sopra è quella di farlo "The Magento Way" e costruire un modulo e evocare il codice php nel modello e sovrascrittura address.phtml nel tuo codice di codice locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top