You are here

countries.install in Countries 8

Same filename and directory in other branches
  1. 7.2 countries.install
  2. 7 countries.install

Install file for Countries module.

File

countries.install
View source
<?php

/**
 * @file
 * Install file for Countries module.
 */

/**
 * Implements hook_schema().
 */
function countries_schema() {
  $schema['countries_country'] = array(
    'description' => 'Maintains a country database.',
    'fields' => array(
      'cid' => array(
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'description' => 'Primary Key: Unique country ID. Required for the country bundle.',
      ),
      'iso2' => array(
        'description' => 'ISO 3166-1 alpha-2 country code.',
        'type' => 'char',
        'length' => 2,
        'not null' => TRUE,
      ),
      'iso3' => array(
        'description' => 'ISO 3166-1 alpha-3 country code.',
        'type' => 'char',
        'length' => 3,
        'not null' => FALSE,
      ),
      'name' => array(
        'description' => 'ISO 3166-1 official short name.',
        'type' => 'varchar',
        'length' => 95,
        'not null' => TRUE,
      ),
      'official_name' => array(
        'description' => 'ISO 3166-1 official long name.',
        'type' => 'varchar',
        'length' => 127,
        'not null' => TRUE,
      ),
      'numcode' => array(
        'description' => 'ISO 3166-1 numeric-3 country code.',
        'type' => 'int',
        'size' => 'small',
        'not null' => FALSE,
      ),
      'continent' => array(
        'description' => 'Continent code.',
        'type' => 'char',
        'length' => 2,
        'not null' => TRUE,
      ),
      'enabled' => array(
        'type' => 'int',
        'not null' => TRUE,
        'default' => 1,
        'description' => 'Whether the country is enabled.',
      ),
      'language' => array(
        'description' => 'The {languages}.language of this node.',
        'type' => 'varchar',
        'length' => 12,
        'not null' => TRUE,
        'default' => LANGUAGE_NONE,
      ),
    ),
    'primary key' => array(
      'cid',
    ),
    'unique keys' => array(
      'iso2' => array(
        'iso2',
      ),
      'name' => array(
        'name',
      ),
    ),
    'indexes' => array(
      'enabled' => array(
        'enabled',
      ),
      'continent' => array(
        'continent',
      ),
    ),
  );
  return $schema;
}

/**
 * Implements hook_field_schema().
 */
function countries_field_schema($field) {
  return array(
    'columns' => array(
      'iso2' => array(
        'type' => 'varchar',
        'length' => 2,
        'not null' => FALSE,
      ),
    ),
    'indexes' => array(
      'iso2' => array(
        'iso2',
      ),
    ),
  );
}

/**
 * Implements hook_install().
 */
function countries_install() {

  // Import the data.
  countries_import_csv();
  $t = get_t();
  drupal_set_message($t('The list of countries has been updated to the latest definition from the ISO 3166. Enable the Countries Import module at any time to bulk update this list or to update this list with the Unicode Consortium CLDR that contains most countries in nearly all languages.'));
}

/**
 * Implements hook_uninstall().
 */
function countries_uninstall() {
  variable_del('countries_continents');
  variable_del('countries_csv_datasource');
  variable_del('countries_admin_overview_columns');
}

/**
 * Helper function to import countries.
 */
function countries_import_csv() {
  $t = get_t();
  $langcode = language_default('language');
  $countries = array();
  $handle = fopen(dirname(__FILE__) . '/countries.csv', 'r');
  $headers = fgetcsv($handle, 1024, ",");
  while (($row = fgetcsv($handle, 1024, ",")) !== FALSE) {

    // The iso2 data.
    $row[0] = trim($row[0]);

    // The iso3 data.
    $row[1] = empty($row[1]) || $row[1] == 'NULL' ? '' : trim($row[1]);

    // The name data.
    $row[2] = empty($row[2]) || $row[2] == 'NULL' ? '' : $t(trim($row[2]), array(), array(
      'langcode' => $langcode,
    ));

    // The official name data.
    $row[3] = empty($row[3]) || $row[3] == 'NULL' ? '' : $t(trim($row[3]), array(), array(
      'langcode' => $langcode,
    ));

    // The number code data.
    $row[4] = empty($row[4]) || $row[4] == 'NULL' ? 0 : trim($row[4]);

    // The continent data.
    $row[5] = empty($row[5]) || $row[5] == 'NULL' ? 'UN' : trim($row[5]);

    // The enabled data.
    $row[6] = empty($row[6]) || $row[6] == 'NULL' ? 0 : 1;
    if (!empty($row[0]) && $row[0] != 'NULL') {
      $countries[$row[0]] = array(
        'iso2' => $row[0],
        'iso3' => $row[1],
        'name' => $row[2],
        'official_name' => $row[3],
        'numcode' => $row[4],
        'continent' => $row[5],
        'enabled' => $row[6],
      );
    }
  }
  fclose($handle);
  include_once DRUPAL_ROOT . '/includes/iso.inc';
  foreach (_country_get_predefined_list() as $code => $name) {
    if (array_key_exists($code, $countries)) {
      $countries[$code]['enabled'] = 1;
    }
    else {
      drupal_set_message($t('Missing details for ISO 3166-1 alpha-2 code %code for %name in Countries data.', array(
        '%code' => $code,
        '%name' => $name,
      )), 'warning');
      $countries[$code] = array(
        'iso2' => $code,
        'iso3' => '',
        'name' => $name,
        'official_name' => '',
        'continent' => 'UN',
        'enabled' => 1,
        'numcode' => 0,
      );
    }
  }
  $insert = db_insert('countries_country')
    ->fields(array(
    'iso2',
    'iso3',
    'name',
    'official_name',
    'continent',
    'enabled',
    'numcode',
  ));
  foreach ($countries as $country) {
    $insert
      ->values($country);
  }
  $insert
    ->execute();
  watchdog('countries', "Pre-populated countries data.");
}

