array('label' => t('French Phone Numbers')),
'it_phone' => array('label' => t('Italian Phone Numbers')),
'ca_phone' => array('label' => t('US & Canadian Phone Numbers')),
'cr_phone' => array('label' => t('Costa Rican 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')),
'cs_phone' => array('label' => t('Czech Phone Numbers')),
'hu_phone' => array('label' => t('Hungarian 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'] == 'cr_phone'
|| $field['type'] == 'uk_phone'
|| $field['type'] == 'ru_phone'
|| $field['type'] == 'es_phone'
|| $field['type'] == 'au_phone'
|| $field['type'] == 'cs_phone'
|| $field['type'] == 'hu_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',
'cr_phone',
'uk_phone',
'ru_phone',
'es_phone',
'au_phone',
'cs_phone',
'hu_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',
'cr_phone',
'uk_phone',
'ru_phone',
'es_phone',
'au_phone',
'cs_phone',
'hu_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'] == 'cr_phone') {
$node_field[0]['value'] = format_phone_number('cr', $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);
}
if ($field['type'] == 'cs_phone') {
$node_field[0]['value'] = format_phone_number('cs', $node_field[0]['value'], $field);
}
if ($field['type'] == 'hu_phone') {
$node_field[0]['value'] = format_phone_number('hu', $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'] == 'cr_phone' && !valid_phone_number('cr', $item['value'])) {
form_set_error($field['field_name'],t('"%value" is not a valid Costa Rican phone number!
Costa Rican phone numbers should contain only numbers and spaces be like 99 99 99 99 with an optional prefix of "+506" or "00506".', 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'])));
}
if ($field['type'] == 'cs_phone' && !valid_phone_number('cs', $item['value'])) {
form_set_error($field['field_name'],t('"%value" is not a valid Czech phone number!
Czech phone numbers should contain only numbers and spaces be like 999 999 999 with an optional prefix of "+420" or "00420".', array('%value' => $item['value'])));
}
if ($field['type'] == 'hu_phone' && !valid_phone_number('hu', $item['value'])) {
form_set_error($field['field_name'],t('"%value" is not a valid Hungarian phone number!
Hungarian phone numbers should contain only numbers and spaces be like 70 999 9999 with an optional prefix of "+36" or "06".', 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 == 'cr'
|| $countrycode == 'uk'
|| $countrycode == 'ru'
|| $countrycode == 'es'
|| $countrycode == 'au'
|| $countrycode == 'cs'
|| $countrycode == 'hu'
) {
//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 == 'cr'
|| $countrycode == 'uk'
|| $countrycode == 'ru'
|| $countrycode == 'es'
|| $countrycode == 'au'
|| $countrycode == 'cs'
|| $countrycode == 'hu'
) {
//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;
}
}