Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Populate multiple input boxes from a php function

I am trying to create a page which calculates pricing dependant on country. I have two pricing tiers and want to update the pricing in two separate input fields when the country is selected. I could do this by repeating the JQuery and business_plan_calculation function twice but wanted to know if there was a way of doing it with one function?

Here is the code I am using to do it with two functions

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);
like image 975
Dudley Avatar asked Sep 11 '26 22:09

Dudley


1 Answers

This is actually fairly simple to accomplish.

Change your AJAX PHP function to return BOTH values, and return a JSON encoded array.

Then, in your javascript AJAX success callback, get the two pieces of data, and put them into the two separate inputs.

Changes below are commented to explain what's going on:

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

NOTE: After working through the code in the question, there's many typos and other problems. The question is not about fixing / improving those issues, so I've stuck to showning you the pattern for how to do what you want. If it does not work for you, you will need to troubleshoot the issues that exist in the code.

like image 162
random_user_name Avatar answered Sep 14 '26 12:09

random_user_name



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!