/**
 * This adds a translatable country possibility.
 */
function countries_update_7101() {
  db_add_field('countries_country', 'language', array(
    'description' => 'The {languages}.language of this node.',
    'type' => 'varchar',
    'length' => 12,
    'not null' => TRUE,
    'default' => LANGUAGE_NONE,
  ));
}

/**
 * Convert fields into option module select lists.
 */
function countries_update_7200() {
  foreach (field_read_fields(array(), array(
    'include_inactive' => TRUE,
  )) as $field_name => $info) {
    if ($info['module'] == 'countries' && $info['type'] == 'country') {
      $field_updated = isset($info['settings']['continents']);
      foreach (field_read_instances(array(
        'field_name' => $field_name,
      ), array(
        'include_inactive' => TRUE,
      )) as $instance_info) {
        if (!$field_updated) {
          if (!isset($info['settings']['continents']) && isset($instance_info['widget']['settings'])) {
            $info['settings'] += $instance_info['widget']['settings'];
            field_update_field($info);
            $field_updated = TRUE;
          }
        }
        if ($instance_info['widget']['type'] == 'country_select') {
          $instance_info['widget']['type'] = 'options_select';
          $instance_info['widget']['module'] = 'options';
          $instance_info['widget']['settings'] = array();
          field_update_instance($instance_info);
        }
      }

      // Set the defaults if required.
      if (!$field_updated) {
        $info['settings'] += array(
          'enabled' => COUNTRIES_ENABLED,
          'continents' => array(),
        );
        field_update_field($info);
      }
    }
  }
}

/**
 * This drops the unique indexes on the official name, ISO3 and NumCode.
 *
 * These fields are not required, so this will lead to PDO exceptions if two or
 * more countries have these fields left blank.
 */
function countries_update_7202() {
  db_drop_unique_key('countries_country', 'iso3');
  db_drop_unique_key('countries_country', 'numcode');
  db_drop_unique_key('countries_country', 'official_name');
}

/**
 * This updates the display settings to handle the new singular icon formatter.
 */
function countries_update_7203() {
  if (!module_exists('countryicons')) {
    return;
  }
  $flush = FALSE;
  foreach (field_info_fields() as $field_name => $field) {
    if ($field['type'] == 'country' && !empty($field['bundles'])) {
      foreach ($field['bundles'] as $entity_type => $bundles) {
        foreach ($bundles as $bundle) {
          $changed = FALSE;
          $instance = field_info_instance($entity_type, $field_name, $bundle);
          if (!empty($instance['display'])) {
            foreach ($instance['display'] as $view_mode => &$display) {
              if (strpos($display['type'], 'country_countryicons_') === 0) {
                list(, , $icon_type, $icon_set_name) = explode('_', $display['type'], 4);
                $property = '';
                if ($icon_type == 'imagename') {
                  $property = 'name';
                  $icon_type = 'image';
                }
                $display['type'] = 'country_icon';
                $display['settings']['countryiconset'] = $icon_type . '_' . $icon_set_name;
                $display['settings']['property'] = '';
                $changed = TRUE;
              }
            }
          }
          if ($changed) {
            field_update_instance($instance);
            $flush = TRUE;
          }
        }
      }
    }
  }
  if ($flush) {
    field_cache_clear();
  }
}

/**
 * Sets the language column.
 *
 * We have to guess the best language for this as the value may not match
 * the current sites default language. Also earlier imports would have been
 * tanslated the names to the language used during installation.
 */
function countries_update_7206() {
  $t = get_t();
  $language = language_default();
  db_update('countries_country')
    ->fields(array(
    'language' => $language->language,
  ))
    ->execute();
  drupal_set_message($t('Countries database language has been updated to match the sites default language %name.', array(
    '%name' => $language->name,
  )));
}

/**
 * Rebuilds the menu.
 *
 * Import has been moved the the sub-module Countries Import.
 */
function countries_update_7207() {
  variable_set('menu_rebuild_needed', 1);
}

Functions

Namesort descending Description
countries_field_schema Implements hook_field_schema().
countries_import_csv Helper function to import countries.
countries_install Implements hook_install().
countries_schema Implements hook_schema().
countries_uninstall Implements hook_uninstall().
countries_update_7101 This adds a translatable country possibility.
countries_update_7200 Convert fields into option module select lists.
countries_update_7202 This drops the unique indexes on the official name, ISO3 and NumCode.
countries_update_7203 This updates the display settings to handle the new singular icon formatter.
countries_update_7206 Sets the language column.
countries_update_7207 Rebuilds the menu.