array('label' => t('French Phone Numbers')), 'it_phone' => array('label' => t('Italian Phone Numbers')), 'ca_phone' => array('label' => t('US & Canadian Phone Numbers')), 'uk_phone' => array('label' => t('British (UK) Phone Numbers')), 'ru_phone' => array('label' => t('Russian Phone Numbers')), 'es_phone' => array('label' => t('Spanish Phone Numbers')), 'au_phone' => array('label' => t('Australian Phone Numbers')), ); } /** * Implementation of hook_field_settings(). */ function phone_field_settings($op, $field) { switch ($op) { case 'form': $form = array(); $form['phone_country_code'] = array( '#type' => 'checkbox', '#title' => t('Add the country code if not filled by the user'), '#default_value' => isset($field['phone_country_code']) ? $field['phone_country_code'] : '', ); if ($field['type'] == 'ca_phone') { $form['ca_phone_separator'] = array( '#type' => 'textfield', '#title' => t('Separator'), '#default_value' => isset($field['ca_phone_separator']) ? $field['ca_phone_separator'] : '-', '#size' => 2, ); $form['ca_phone_parentheses'] = array( '#type' => 'checkbox', '#title' => t('Use parentheses around area code'), '#default_value' => isset($field['ca_phone_parentheses']) ? $field['ca_phone_parentheses'] : 1, ); } return $form; case 'save': $settings = array('phone_country_code'); if ($field['type'] == 'ca_phone') { array_push($settings, 'ca_phone_separator', 'ca_phone_parentheses'); } return $settings; case 'database columns': if ($field['type'] == 'fr_phone' || $field['type'] == 'it_phone' || $field['type'] == 'ca_phone' || $field['type'] == 'uk_phone' || $field['type'] == 'ru_phone' || $field['type'] == 'es_phone' || $field['type'] == 'au_phone'){ $columns = array( 'value' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE), ); } return $columns; } } /** * Implementation of hook_field(). */ function phone_field($op, &$node, $field, &$node_field, $teaser, $page) { switch ($op) { case 'view': foreach ($node_field as $delta => $item) { $node_field[$delta]['view'] = content_format($field, $item, 'default', $node); } return theme('field', $node, $field, $node_field, $teaser, $page); } } /** * Implementation of hook_field_view_item(). * */ /* function phone_field_view_item($field, $node_field_item) { $phonenumber = check_plain($node_field_item['value']); return $phonenumber; } */ /** *Implementation of hook_field_formatter_info */ function phone_field_formatter_info() { return array( 'default' => array( 'label' => 'Default', 'field types' => array('fr_phone', 'it_phone', 'ca_phone', 'uk_phone', 'ru_phone', 'es_phone', 'au_phone'), ), ); } /** * Implementation of hook_field_formatter(). **/ function phone_field_formatter($field, $item, $formatter, $node) { if (!isset($item['value'])) { return ''; } if ($field['text_processing']) { $text = check_markup($item['value'], $item['format'], is_null($node) || isset($node->in_preview)); } else { $text = check_plain($item['value']); } // iPhone Support if (strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone') !== FALSE) { $text = '' . $text . ''; } return $text; } /** * Implementation of hook_widget_info(). */ function phone_widget_info() { return array( 'phone' => array( 'label' => t('Textfield'), 'field types' => array('fr_phone', 'it_phone', 'ca_phone', 'uk_phone', 'ru_phone', 'es_phone', 'au_phone'), ), ); } /** * Implementation of hook_widget_settings(). */ function phone_widget_settings($op, $widget) { switch ($op) { case 'form': case 'validate': break; //do nothing case 'save': return array(); } } /** * Implementation of hook_widget(). */ function phone_widget($op, &$node, $field, &$node_field) { switch ($op) { case 'form': $form = array(); $form[$field['field_name']] = array('#tree' => TRUE); if ($field['multiple']) { $form[$field['field_name']]['#type'] = 'fieldset'; $form[$field['field_name']]['#title'] = t($field['widget']['label']); foreach (range(0,2) as $delta) { $form[$field['field_name']][$delta]['value'] = array( '#type' => 'textfield', '#title' => '', '#default_value' => isset($node_field[$delta]['value']) ? $node_field[$delta]['value'] : '', '#required' => $field['required'] ? $field['required'] : FALSE, '#maxlength' => 255, '#weight' => $field['widget']['weight'], '#size' => isset($field['widget']['size']) ? $field['widget']['size'] : 20, '#description' => $field['widget']['description'], ); } } else { $form[$field['field_name']][0]['value'] = array( '#type' => 'textfield', '#title' => $field['widget']['label'], '#default_value' => isset($node_field[0]['value']) ? $node_field[0]['value'] : '', '#required' => $field['required'] ? $field['required'] : FALSE, '#maxlength' => 255, '#weight' => $field['widget']['weight'], '#size' => isset($field['widget']['size']) ? $field['widget']['size'] : 20, '#description' => $field['widget']['description'], ); } return $form; case 'process form values': if (is_array($node_field)) { foreach ($node_field as $delta => $item) { //format the phone number if ($item['value'] != '') { if ($field['type'] == 'fr_phone') { $node_field[0]['value'] = format_phone_number('fr', $node_field[0]['value'], $field); } if ($field['type'] == 'it_phone') { $node_field[0]['value'] = format_phone_number('it', $node_field[0]['value'], $field); } if ($field['type'] == 'ca_phone') { $node_field[0]['value'] = format_phone_number('ca', $node_field[0]['value'], $field); } if ($field['type'] == 'uk_phone') { $node_field[0]['value'] = format_phone_number('uk', $node_field[0]['value'], $field); } if ($field['type'] == 'ru_phone') { $node_field[0]['value'] = format_phone_number('ru', $node_field[0]['value'], $field); } if ($field['type'] == 'es_phone') { $node_field[0]['value'] = format_phone_number('es', $node_field[0]['value'], $field); } if ($field['type'] == 'au_phone') { $node_field[0]['value'] = format_phone_number('au', $node_field[0]['value'], $field); } } } } break; case 'validate': if (is_array($node_field)) { foreach ($node_field as $delta => $item) { if ($item['value'] != '') { if ($field['type'] == 'fr_phone' && !valid_phone_number('fr', $item['value'])) { form_set_error($field['field_name'],t('"%value" is not a valid French phone number
French phone numbers should only contain numbers and spaces and be like 99 99 99 99 99', array('%value' => $item['value']))); } if ($field['type'] == 'it_phone' && !valid_phone_number('it', $item['value'])) { form_set_error($field['field_name'],t('"%value" is not a valid Italian phone number
Italian phone numbers should only ...', array('%value' => $item['value']))); } if ($field['type'] == 'ca_phone' && !valid_phone_number('ca', $item['value'])) { form_set_error($field['field_name'],t('"%value" is not a valid North American phone number
North American Phone numbers should only contain numbers and + and - and ( and ) and spaces and be like 999-999-9999. Please enter a valid ten-digit phone number with optional extension.', array('%value' => $item['value']))); } if ($field['type'] == 'uk_phone' && !valid_phone_number('uk', $item['value'])) { form_set_error($field['field_name'],t('"%value" is not a valid British phone number
British Phone numbers should .... ', array('%value' => $item['value']))); } if ($field['type'] == 'ru_phone' && !valid_phone_number('ru', $item['value'])) { form_set_error($field['field_name'],t('"%value" is not a valid Russian phone number
Russian Phone numbers should .... ', array('%value' => $item['value']))); } if ($field['type'] == 'es_phone' && !valid_phone_number('es', $item['value'])) { form_set_error($field['field_name'],t('"%value" is not a valid Spanish phone number
Spanish phone numbers should only contains numbers and spaces and be like 999 999 999', array('%value' => $item['value']))); } if ($field['type'] == 'au_phone' && !valid_phone_number('au', $item['value'])) { form_set_error($field['field_name'],t('"%value" is not a valid Australian phone number
Australian phone numbers should contain only numbers with an optional prefix of "+61"', array('%value' => $item['value']))); } } } } break; } } /** * Verification for Phone Numbers. * * @param string $countrycode * @param string $phonenumber * @return boolean Returns boolean FALSE if the phone number is not valid. */ function valid_phone_number($countrycode, $phonenumber) { $countrycode = trim($countrycode); $phonenumber = trim($phonenumber); if ($countrycode == 'fr' || $countrycode == 'it' || $countrycode == 'ca' || $countrycode == 'uk' || $countrycode == 'ru' || $countrycode == 'es' || $countrycode == 'au') { //drupal_set_message('langue = ' . $countrycode, 'error'); $valid_phone_function = 'valid_'. $countrycode . '_phone_number'; include_once('./'. drupal_get_path('module', 'phone') . '/phone.'. $countrycode . '.inc'); if (function_exists($valid_phone_function)) { return $valid_phone_function($phonenumber); } else { return false; } } else { //Country not taken into account yet return false; } } /** * Verification for Phone Numbers. * * @param string $countrycode * @param string $phonenumber * @return boolean Returns boolean FALSE if the phone number is not valid. */ function format_phone_number($countrycode, $phonenumber, $field) { $countrycode = trim($countrycode); $phonenumber = trim($phonenumber); if ($countrycode == 'fr' || $countrycode == 'it' || $countrycode == 'ca' || $countrycode == 'uk' || $countrycode == 'ru' || $countrycode == 'es' || $countrycode == 'au') { //drupal_set_message('langue = ' . $countrycode, 'error'); $format_phone_function = 'format_'. $countrycode . '_phone_number'; include_once('./'. drupal_get_path('module', 'phone') . '/phone.'. $countrycode . '.inc'); if (function_exists($format_phone_function)) { return $format_phone_function($phonenumber, $field); } else { return false; } } else { //Country not taken into account yet return false; } }