123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <?php
- /**
- * @file
- * CCK Field for Hungarian phone numbers.
- */
- /**
- * Verifies and mage parts from $number
- *
- * @param $number
- * Digits only value.
- * @return boolean
- * Array
- * if array['error'] is present, the validation fails
- * else ['area'] for area number
- * ['first'] ['second'] for the AA/BBB-CCC numbers
- * ['first'] ['second'] ['third'] for the A(A)/BBB-CC-DD numbers
- */
- function hu_parts($number) {
- /**
- * Because Hungary an telephone numbers are both in open and closed number region, the area code length may be vary. If the area code is 1, 7 more digits follow it.
- * If the area code is 20/30/70, also 7 more digits.
- * If any other 2 digits are code is appear, we want 6 more digits.
- *
- * So complecated, I know :)
- *
- */
- $result = array();
- // Last 9 digits
- $n = drupal_substr($number, -9);
- if ($n === FALSE || (drupal_substr($n, 0, 1) != 2 && drupal_substr($n, 0, 1) != 3 && drupal_substr($n, 0, 1) != 7)) {
- // No 9 digit, check for 8 digit
- if (drupal_substr($number, -8) === FALSE) {
- // No 8 digit, too short for valid telephone number
- $result['error'] = '"%phone_input" is not a valid Hungarian phone number, it should be a 9 digit number like "20/123-45-67" or a 8 digit number like "23/123-456"';
- }
- else {
- $n = drupal_substr($number, -8);
- // It is 8 digits
- if (drupal_substr($n, 0, 1) == 1) {
- // A number from Budapest
- $result['area'] = drupal_substr($n, 0, 1);
- $result['first'] = drupal_substr($n, 1, 3);
- $result['second'] = drupal_substr($n, 4, 2);
- $result['third'] = drupal_substr($n, 6, 2);
- }
- else {
- // A number from countryside
- $result['area'] = drupal_substr($n, 0, 2);
- $result['first'] = drupal_substr($n, 2, 3);
- $result['second'] = drupal_substr($n, 5, 3);
- }
- }
- }
- else {
- // Cell phone number
- $result['area'] = drupal_substr($n, 0, 2);
- $result['first'] = drupal_substr($n, 2, 3);
- $result['second'] = drupal_substr($n, 5, 2);
- $result['third'] = drupal_substr($n, 7, 2);
- }
- return $result;
- }
- /**
- * Verifies that $number is a valid nine digit Hungarian phone number.
- *
- * @param $number
- * Digits only value.
- * @param $ext
- * Digits only value.
- * @param $error
- * The error message to shown to user.
- * Available parameters to use in the error message are
- * - "%countrycode": the alpha-2 CC
- * - "%phone_input": the original number input by user (could be invalid)
- * - "%max_length": allowed maximum length of the phone number
- * @return boolean
- * TRUE if it is a valid phone number for that country, FALSE otherwise.
- */
- function hu_validate_number($number, $ext = '', &$error) {
- // Don't need to check for extension because it has been checked by generic validation as all digits, unless has special format/requirements
- // We don't want to worry about separators
- $number = cck_phone_clean_number($number);
- $result = hu_parts($number);
- if (isset($result['error'])) {
- // t() is no needed
- $error = $result['error'];
- return FALSE;
- }
- return true;
- }
- /**
- * Cleanup user-entered values for a phone number field for saving to DB.
- *
- * @param $number
- * A single phone number item.
- */
- function hu_sanitize_number(&$number) {
- // Remove prefix '36' or '+36'
- $number = preg_replace('/^(?:\+?36|06*)/', '', $number);
- }
- /**
- * Default formatter for international phone number.
- *
- * @param $element
- * $element['country_codes']: alpha-2 country code
- * $element['number']: phone number
- * $element['extension']: ext
- * @return boolean
- * STRING The formatted number
- */
- function hu_formatter_default($element) {
- $number = $element['number'];
- $ext = $element['extension'];
- $result = hu_parts($number);
- if (isset($result['error'])) {
- return $number . ($ext ? '/' . $ext : '');
- }
- // output as +36 (AA) BBB CCDD/ext or +36 (AA) BBB CCC/ext
- $phone = '+36 (' . $result['area'] . ') ' . $result['first'] . ' ' . $result['second'] . $result['third'];
- return $phone . ($ext ? '/' . $ext : '');
- }
- /**
- * Local formatter for local phone number.
- *
- * @param $element
- * $element['country_codes']: alpha-2 country code
- * $element['number']: phone number
- * $element['extension']: ext
- * @return boolean
- * STRING The formatted number
- */
- function hu_formatter_local($element) {
- $number = $element['number'];
- $ext = $element['extension'];
- $result = hu_parts($number);
- if (isset($result['error'])) {
- return $number . ($ext ? '/' . $ext : '');
- }
- // output as AA/BBB-CC-DD or AA/BBB-CCC
- $phone = $result['area'] . '/' . $result['first'] . '-' . $result['second'] . (isset($result['third']) ? '-' . $result['third'] : '');
- return $phone . ($ext ? '/' . $ext : '');
- }
|