2017-06-17 1 views
3

Ich versuche, eine Seite zu erstellen, die Preise abhängig von Land berechnet. Ich habe zwei Preisstufen und möchte die Preise in zwei separaten Eingabefeldern aktualisieren, wenn das Land ausgewählt wird. Ich könnte dies tun, indem ich die JQuery- und Business_plan_calculation-Funktion zweimal wiederhole, aber wollte wissen, ob es eine Möglichkeit gibt, dies mit einer Funktion zu tun?Füllen Sie mehrere Eingabefelder von einer PHP-Funktion

Hier ist der Code, den ich es mit zwei Funktionen

function country_selector() { 

    global $wpdb; 

    $results = $wpdb->get_results("SELECT country FROM master_country ORDER BY country ASC"); 

    foreach ($results as $rows) : 
     $option .= '<option value="'.$rows->country.'">'; 
     $option .= $rows->country; 
     $option .= '</option>'; 
    endforeach; 

    ?> 

<script type="text/javascript"> 
    jQuery(document).ready(function() { 

     jQuery('#country_selector').change(function() { 
      var countryPOP = jQuery('#country_selector').val(); 

     jQuery.ajax({ 
      url: "<?php bloginfo('wpurl'); ?>/wp-admin/admin-ajax.php", 
      type: 'POST', 
      data: 'action=business_plan_calculation&countryID=' + countryPOP, 

      success: function(results) { 
       jQuery('#business_plus_price').empty(); 
       jQuery('#business_plus_price').val(results); 
        } 
       }); 

      jQuery.ajax({ 
      url: "<?php bloginfo('wpurl'); ?>/wp-admin/admin-ajax.php", 
      type: 'POST', 
      data: 'action=enterprise_calculation&countryID=' + countryPOP, 

      success: function(results) { 
       jQuery('#enterprise_price').empty(); 
       jQuery('#enterprise_price').val(results); 
        } 
       }); 
      }); 
     }); 
     </script> <?php 

    return '<select id="country_selector"><option value="0" disabled selected>Select Your Country</option>'.$option.'</select>'; 

} 

add_shortcode('country-selector', 'country_selector'); 


