Skip to content

Instantly share code, notes, and snippets.

@xlplugins
Last active February 22, 2024 14:07
Show Gist options
  • Save xlplugins/0d16fc5cdce4ef890bfc197ea5144d04 to your computer and use it in GitHub Desktop.
Save xlplugins/0d16fc5cdce4ef890bfc197ea5144d04 to your computer and use it in GitHub Desktop.
Validate House & street Number
class WFACP_Custom_validate_snippet {
private $billing_message = '<strong>Enter the House number in billing address.</strong>';
private $shipping_message = '<strong>Enter the House number in shipping address</strong>';
public function __construct() {
add_action( 'wfacp_before_process_checkout_template_loader', [ $this, 'actions' ] );
add_action( 'wfacp_internal_css', [ $this, 'add_js_validation' ] );
}
public function actions() {
add_action( 'woocommerce_after_checkout_validation', [ $this, 'add_validation' ], 123, 2 );
}
public function add_validation( $data, $errors ) {
$template = wfacp_template();
if ( ! $template instanceof WFACP_Template_Common ) {
return;
}
$billing_message = $this->billing_message;
$shipping_message = $this->shipping_message;
$index = $template->get_shipping_billing_index();
if ( $index == 'billing' ) {
if ( $template->have_shipping_address() ) {
$shipping_address_1 = $_POST['shipping_address_1'];
if ( ! $this->number_present( $shipping_address_1 ) ) {
$errors->add( 'error_1', $shipping_message, [ 'id' => 'shipping_h_no' ] );
}
}
if ( $template->have_billing_address() && isset( $_REQUEST['billing_same_as_shipping'] ) ) {
$billing_address_1 = $_POST['billing_address_1'];
if ( ! $this->number_present( $billing_address_1 ) ) {
$errors->add( 'error_2', $billing_message, [ 'id' => 'billing_h_no' ] );
}
}
} else if ( $index == 'shipping' ) {
if ( $template->have_billing_address() ) {
$billing_address_1 = $_POST['billing_address_1'];
if ( ! $this->number_present( $billing_address_1 ) ) {
$errors->add( 'error_2', $billing_message, [ 'id' => 'billing_h_no' ] );
}
}
if ( $template->have_shipping_address() && isset( $_REQUEST['ship_to_different_address'] ) ) {
$shipping_address_1 = $_POST['shipping_address_1'];
if ( ! $this->number_present( $shipping_address_1 ) ) {
$errors->add( 'error_1', $shipping_message, [ 'id' => 'shipping_h_no' ] );
}
}
} else {
if ( $template->have_billing_address() && ! $template->have_shipping_address() ) {
$billing_address_1 = $_POST['billing_address_1'];
if ( ! $this->number_present( $billing_address_1 ) ) {
$errors->add( 'error_2', $billing_message, [ 'id' => 'billing_h_no' ] );
}
} else if ( $template->have_shipping_address() && ! $template->have_billing_address() ) {
$shipping_address_1 = $_POST['shipping_address_1'];
if ( ! $this->number_present( $shipping_address_1 ) ) {
$errors->add( 'error_1', $shipping_message, [ 'id' => 'shipping_h_no' ] );
}
}
}
}
function number_present( $inputString ) {
// Regular expressions to match numbers and strings
$numberRegex = '/\b\d+\b/';
$stringRegex = '/\b[A-Za-z]+\b/';
// Initialize arrays to store matches
$numbers = [];
$strings = [];
// Find all matches for numbers
if ( preg_match_all( $numberRegex, $inputString, $matches ) ) {
$numbers = $matches[0];
}
// Find all matches for strings
if ( preg_match_all( $stringRegex, $inputString, $matches ) ) {
$strings = $matches[0];
}
if(count($numbers)==0 || count($strings)==0){
return false;
}
return (! empty( $numbers ) && ! empty( $strings ))?true:$this->extractAddressInfo($inputString);
}
function extractAddressInfo($address) {
// Define a regular expression pattern to match Dutch addresses
$pattern = '/^(.*?)(\d{1,5}[a-zA-Z]?)$/';
// Perform the regular expression match
if (preg_match($pattern, $address, $matches)) {
// $matches[1] contains the street name
// $matches[2] contains the house number
$streetName = trim($matches[1]);
$houseNumber = trim($matches[2]);
return true;
} else {
// Return an error or handle the case where the address doesn't match the pattern
return false;
}
}
public function add_js_validation() {
?>
<script>
window.addEventListener('load', function () {
(function ($) {
$(document).ajaxComplete(function (event, jqxhr, settings) {
if (settings.url.includes("wc-ajax=checkout")) {
setTimeout(function () {
let shipping = $('li[data-id="shipping_h_no"]');
if (shipping.length > 0) {
$('#shipping_address_1_field').removeClass('woocommerce-validated').addClass(' woocommerce-invalid woocommerce-invalid-required-field');
}
let billing = $('li[data-id="billing_h_no"]');
if (billing.length > 0) {
$('#billing_address_1_field').removeClass('woocommerce-validated').addClass(' woocommerce-invalid woocommerce-invalid-required-field');
}
}, 200);
}
});
wfacp_frontend.hooks.addFilter('wfacp_field_validated', (validated, $this, $parent) => {
return validateField(validated, $this, $parent);
});
wfacp_frontend.hooks.addFilter('wfacp_field_error_message', (my_msg, el, input) => {
return sendErrorMessage(my_msg, el, input);
});
function validateField(validated, $this, $parent) {
var result = check_number_present($this);
if (null === result) {
$parent.removeClass('woocommerce-validated').addClass('woocommerce-invalid woocommerce-invalid-required-field');
validated = false;
}
return validated;
}
function sendErrorMessage(my_msg, $this, input) {
var result = check_number_present(input);
if (null === result) {
var field_label = "billing";
if (input.attr('id') == 'shipping_address_1') {
var field_label = "shipping";
}
my_msg = "Bitte füge deine Hausnummer hinzu." + field_label + " street address 1";
}
return my_msg;
}
function check_number_present(input) {
var result = true;
var address = input.val();
if ('' == address) {
return true;
}
if (input.attr('id') == 'billing_address_1') {
result = address.match(/\d+/g);
if (result != null && address == parseInt(address)) {
result = null;
}
} else if (input.attr('id') == 'shipping_address_1') {
result = address.match(/\d+/g);
if (result != null && address == parseInt(address)) {
result = null;
}
}
return result;
}
})(jQuery)
});
</script>
<?php
}
}
new WFACP_Custom_validate_snippet();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment