Добрый день! Подскажите как в модуле Simple сделать валидацию для телефона. У меня стоит маска: $mask = '(999) 999-99-99'; Клиенты задолбали указывать телефоны в формате (380) 990-00-00. Нужно сделать валидацию чтобы то что в скобочках проверяло на правильность мобильных операторов Украины: (050), (063), (066), (067), (068), (073), (093), (095), (096), (097), (098), (099). Т.е. я думаю что это можно реализовать так, чтобы проверялось первая цифра в скобочках и она была (0__), а не (380) или (806). 2 дня ломаю голову нашёл такой вариант preg_match("/(\([0]{1}[9]{2}\))([9]{3})-([9]{2})-([9]{2})/"); Но он для php и я вот не знаю в какой файл и как правильно его запихнуть. А в специальное поле "По регулярному выражению" он не работает, т.е. выдаёт ошибку и на правильный и на неправильный формат. Помогите плиз разобраться, уже нету сил!!!
Добрый. Тебе написать на php регулярное выражение, или на JS ? Можно проще поставь конструкцию if else if,или switch
Добрый вечер. Мне не принципиально как это сделать, главное чтобы работало и чтобы я смог разобраться
Честно говоря я не понял что мне нужно скинуть(( Вот файл в котором задаётся маска телефона PHP: <?phpclass ModelToolSimpleData extends Model { public function select_main_city($fields) { $values = array(); $country_id = $fields['main_country_id']['value']; // id of selected country $zone_id = $fields['main_zone_id']['value']; // id of selected zone //echo $country_id.' -> '.$zone_id; // list of values for current country_id and zone_id $query = $this->db->query("SELECT name FROM city WHERE zone_id = '".(int)$zone_id."' ORDER BY name ASC"); foreach ($query->rows as $result) { $values[$result['name']] = $result['name']; } return $values; } public function init_main_city($fields) { return 3; } public function validate_main_city($value, $fields) { return empty($value) ? 'error' : ''; } public function validate_main_tax_id($value, $fields) { $this->load->helper('vat'); $this->load->model('localisation/country'); $this->language->load('account/register'); $country_id = $fields['main_country_id']['value']; $country = $this->model_localisation_country->getCountry($country_id); if ($country && !empty($country['iso_code_2']) && vat_validation($country['iso_code_2'], $value) == 'invalid') { return $this->language->get('error_vat'); } return ''; } public function mask_main_telephone($fields) { $mask = ''; // example for setting a mask by selected language $country_id = $fields['main_country_id']['value']; // id of selected country if ($country_id == 176) { $mask = '+7(999)999-9999'; } // example for setting a mask by selected language $lang_code = $this->config->get('config_language'); if ($lang_code == 'ru') { $mask = '(999) 999-99-99'; } else { $mask = '99999999999'; } return $mask; } public function status_custom_lift($fields) { $shippping = $this->simple->shipping_method; return $shippping['code'] == 'flat.flat' ? true : false; } public function status_custom_flat($fields) { $shippping = $this->simple->shipping_method; return $shippping['code'] == 'flat.flat' && $fields['custom_lift']['value'] == 1 ? true : false; } public function reload_custom_lift($fields) { $shippping = $this->simple->shipping_method; return $shippping['code'] == 'flat.flat' ? true : false; } public function select_custom_select($fields) { $values = array(); /*$this->load->model('account/salesrep'); $salesreps = $this->model_account_salesrep->getSalesReps(); foreach ($salesreps as $salesrep) { $values[$salesrep['salesrep_id']] = $salesrep['name']; }*/ // $other_field_value = $fields['field_id']['value']; // $zone_id = $fields['main_zone_id']['value']; $values[1] = 'Name 1'; $values[2] = 'Name 2'; $values[3] = 'Name 3'; $values[4] = 'Name 4'; return $values; } // This is example of validation method for field company_name. This method must return text of the validation error. public function validate_company_name($value) { return empty($value) ? 'error' : ''; }}?>
В Simple используется библиотека jquery.maskedinput Самым простым способом решить данную проблему будет вручную задать input паттерн: Код: ^\+38\((050|063|066|067|068|073|093|095|096|097|098|099)\) \d{3}-\d{2}-\d{2}$ И присвоить ему маску: Код: $("#input").mask("+38(999) 999-99-99",{placeholder: "+38(___) ___-__-__" });
У меня Simple под рукой нет, нужно смотреть файл tpl который отображает страницу оформления заказа. Для наглядности пример, что бы было понятнее в чем смысл. Код: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.maskedinput/1.4.1/jquery.maskedinput.min.js"></script> </head> <body> <form> <input id='input' type="tel" pattern="^\+38\((050|063|066|067|068|073|093|095|096|097|098|099)\) \d{3}-\d{2}-\d{2}$" required="required"> <button type="submit">Перезвоните мне</button> </form> <script type="text/javascript"> $("#input").mask("+38(999) 999-99-99",{placeholder: "+38(___) ___-__-__" }); </script> </body> </html> Ну или скинь ссылку на свой сайт я посмотрю через отладчик.
Дело в том, что в tpl файле нет инпута для вывода телефона, в симпле эти поля выставляются в настройках модуля. И там же есть валидация Вот на всякий случай код HTML: <div class="simplecheckout-block-heading" <?php echo $simple_customer_hide_if_logged ? 'style="display:none"' : '' ?>> <div class="shag"><span>Шаг 2 - <?php echo $text_checkout_customer ?></span></div> <?php if ($simple_customer_view_login) { ?> <span class="simplecheckout-block-heading-button"> <a href="<?php echo $default_login_link ?>" <?php if (!$is_mobile) { ?>onclick="simple_login_open();return false;"<?php } ?> id="simplecheckout_customer_login"><?php echo $text_checkout_customer_login ?></a> </span> <?php } ?> </div> <div class="simplecheckout-block-content" <?php echo $simple_customer_hide_if_logged ? 'style="display:none"' : '' ?>> <?php if ($simple_customer_registered) { ?> <div class="success" id="customer_registered" style="text-align:left;"><?php echo $simple_customer_registered ?></div> <?php } ?> <?php if ($text_you_will_be_registered) { ?> <div class="you-will-be-registered"><?php echo $text_you_will_be_registered ?></div> <?php } ?> <?php if ($simple_customer_view_address_select && !empty($addresses)) { ?> <div class="simplecheckout-customer-address"> <span><?php echo $text_select_address ?>:</span> <select name='customer_address_id' id="customer_address_id" reload='address_changed'> <option value="0" <?php echo $customer_address_id == 0 ? 'selected="selected"' : '' ?>><?php echo $text_add_new ?></option> <?php foreach($addresses as $address) { ?> <option value="<?php echo $address['address_id'] ?>" <?php echo $customer_address_id == $address['address_id'] ? 'selected="selected"' : '' ?>><?php echo $address['firstname']; ?> <?php echo !empty($address['lastname']) ? ' '.$address['lastname'] : ''; ?><?php echo !empty($address['address_1']) ? ', '.$address['address_1'] : ''; ?><?php echo !empty($address['city']) ? ', '.$address['city'] : ''; ?></option> <?php } ?> </select> </div> <?php } ?> <input type="hidden" name="<?php echo Simple::SET_CHECKOUT_CUSTOMER ?>[address_id]" id="customer_address_id" value="<?php echo $customer_address_id ?>" /> <?php $split_previous = false; ?> <?php $user_choice = false; ?> <div class="simplecheckout-customer-block"> <table class="<?php echo $simple_customer_two_column ? 'simplecheckout-customer-two-column-left' : 'simplecheckout-customer-one-column' ?>"> <?php $email_field_exists = false; ?> <?php $i = 0; ?> <?php $geo_selector_used = false; ?> <?php foreach ($checkout_customer_fields as $field) { ?> <?php if ($i == 0 && !$customer_logged && $simple_customer_action_register == Simple::REGISTER_USER_CHOICE) { ?> <tr> <td class="simplecheckout-customer-left"> <?php echo $entry_register; ?> </td> <td class="simplecheckout-customer-right"> <label><input type="radio" name="register" value="1" <?php echo $register == 1 ? 'checked="checked"' : ''; ?> reload="customer_register" /><?php echo $text_yes ?></label> <label><input type="radio" name="register" value="0" <?php echo $register == 0 ? 'checked="checked"' : ''; ?> reload="customer_not_register" /><?php echo $text_no ?></label> </td> </tr> <?php $user_choice = true; ?> <?php $i++ ?> <?php } ?> <?php if ($field['type'] == 'hidden') { ?> <?php continue; ?> <?php } elseif ($field['type'] == 'header') { ?> <tr class="simple_table_row" <?php echo !empty($field['place']) ? 'place="'.$field['place'].'"' : '' ?>> <td colspan="2" <?php echo $user_choice && $split_previous ? 'class="simple-header-right"' : ''; ?>> <?php echo $field['tag_open'] ?><?php echo $field['label'] ?><?php echo $field['tag_close'] ?> </td> </tr> <?php } elseif ($field['type'] == 'split') { ?> </table> <table class="<?php echo $simple_customer_two_column ? 'simplecheckout-customer-two-column-right' : 'simplecheckout-customer-one-column' ?>"> <?php $split_previous = true; ?> <?php } else { ?> <?php if ((($user_choice && $i == 1) || (!$user_choice && $i == 0)) && $simple_customer_view_customer_type) { ?> <tr> <td class="simplecheckout-customer-left"> <?php echo $entry_customer_type ?> </td> <td class="simplecheckout-customer-right"> <?php if ($simple_type_of_selection_of_group == 'select') { ?> <select name="customer_group_id" reload="group_changed"> <?php foreach ($customer_groups as $id => $name) { ?> <option value="<?php echo $id ?>" <?php echo $id == $customer_group_id ? 'selected="selected"' : '' ?>><?php echo $name ?></option> <?php } ?> </select> <?php } else { ?> <?php foreach ($customer_groups as $id => $name) { ?> <label><input type="radio" name="customer_group_id" reload="group_changed" value="<?php echo $id ?>" <?php echo $id == $customer_group_id ? 'checked="checked"' : '' ?>><?php echo $name ?></label><br> <?php } ?> <?php } ?> </td> </tr> <?php $i++ ?> <?php $split_previous = false; ?> <?php } ?> <?php if ($field['id'] == 'main_email') { ?> <?php if (!$customer_logged) { ?> <?php if (!$simple_customer_action_register && !$simple_customer_view_email && !$simple_customer_view_customer_type) { continue; } ?> <?php $split_previous = false; ?> <?php if (!($simple_customer_view_email == Simple::EMAIL_NOT_SHOW && ($simple_customer_action_register == Simple::REGISTER_NO || ($simple_customer_action_register == Simple::REGISTER_USER_CHOICE && !$register)))) { ?> <?php $email_field_exists = true; ?> <tr> <td class="simplecheckout-customer-left"> <?php echo $field['label'] ?> </td> <td class="simplecheckout-customer-right"> <?php echo $simple->html_field($field) ?> <?php if (!empty($field['error']) && $simple_show_errors) { ?> <span class="simplecheckout-error-text"><?php echo $field['error']; ?></span> <?php } ?> </td> </tr> <?php if ($simple_customer_view_email_confirm) { ?> <tr> <td class="simplecheckout-customer-left"> <?php echo $entry_email_confirm ?> </td> <td class="simplecheckout-customer-right"> <input name="email_confirm" id="email_confirm" type="text" value="<?php echo $email_confirm ?>"> <span class="simplecheckout-error-text" id="email_confirm_error" <?php if (!($email_confirm_error && $simple_show_errors)) { ?>style="display:none;"<?php } ?>><?php echo $error_email_confirm; ?></span> </td> </tr> <?php } ?> <?php if ($simple_customer_action_register == Simple::REGISTER_YES || ($simple_customer_action_register == Simple::REGISTER_USER_CHOICE && $register)) { ?> <tr id="password_row" <?php echo $simple_customer_generate_password ? ' style="display:none;"' : '' ?> <?php echo $simple_customer_generate_password ? 'autogenerate="1"' : '' ?>> <td class="simplecheckout-customer-left"> <?php echo $entry_password ?> </td> <td class="simplecheckout-customer-right"> <input <?php echo !empty($error_password) ? 'class="simplecheckout-red-border"' : '' ?> type="password" name="password" value="<?php echo $password ?>"> <?php if (!empty($error_password) && $simple_show_errors) { ?> <span class="simplecheckout-error-text"><?php echo $error_password; ?></span> <?php } ?> </td> </tr> <?php if ($simple_customer_view_password_confirm) { ?> <tr id="confirm_password_row" <?php echo $simple_customer_generate_password ? ' style="display:none;"' : '' ?> <?php echo $simple_customer_generate_password ? 'autogenerate="1"' : '' ?>> <td class="simplecheckout-customer-left"> <?php echo $entry_password_confirm ?> </td> <td class="simplecheckout-customer-right"> <input <?php echo !empty($error_password_confirm) ? 'class="simplecheckout-red-border"' : '' ?> type="password" name="password_confirm" value="<?php echo $password_confirm ?>"> <?php if (!empty($error_password_confirm) && $simple_show_errors) { ?> <span class="simplecheckout-error-text"><?php echo $error_password_confirm; ?></span> <?php } ?> </td> </tr> <?php } ?> <?php } ?> <?php } ?> <?php } ?> <?php if ($customer_logged) { continue; } ?> <?php } else { ?> <tr class="simple_table_row <?php echo !empty($field['selector']) ? ' simple-geo-selector-customer' : '' ?>" <?php echo !empty($field['place']) ? 'place="'.$field['place'].'"' : '' ?><?php echo !empty($field['selector']) ? ' style="display:none;"' : '' ?>> <td class="simplecheckout-customer-left"> <?php echo $field['label'] ?> </td> <td class="simplecheckout-customer-right"> <?php echo $simple->html_field($field) ?> <?php if (!empty($field['error']) && $simple_show_errors) { ?> <span class="simplecheckout-error-text"><?php echo $field['error']; ?></span> <?php } ?> </td> </tr> <?php $split_previous = false; ?> <?php $geo_selector_used = $geo_selector_used || !empty($field['selector']); ?> <?php } ?> <?php $i++; ?> <?php } ?> <?php } ?> <?php if ($geo_selector_used) { ?> <tr id="simple_geo_selector_customer"> <td colspan="2" style="text-align:center;"> <a onclick="simplecheckout_show_selector('customer');"><?php echo $text_show_selector ?></a> </td> </tr> <?php } ?> <?php if ($simple_customer_action_subscribe == Simple::SUBSCRIBE_USER_CHOICE && $email_field_exists) { ?> <tr id="subscribe_row"<?php echo $simple_customer_action_register == Simple::REGISTER_USER_CHOICE && !$register && !$simple_customer_view_email ? ' style="display:none;"' : '' ?>> <td class="simplecheckout-customer-left"> <?php echo $entry_newsletter; ?> </td> <td class="simplecheckout-customer-right"> <label><input type="radio" name="subscribe" value="1" <?php echo $subscribe == 1 ? 'checked="checked"' : ''; ?> /><?php echo $text_yes ?></label> <label><input type="radio" name="subscribe" value="0" <?php echo $subscribe == 0 ? 'checked="checked"' : ''; ?> /><?php echo $text_no ?></label> </td> </tr> <?php } ?> </table> <?php foreach ($checkout_customer_fields as $field) { ?> <?php if ($field['type'] == 'hidden') { ?> <?php echo $simple->html_field($field) ?> <?php } ?> <?php } ?> </div> </div> <?php if ($simple_show_shipping_address) { ?> <div class="simplecheckout-customer-same-address"> <?php if ($simple_show_shipping_address_same_show) { ?> <label><input type="checkbox" name="shipping_address_same" id="shipping_address_same" value="1" <?php if ($shipping_address_same) { ?>checked="checked"<?php } ?> reload="address_same"> <?php echo $entry_address_same ?></label> <?php } ?> </div> <?php if (!$shipping_address_same) { ?> <div class="simplecheckout-block-heading simplecheckout-shipping-address" <?php echo $simple_address_hide_if_logged ? 'style="display:none"' : '' ?>> </div> <div class="simplecheckout-block-content simplecheckout-shipping-address" <?php echo $simple_address_hide_if_logged ? 'style="display:none"' : '' ?>> <?php if ($simple_shipping_view_address_select && !empty($addresses)) { ?> <div class="simplecheckout-customer-address"> <span><?php echo $text_select_address ?>:</span> <select name='shipping_address_id' id="shipping_address_id" reload='address_changed'> <option value="0" <?php echo $shipping_address_id == 0 ? 'selected="selected"' : '' ?>><?php echo $text_add_new ?></option> <?php foreach($addresses as $address) { ?> <option value="<?php echo $address['address_id'] ?>" <?php echo $shipping_address_id == $address['address_id'] ? 'selected="selected"' : '' ?>><?php echo $address['firstname']; ?> <?php echo !empty($address['lastname']) ? ' '.$address['lastname'] : ''; ?><?php echo !empty($address['address_1']) ? ', '.$address['address_1'] : ''; ?><?php echo !empty($address['city']) ? ', '.$address['city'] : ''; ?></option> <?php } ?> </select> </div> <?php } ?> <input type="hidden" name="<?php echo Simple::SET_CHECKOUT_ADDRESS ?>[address_id]" id="shipping_address_id" value="<?php echo $shipping_address_id ?>" /> <div class="simplecheckout-customer-block"> <table class="<?php echo $simple_customer_two_column ? 'simplecheckout-customer-two-column-left' : 'simplecheckout-customer-one-column' ?>"> <?php $geo_selector_used = false; ?> <?php foreach ($checkout_address_fields as $field) { ?> <?php if ($field['type'] == 'hidden') { ?> <?php continue; ?> <?php } elseif ($field['type'] == 'header') { ?> <tr class="simple_table_row" <?php echo !empty($field['place']) ? 'place="'.$field['place'].'"' : '' ?>> <td colspan="2"> <?php echo $field['tag_open'] ?><?php echo $field['label'] ?><?php echo $field['tag_close'] ?> </td> </tr> <?php } elseif ($field['type'] == 'split') { ?> </table> <table class="<?php echo $simple_customer_two_column ? 'simplecheckout-customer-two-column-right' : 'simplecheckout-customer-one-column' ?>"> <?php } else { ?> <tr class="simple_table_row <?php echo !empty($field['selector']) ? ' simple-geo-selector-address' : '' ?>" <?php echo !empty($field['place']) ? 'place="'.$field['place'].'"' : '' ?><?php echo !empty($field['selector']) ? ' style="display:none;"' : '' ?>> <td class="simplecheckout-customer-left"> <?php echo $field['label'] ?> </td> <td class="simplecheckout-customer-right"> <?php echo $simple->html_field($field) ?> <?php if (!empty($field['error']) && $simple_show_errors) { ?> <span class="simplecheckout-error-text"><?php echo $field['error']; ?></span> <?php } ?> </td> </tr> <?php $geo_selector_used = $geo_selector_used || !empty($field['selector']); ?> <?php } ?> <?php } ?> <?php if ($geo_selector_used) { ?> <tr id="simple_geo_selector_address"> <td colspan="2" style="text-align:center;"> <a onclick="simplecheckout_show_selector('address');"><?php echo $text_show_selector ?></a> </td> </tr> <?php } ?> </table> <?php foreach ($checkout_address_fields as $field) { ?> <?php if ($field['type'] == 'hidden') { ?> <?php echo $simple->html_field($field) ?> <?php } ?> <?php } ?> </div> </div> <?php } ?> <?php } ?> <?php if ($simple_debug) print_r($customer); ?> <?php if ($simple_debug) print_r($comment); ?>
Со скриншотом лучше. Валидация: ☑ по регулярному выражению: ^\+38\((050|063|066|067|068|073|093|095|096|097|098|099)\) \d{3}-\d{2}-\d{2}$ Маска поля для плагина jQuery masked input: +38(999) 999-99-99 Placeholder: +38(___) ___-__-__
А если снять галочку с: ☑ через вызов метода mask_main_telephone что он делает не понятно, и как он влияет Есть возможность ссылку на сайт сбросить? Было бы проще.
Непонятно где происходит валидация по регулярке, в атр pattern ничего не добавляется. Завтра еще посмотрю, поздно, голова уже не варит.
И так, валидация формы проходит полностью на стороне сервера, соответственно и регулярку нужно немного подправить: Валидация: ☑ по регулярному выражению: /^\+38\((050|063|066|067|068|073|093|095|096|097|098|099)\) \d{3}-\d{2}-\d{2}$/ Теперь должно работать, не вижу причин что бы этого не произошло.