Приводим номер телефона к единому виду.

В базе данных drupal 7 есть текстовое поле (field_phone) используемое под номер телефона. Данные заносились без какой либо проверки и имеют совершенно различные написания телефонных номеров.

Возникла необходимость к привидению всех номеров телефонов к единому виду:
+7 (ХХХ) ХХХ-ХХХХ

Для запуска кода нормализации нужен модуль Devel. Код вставляем на странице devel/php

  1. // Выбираем field_phone_value и entity_id из таблицы field_data_field_phone
  2. // Формируем запрос
  3. // SELECT f.entity_id AS entity_id, f.field_phone_value AS field_phone_value FROM field_data_field_phone f
  4. $query = db_select('field_data_field_phone', 'f')
  5.   ->fields('f', array('entity_id', 'field_phone_value'));
  6.  // ->condition('f.entity_id', 24, '<=');
  7. $result = $query->execute();
  8.  
  9. foreach ($result as $ph) {
  10.   // Исходный номер телефона
  11.   $phone = $ph->field_phone_value;
  12.   // entity_id
  13.   $e_id =  $ph->entity_id;
  14.  
  15.   // Уберет любые знаки кроме цифр
  16.   $phone = preg_replace("#[^\d]#", "", $phone);
  17.   // Оставит последние 10 цифр начиная с конца строки
  18.   $phone = substr($phone, -10);
  19.   // Формируем шаблон  +7 (ХХХ) ХХХ-ХХХХ
  20.   $area = substr($phone, 0,3);
  21.   $prefix = substr($phone,3,3);
  22.   $number = substr($phone,6,4);
  23.   $phone = "+7 (".$area.") ".$prefix."-".$number; 
  24.  
  25.   // Обновляем строки в БД
  26.   $query = db_update('field_data_field_phone')
  27.     ->fields(array('field_phone_value' => $phone,))
  28.     ->condition('entity_id', $e_id)
  29.     ->execute();
  30. }
  31.  
  32. // Выводим сообщение
  33. drupal_set_message('Обновлено записей: ' . $result->rowCount());

Что бы новые пользователи сразу забивали номер телефона в нужном виде можно использовать модуль Masked Input позволяющий задать шаблон для номера телефона.

Может быть полезно: