-
Notifications
You must be signed in to change notification settings - Fork 6
/
uscounties.php
102 lines (88 loc) · 2.8 KB
/
uscounties.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
/**
* Check and load counties
*/
function uscounties_loadcounties() {
// The counties.json file consists of JSON for one object where each key is
// the ISO code for a country, and each value is an object. For each of those
// inner objects, each key is the name for a state/province and the value is
// an array of county names.
$allCounties = json_decode(file_get_contents(__DIR__ . '/counties.json'), TRUE);
foreach ($allCounties as $countryIso => $counties) {
// Get array of states.
try {
$result = civicrm_api3('Country', 'getsingle', [
'iso_code' => $countryIso,
'api.Address.getoptions' => [
'field' => 'state_province_id',
'country_id' => '$value.id',
'sequential' => 0,
],
]);
}
catch (CiviCRM_API3_Exception $e) {
$error = $e->getMessage();
CRM_Core_Error::debug_log_message(ts('API Error: %1', [
'domain' => 'com.aghstrategies.uscounties',
1 => $error,
]));
return FALSE;
}
if (empty($result['api.Address.getoptions']['values'])) {
return FALSE;
}
$states = $result['api.Address.getoptions']['values'];
// go state-by-state to check existing counties
foreach ($counties as $stateName => $state) {
$id = array_search($stateName, $states);
if ($id === FALSE) {
continue;
}
$check = "SELECT name FROM civicrm_county WHERE state_province_id = $id";
$results = CRM_Core_DAO::executeQuery($check);
$existing = [];
while ($results->fetch()) {
$existing[] = $results->name;
}
// identify counties needing to be loaded
$add = array_diff($state, $existing);
$insert = [];
foreach ($add as $county) {
$countye = CRM_Core_DAO::escapeString($county);
$insert[] = "('$countye', $id)";
}
// put it into queries of 50 counties each
for ($i = 0; $i < count($insert); $i = $i + 50) {
$inserts = array_slice($insert, $i, 50);
$query = "INSERT INTO civicrm_county (name, state_province_id) VALUES ";
$query .= implode(', ', $inserts);
CRM_Core_DAO::executeQuery($query);
}
}
}
return TRUE;
}
/**
* Implements hook_civicrm_install().
*
* @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_install
*/
function uscounties_civicrm_install() {
uscounties_loadcounties();
}
/**
* Implements hook_civicrm_enable().
*
* @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable
*/
function uscounties_civicrm_enable() {
uscounties_loadcounties();
}
/**
* Implements hook_civicrm_upgrade().
*
* @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_upgrade
*/
function uscounties_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
uscounties_loadcounties();
}