123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- <?php
- /**
- * @file
- * CCK Field for Malaysia phone numbers.
- */
- function _my_phone_rules() {
- $rules = array();
- // rule: 'area code, min length, max length'
- // Geographic land line number
- $rules[] = array("2", 7); // Domestic access code to Singapore
- $rules[] = array("3", 8); // Selangor & Federal Territories of Kuala Lumpur & Putrajaya
- $rules[] = array("4", 7); // Kedah, Penang & Perlis
- $rules[] = array("5", 7); // Perak & Cameron Highlands (Pahang)
- $rules[] = array("6", 7); // Melaka, Negeri Sembilan & Muar (Johor)
- $rules[] = array("7", 7); // Johor (except Muar)
- $rules[] = array("80", 6); // Domestic access code to Brunei (East Malaysia only)
- // $rules[] = array("81", 6); // reserved
- $rules[] = array("82", 6); // Kuching (Sarawak)
- $rules[] = array("83", 6); // Sri Aman (Sarawak)
- $rules[] = array("84", 6); // Sarikei, Bintangor, Sibu, Kanowit, Song, & Kapit (Sarawak)
- $rules[] = array("85", 6); // Lawas, Limbang, Miri (Sarawak)
- $rules[] = array("86", 6); // Bintulu, Belaga (Sarawak)
- $rules[] = array("87", 6); // Inner District (Sabah) & Federal Territory of Labuan
- $rules[] = array("88", 6); // Kota Kinabalu, Kudat (Sabah)
- $rules[] = array("89", 6); // Lahad Datu, Sandakan, Tawau (Sabah)
- $rules[] = array("9", 7); // Kelantan, Pahang (except Cameron Highlands) & Terengganu
- // Mobile number structure
- $rules[] = array("10", 7);
- $rules[] = array("11", 7);
- $rules[] = array("12", 7);
- $rules[] = array("13", 7);
- $rules[] = array("14", 7);
- $rules[] = array("15", 7);
- $rules[] = array("16", 7);
- $rules[] = array("17", 7);
- $rules[] = array("18", 7);
- $rules[] = array("19", 7);
- return $rules;
- }
- /**
- * Verifies that $number is a valid Malaysia 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 my_validate_number($number, $ext = '', &$error) {
- // We don't want to worry about separators
- $number = cck_phone_clean_number($number);
- foreach (_my_phone_rules() as $rule) {
- // define regular expression
- $regex = '/^
- ([0]*) # an optional 0
- (' . $rule[0] . ') # area code
- \d{' . $rule[1] . '} # local number within length $rule[1] & $rule[2]
- $/x';
- $result = preg_match($regex, $number, $matches);
- if ($result) {
- return TRUE;
- }
- }
- // t() is no needed
- $error = '"%phone_input" is not a valid Malaysia phone number, it should be a 9-10 digit number like "03-2222 2222", "0" is optional and will be removed.';
- return FALSE;
- }
- /**
- * Cleanup user-entered values for a phone number field for saving to DB.
- *
- * @param $number
- * A single phone number item.
- */
- function my_sanitize_number(&$number) {
- // Remove trunk prefix '0'
- $number = preg_replace('/^([0]*)/', '', $number);
- }
- /**
- * Default formatter for international phone number.
- *
- * @param $element
- * $element['#item']['country_codes']: alpha-2 country code
- * $element['#item']['number']: phone number
- * @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 my_formatter_default($element) {
- $phone = '';
- // Display a global phone number with country code.
- $cc = cck_phone_countrycodes($element['country_codes']);
- // Format the phone number however you like, this is the default
- foreach (_my_phone_rules() as $rule) {
- // define regular expression
- $regex = '/^
- (' . $rule[0] . ') # area code
- (\d{3,4})
- (\d{4})
- $/x';
- $result = preg_match($regex, $element['number'], $matches);
- if ($result) {
- // output as +60A-BBB CCCC or +60A-BBBB CCCC
- $phone = $cc['code'] . $matches[1] . '-' . $matches[2] . ' ' . $matches[3];
- continue;
- }
- }
- return $phone;
- }
- /**
- * Local formatter for local phone number.
- *
- * @param $element
- * $element['#item']['country_codes']: alpha-2 country code
- * $element['#item']['number']: phone number
- * @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 my_formatter_local($element) {
- // Display a local phone number without country code.
- $phone = $element['number'];
- foreach (_my_phone_rules() as $rule) {
- // define regular expression
- $regex = '/^
- (' . $rule[0] . ') # area code
- (\d{3,4})
- (\d{4})
- $/x';
- $result = preg_match($regex, $phone, $matches);
- if ($result) {
- // output as 0A-BBB CCCC or 0A-BBBB CCCC
- $phone = '0' . $matches[1] . '-' . $matches[2] . ' ' . $matches[3];
- continue;
- }
- }
- return $phone;
- }
|