function business_plan_calculation() { 

    if(isset($_POST['countryID'])) : 

     $parentCat=$_POST['countryID']; 

     global $wpdb; 
     $results = $wpdb->get_row("SELECT currency_alpha, ppp_conversion FROM master_country WHERE country='$parentCat'"); 

     $endpoint = 'convert'; 
     $access_key = '3a8c6c408b87705bde661d3d17b938ed'; 

     $user_currency = $results->currency_alpha; 

     $chGBPUSD = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from=GBP&to=USD&amount=1'); 
     $chUSERGBP = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from='.$user_currency.'&to=GBP&amount=1'); 

     curl_setopt($chGBPUSD, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($chUSERGBP, CURLOPT_RETURNTRANSFER, true); 

     $mh = curl_multi_init(); 
     curl_multi_add_handle($mh, $chGBPUSD); 
     curl_multi_add_handle($mh, $chUSERGBP); 

     $active = null; 
     do { 
      curl_multi_exec($mh, $active); 
     } while ($active); 

     $GBPUSD = curl_multi_getcontent($chGBPUSD); 
     $USERGBP = curl_multi_getcontent($chUSERGBP); 

     curl_multi_close($mh); 

     $conversionResultGBPUSD = json_decode($GBPUSD, true); 
     $conversionResultUSERGBP = json_decode($USERGBP, true); 

     $GBPUSDresults = $conversionResultGBPUSD['result']; 
     $USERGBPresults = $conversionResultUSERGBP['result']; 

     $ppp = $results->ppp_conversion; 

     $business_plus = (65 * $GBPUSDresults * $ppp * $USERGBPresults); 
     echo '£'.number_format((float)$business_plus, 2, '.', '').' per year'; 

     die(); 

    endif; 
} 

add_action('wp_ajax_nopriv_business_plan_calculation', business_plan_calculation); 
add_action('wp_ajax_business_plan_calculation', business_plan_calculation); 


function enterprise_calculation() { 

    if(isset($_POST['countryID'])) : 

     $parentCat=$_POST['countryID']; 

     global $wpdb; 
     $results = $wpdb->get_row("SELECT currency_alpha, ppp_conversion FROM master_country WHERE country='$parentCat'"); 

     $endpoint = 'convert'; 
     $access_key = '3a8c6c408b87705bde661d3d17b938ed'; 

     $user_currency = $results->currency_alpha; 

     $chGBPUSD = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from=GBP&to=USD&amount=1'); 
     $chUSERGBP = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from='.$user_currency.'&to=GBP&amount=1'); 

     curl_setopt($chGBPUSD, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($chUSERGBP, CURLOPT_RETURNTRANSFER, true); 

     $mh = curl_multi_init(); 
     curl_multi_add_handle($mh, $chGBPUSD); 
     curl_multi_add_handle($mh, $chUSERGBP); 

     $active = null; 
     do { 
      curl_multi_exec($mh, $active); 
     } while ($active); 

     $GBPUSD = curl_multi_getcontent($chGBPUSD); 
     $USERGBP = curl_multi_getcontent($chUSERGBP); 

     curl_multi_close($mh); 

     $conversionResultGBPUSD = json_decode($GBPUSD, true); 
     $conversionResultUSERGBP = json_decode($USERGBP, true); 

     $GBPUSDresults = $conversionResultGBPUSD['result']; 
     $USERGBPresults = $conversionResultUSERGBP['result']; 

     $ppp = $results->ppp_conversion; 

     $enterprise = (120 * $GBPUSDresults * $ppp * $USERGBPresults); 
     echo '£'.number_format((float)$enterprise, 2, '.', '').' per year'; 

     die(); 

    endif; 
} 

add_action('wp_ajax_nopriv_enterprise_calculation', enterprise_calculation); 
add_action('wp_ajax_enterprise_calculation', enterprise_calculation); 

Antwort

1

Dies ist eigentlich recht einfach zu bewerkstelligen zu tun, verwenden.

Ändern Sie Ihre AJAX PHP-Funktion, um BEIDE Werte zurückzugeben und ein JSON-codiertes Array zurückzugeben.

Dann, in Ihrem Javascript AJAX-Erfolg Rückruf, erhalten Sie die zwei Stücke von Daten, und legen Sie sie in die zwei separaten Eingaben.

unten Änderungen werden kommentiert, zu erklären, was los ist:

function country_selector() { 

    global $wpdb; 

    $results = $wpdb->get_results("SELECT country FROM master_country ORDER BY country ASC"); 

    foreach ($results as $rows) { 
     $option .= '<option value="'.$rows->country.'">'; 
     $option .= $rows->country; 
     $option .= '</option>'; 
    } ?> 
<script> 
    // no-conflict safe shorthand document ready 
    jQuery(function($) { 
     // now $ is safe to use inside this function 
     $('#country_selector').change(function() { 
      var countryPOP = $('#country_selector').val(); 

     $.ajax({ 
      // use the WP function admin_url() here... 
      url: '<?php echo admin_url('admin-ajax.php') ?>', 
      type: 'POST', 
      // tell jQuery we expect JSON back so it auto-parses to JSON 
      dataType: 'json', 
      data: 'action=country_calculations&countryID=' + countryPOP, 
      success: function(results) { 
       // NOTE: Should do something here if results is NOT what is expected 
       // clear BOTH inputs 
       $('#business_plus_price, #enterprice_price').empty(); 
       // access the business_plus results, put into input 
       $('#business_plus_price').val(results.business_plus); 
       // access the enterprise results, put into input 
       $('#enterprise_price').val(results.enterprise); 
        } 
       }); 
     }); 
</script> 
<?php  
    return '<select id="country_selector"><option value="0" disabled selected>Select Your Country</option>'.$option.'</select>'; 

} 

// new AJAX function that gets and returns BOTH price calculations 
function ajax_country_price_calculations() { 
    $data = country_price_calculations(); 
    // NOTE: should do something here in case $data is empty/FALSE 

    // this function json_encodes, outputs, and dies 
    wp_send_json($data); 
} 

// SIMPLIFIED your two functions into a single function. 
// This reduces duplicate code, AND reduces CURL calls. 
function country_price_calculations() { 

    if(isset($_POST['countryID'])) { 
     $parentCat = $_POST['countryID']; 

     global $wpdb; 
     $results = $wpdb->get_row("SELECT currency_alpha, ppp_conversion FROM master_country WHERE country='$parentCat'"); 

     $endpoint = 'convert'; 
     $access_key = '3a8c6c408b87705bde661d3d17b938ed'; 

     $user_currency = $results->currency_alpha; 

     $chGBPUSD = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from=GBP&to=USD&amount=1'); 
     $chUSERGBP = curl_init('https://apilayer.net/api/'.$endpoint.'?access_key='.$access_key.'&from='.$user_currency.'&to=GBP&amount=1'); 

     curl_setopt($chGBPUSD, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($chUSERGBP, CURLOPT_RETURNTRANSFER, true); 

     $mh = curl_multi_init(); 
     curl_multi_add_handle($mh, $chGBPUSD); 
     curl_multi_add_handle($mh, $chUSERGBP); 

     $active = null; 
     do { 
      curl_multi_exec($mh, $active); 
     } while ($active); 

     $GBPUSD = curl_multi_getcontent($chGBPUSD); 
     $USERGBP = curl_multi_getcontent($chUSERGBP); 

     curl_multi_close($mh); 

     $conversionResultGBPUSD = json_decode($GBPUSD, true); 
     $conversionResultUSERGBP = json_decode($USERGBP, true); 

     $GBPUSDresults = $conversionResultGBPUSD['result']; 
     $USERGBPresults = $conversionResultUSERGBP['result']; 

     $ppp = $results->ppp_conversion; 

     $business_plus = (65 * $GBPUSDresults * $ppp * $USERGBPresults); 
     $enterprise = (120 * $GBPUSDresults * $ppp * $USERGBPresults); 
     // RETURN the results instead of echo now... 
     // assign calculations to an associative array 
     return array(
      'business_plus' => '£'.number_format((float)$business_plus, 2, '.', '').' per year', 
      'enterprise' => '£'.number_format((float)$enterprise, 2, '.', '').' per year' 
     ); 
    } 
    // NOTE: Should return SOMETHING (such as FALSE) if this fails... 
} 

// Now you only need one AJAX endpoint 
add_action('wp_ajax_nopriv_country_price_calculations', 'ajax_country_price_calculations'); 
add_action('wp_ajax_country_price_calculations', 'ajax_country_price_calculations'); 

HINWEIS: Nachdem er in der Frage durch den Code arbeiten, gibt es viele Tippfehler und andere Probleme. Die Frage geht nicht darum, diese Probleme zu beheben/zu verbessern, also habe ich daran festgehalten, Ihnen das Muster zu zeigen, wie Sie tun können, was Sie wollen. Wenn es für Sie nicht funktioniert, müssen Sie die Probleme beheben, die im Code vorhanden sind.

+0

Vielen Dank für Ihre Antwort. Ich habe versucht, dies zu implementieren, aber ich kann es nicht zum Laufen bringen. Ich bin sehr neu in der Codierung, was wahrscheinlich der Grund ist. Du sagst, mein ursprünglicher Code hatte Tippfehler und andere Probleme. Kannst du mir bitte ein Beispiel geben, damit ich versuchen kann, diese zuerst zu beheben? Mein ursprünglicher Code hat funktioniert, daher bin ich nicht wirklich sicher, wo ich die Fehler finden könnte. Danke – Dudley

+0

Zum Beispiel konnte diese Zeile nicht funktionieren: 'add_action ('wp_ajax_nopriv_enterprise_calculation', enterprise_calculation);' - Das zweite Argument muss eine Zeichenfolge oder ein Array sein. –

+0

Danke dafür habe ich jetzt funktioniert – Dudley

Verwandte Themen