2017-06-17 59 views
3

我正在嘗試創建一個計算取決於國家/地區的定價的頁面。我有兩個定價級別,並希望在選擇國家時在兩個單獨的輸入字段中更新定價。我可以通過重複JQuery和business_plan_calculation函數兩次來做到這一點,但想知道是否有一種方法用一個函數做到這一點?從php函數填充多個輸入框

這裏是我用做它的代碼有兩個功能

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); 

回答

1

這實際上是相當簡單的完成。

更改您的AJAX PHP函數以返回BOTH值並返回JSON編碼數組。

然後,在您的JavaScript AJAX成功回調中,獲取這兩個數據,並將它們放入兩個單獨的輸入中。下面

的更改註釋解釋這是怎麼回事:

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'); 

注意: 通過問題的代碼工作以後,有很多錯別字和其他問題。問題不在於解決/改進這些問題,所以我堅持要告訴你模式如何做到你想要的。如果它不適合你,你需要解決代碼中存在的問題。

+0

非常感謝您的回答。我試圖實現這一點,但我無法得到它的工作。我對編碼很陌生,這可能是爲什麼。你說我原來的代碼中有錯字和其他問題。你能給我一個例子,所以我可以嘗試修復這些嗎?我原來的代碼工作,所以我不知道在哪裏可以找到錯誤。謝謝 – Dudley

+0

例如,這一行不能工作:'add_action('wp_ajax_nopriv_enterprise_calculation',enterprise_calculation);' - 第二個參數需要是一個字符串或數組。 –

+0

感謝您的支持,我現在已經掌握了它的工作原理 – Dudley