2017-01-31 4 views
0

Сейчас я работаю над тем, что сделает пользователь не облагаемым НДС. Я создал поле, которое требует номер налога (номер вата). Я создал функцию php, которая проверяет номера ваттов validate($vat_number), который возвращает true или false.PHP/AJAX do php, когда пользовательское поле имеет действительный ввод WooCommerce

То, что я хочу

Всякий раз, когда поле чана обновляются Я хочу, чтобы проверить, если validate($vat_number) == true

Если это правда, я хочу, чтобы изменить текущий клиент быть освобожден от НДС с функцией set_is_vat_exempt() от WooCommerce ,

Когда это удалось, я хочу использовать AJAX update_order_review, чтобы установить все, чтобы освободить от НДС.

Все это должно происходить без обновления/перезагрузки страницы.

Что мне делать? У меня есть приличные знания php и js, но AJAX для меня совсем нова. Любая помощь будет принята с благодарностью.

+0

Вы когда-нибудь это выясняли?Облицовка аналогичной проблемы с попыткой использовать AJAX для удаления налога. – ryanka

+0

Жаль, что я сделал .. Я, вероятно, должен начать изучать AJAX :( –

ответ

0

Для этого вы должны использовать комбинацию AJAX и PHP.

Часть JS будет иметь функцию проверки следующим образом :.

/* 
* Validates whether or not the necessary fields are provided. 
*/ 
function validateExemptionStatus() { 
    if ($("#wc_checkout_add_ons_3").is(':checked') && $("#wc_checkout_add_ons_4").val() != "" && $("#wc_checkout_add_ons_5").val() != "") { 
     //Check the file upload 
     if ($(".input-file-plupload a.file").attr("href") != "") 
      return true; 
    } 
     return false; 
} 

В моем конкретном случае использования есть файл для загрузки. Вы просто хотите, чтобы это соответствовало тому, что вы хотите проверить. Я использую плагин WooCommerce Add-Ons для обработки дополнительных полей. Этот плагин запускает update_checkout крючок, когда вы focusout с поля.

код AJAX Я должен обрабатывать фактическую обработку:

function handleTaxExemptionStatus(triggerUpdate) { 
    //Validate whether all fields were filled out or not. 
    if (validateExemptionStatus() === true) { 
     var data_string = "action=example_remove_tax"; 
    } else { 
     var data_string = "action=example_add_tax"; 
    } 
    console.log(data_string); 

    //Make the appropriate AJAX call to add/remove the tax. 
    $.ajax({ 
     url: ajax_url, 
     type:'POST', 
     data: data_string, 
     success: function(html) { 
      if (triggerUpdate) 
       $('body').trigger('update_checkout'); 
     }, 
     error: function(xhr, status, error) { 
      var err = eval("(" + xhr.responseText + ")"); 
      console.log("ERROR:"+err.Message); 
      return false; 
     } 
    }); 


} 

Теперь мы Cookin'. У нас есть функция проверки и функция, которая делает фактический вызов AJAX. Теперь нам просто нужно знать, когда проверять.

/* 
* When the AJAX call is complete, this function validates whether 
* or not the information for the tax exemption was changed. 
* If the information was changed, it makes a call to the handler 
* function to update the information (and the checkout data) accordingly. 
*/ 
$(document).ajaxComplete(function(event, xhr, settings) { 
    //Trigger when the order_review is updated 
    if(settings.url.indexOf('update_order_review') > -1) { 

     var validationStatus = validateExemptionStatus(); 
     var hiddenVarData = $("input#add-remove-tax-trigger").val(); 
     var hiddenVarValue = (hiddenVarData == 'true'); 

     if (hiddenVarValue != validationStatus) { 
      //Set the new value on the hidden field 
      $("input#add-remove-tax-trigger").val(validationStatus); 

      //Update the exemption status 
      handleTaxExemptionStatus(true); 
     } 

    } 
}); 

Поскольку плагин не позволит мне удалить события, присоединенные к полям (я попробовал все) - я полагаюсь на скрытом поле, я создал, чтобы определить, когда сказать WooCommerce, когда для обновления статуса заказа. Это не идеально, но оно работает.

Теперь - последние штрихи. Wordpress должен знать, что такое ajax_url (вы можете увидеть JS-ошибку для этого, если вы не включаете это). Я делаю это с помощью:

/** 
* Adds the WordPress Ajax Library to the frontend. 
*/ 
function add_ajax_library() { 

    $html = '<script type="text/javascript">'; 
     $html .= 'var ajax_url = "' . admin_url('admin-ajax.php') . '"'; 
    $html .= '</script>'; 

    echo $html; 

} // end add_ajax_library 
add_action('wp_head', 'add_ajax_library'); 

Добавьте это в functions.php файл, и вы установите. Он будет срабатывать при загрузке WordPress.

Теперь последний кусок. Нам нужна внутренняя функция для обработки добавления/удаления НДС. Эта часть проста (к счастью):

function example_remove_tax_from_order(){ 
    global $woocommerce; 
    $woocommerce->customer->set_is_vat_exempt(true); 

    wp_die(); 
} 

add_action('wp_ajax_example_remove_tax', 'example_remove_tax_from_order');   // for logged in user 
add_action('wp_ajax_nopriv_example_remove_tax', 'example_remove_tax_from_order'); // if user not logged in 

function example_add_tax_to_order(){ 
    global $woocommerce; 
    $woocommerce->customer->set_is_vat_exempt(false); 

    wp_die(); 
} 

add_action('wp_ajax_example_add_tax', 'example_add_tax_to_order');   // for logged in user 
add_action('wp_ajax_nopriv_example_add_tax', 'example_add_tax_to_order'); // if user not logged in 

Небольшой комплекс, но он хорошо работает. Я искал все и не мог найти решение этой проблемы.