1
|
|
|
<?php |
2
|
|
|
/* Copyright (C) NAVER <http://www.navercorp.com> */ |
3
|
|
|
/** |
4
|
|
|
* @class krzipModel |
5
|
|
|
* @author NAVER ([email protected]) |
6
|
|
|
* @brief Krzip module model class. |
7
|
|
|
*/ |
8
|
|
|
|
9
|
|
|
class krzipModel extends krzip |
10
|
|
|
{ |
11
|
|
|
/** |
12
|
|
|
* @brief 한국 우편번호 모듈 설정 반환 |
13
|
|
|
* @return object |
14
|
|
|
*/ |
15
|
|
|
function getConfig() |
16
|
|
|
{ |
17
|
|
|
if(!isset($this->module_config)) |
18
|
|
|
{ |
19
|
|
|
$oModuleModel = getModel('module'); |
20
|
|
|
$module_config = $oModuleModel->getModuleConfig('krzip'); |
21
|
|
|
if(!is_object($module_config)) |
22
|
|
|
{ |
23
|
|
|
$module_config = new stdClass(); |
24
|
|
|
} |
25
|
|
|
|
26
|
|
|
/* 기본 설정 추가 */ |
27
|
|
|
$default_config = self::$default_config; |
28
|
|
|
foreach($default_config as $key => $val) |
29
|
|
|
{ |
30
|
|
|
if(!isset($module_config->{$key})) |
31
|
|
|
{ |
32
|
|
|
$module_config->{$key} = $val; |
33
|
|
|
} |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
$this->module_config = $module_config; |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
return $this->module_config; |
40
|
|
|
} |
41
|
|
|
|
42
|
|
|
/** |
43
|
|
|
* @brief 여러 포맷의 우편번호를 모듈 표준 포맷으로 변환 |
44
|
|
|
* @param mixed $values |
45
|
|
|
* @return array |
46
|
|
|
*/ |
47
|
|
|
function getMigratedPostcode($values) |
48
|
|
|
{ |
49
|
|
|
if(is_array($values)) |
50
|
|
|
{ |
51
|
|
|
$values = array_values($values); |
52
|
|
|
|
53
|
|
|
/* 5자리 우편변호 마이그레이션 */ |
54
|
|
|
if(count($values) == 4 && preg_match('/^\(?[0-9a-z\x20-]{5,10}\)?$/i', trim($values[0]))) |
55
|
|
|
{ |
56
|
|
|
return $values; |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
$values = implode(' ', $values); |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
$output = array('', trim(preg_replace('/\s+/', ' ', $values)), '', '', ''); |
63
|
|
|
|
64
|
|
|
/* 우편번호 */ |
65
|
|
|
if(preg_match('/\(?([0-9-]{5,7})\)?/', $output[1], $matches)) |
66
|
|
|
{ |
67
|
|
|
$output[1] = trim(preg_replace('/\s+/', ' ', str_replace($matches[0], '', $output[1]))); |
68
|
|
|
$output[0] = $matches[1]; |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
/* 지번 주소 */ |
72
|
|
View Code Duplication |
if(preg_match('/\(.+\s.+[읍면동리(마을)(0-9+가)]\s[0-9-]+\)/', $output[1], $matches)) |
73
|
|
|
{ |
74
|
|
|
$output[1] = trim(str_replace($matches[0], '', $output[1])); |
75
|
|
|
$output[2] = $matches[0]; |
76
|
|
|
} |
77
|
|
|
|
78
|
|
|
/* 부가 정보 */ |
79
|
|
View Code Duplication |
if(preg_match('/\(.+[읍면동리(마을)(0-9+가)](?:,.*)?\)/u', $output[1], $matches)) |
80
|
|
|
{ |
81
|
|
|
$output[1] = trim(str_replace($matches[0], '', $output[1])); |
82
|
|
|
$output[4] = $matches[0]; |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
/* 상세 주소 */ |
86
|
|
View Code Duplication |
if(preg_match('/^(.+ [가-힝]+[0-9]*[동리로길]\s*[0-9-]+(?:번지?)?),?\s+(.+)$/u', $output[1], $matches)) |
87
|
|
|
{ |
88
|
|
|
$output[1] = trim($matches[1]); |
89
|
|
|
$output[3] = trim($matches[2]); |
90
|
|
|
} |
91
|
|
|
|
92
|
|
|
return $output; |
93
|
|
|
} |
94
|
|
|
|
95
|
|
|
/** |
96
|
|
|
* @brief 외부 서버로부터 주소 검색 결과 반환 |
97
|
|
|
* @param string $query |
98
|
|
|
* @return mixed |
99
|
|
|
*/ |
100
|
|
|
function getKrzipCodeList($query) |
101
|
|
|
{ |
102
|
|
|
$module_config = $this->getConfig(); |
103
|
|
|
if($module_config->api_handler != 1) |
104
|
|
|
{ |
105
|
|
|
return $this->makeObject(-1, 'msg_invalid_request'); |
106
|
|
|
} |
107
|
|
|
if(!isset($query)) |
108
|
|
|
{ |
109
|
|
|
$query = Context::get('query'); |
110
|
|
|
} |
111
|
|
|
|
112
|
|
|
$query = trim(strval($query)); |
113
|
|
|
if($query === '') |
114
|
|
|
{ |
115
|
|
|
return $this->stop('msg_krzip_no_query'); |
116
|
|
|
} |
117
|
|
|
|
118
|
|
|
$output = $this->getEpostapiSearch($query); |
119
|
|
|
/* XML Request에서는 Array 치환에 대한 문제로 이 함수를 제대로 사용할 수 없음 */ |
120
|
|
|
$this->add('address_list', $output->get('address_list')); |
121
|
|
|
if(!$output->toBool()) |
122
|
|
|
{ |
123
|
|
|
return $output; |
124
|
|
|
} |
125
|
|
|
} |
126
|
|
|
|
127
|
|
|
/** |
128
|
|
|
* @brief 우체국 우편번호 API 검색 결과 반환 |
129
|
|
|
* @param string $query |
130
|
|
|
* @return object |
131
|
|
|
*/ |
132
|
|
|
function getEpostapiSearch($query = '') |
133
|
|
|
{ |
134
|
|
|
/** |
135
|
|
|
* @brief 문자열 인코딩 변환 |
136
|
|
|
* @note 우체국 우편번호 API는 검색어를 EUC-KR로 넘겨주어야 함 |
137
|
|
|
*/ |
138
|
|
|
$encoding = strtoupper(mb_detect_encoding($query)); |
139
|
|
|
if($encoding !== 'EUC-KR') |
140
|
|
|
{ |
141
|
|
|
$query = iconv($encoding, 'EUC-KR', $query); |
142
|
|
|
} |
143
|
|
|
|
144
|
|
|
$module_config = $this->getConfig(); |
145
|
|
|
$regkey = $module_config->epostapi_regkey; |
146
|
|
|
|
147
|
|
|
$fields = array( |
148
|
|
|
'target' => 'postNew', /* 도로명 주소 */ |
149
|
|
|
'regkey' => $regkey, |
150
|
|
|
'query' => $query |
151
|
|
|
); |
152
|
|
|
$headers = array( |
153
|
|
|
'accept-language' => 'ko' |
154
|
|
|
); |
155
|
|
|
$request_config = array( |
156
|
|
|
'ssl_verify_peer' => FALSE |
157
|
|
|
); |
158
|
|
|
|
159
|
|
|
$buff = FileHandler::getRemoteResource( |
160
|
|
|
self::$epostapi_host, |
161
|
|
|
NULL, |
162
|
|
|
30, |
163
|
|
|
'POST', |
164
|
|
|
'application/x-www-form-urlencoded', |
165
|
|
|
$headers, |
166
|
|
|
array(), |
167
|
|
|
$fields, |
168
|
|
|
$request_config |
169
|
|
|
); |
170
|
|
|
|
171
|
|
|
$oXmlParser = new XmlParser(); |
172
|
|
|
$result = $oXmlParser->parse($buff); |
173
|
|
|
if($result->error) |
174
|
|
|
{ |
175
|
|
|
$err_msg = trim($result->error->message->body); |
176
|
|
|
if(!$err_msg) |
177
|
|
|
{ |
178
|
|
|
$err_code = intval(str_replace('ERR-', '', $result->error->error_code->body)); |
179
|
|
|
switch($err_code) |
180
|
|
|
{ |
181
|
|
|
case 1: |
182
|
|
|
$err_msg = 'msg_krzip_is_maintenance'; |
183
|
|
|
break; |
184
|
|
|
case 2: |
185
|
|
|
$err_msg = 'msg_krzip_wrong_regkey'; |
186
|
|
|
break; |
187
|
|
|
case 3: |
188
|
|
|
$err_msg = 'msg_krzip_no_result'; |
189
|
|
|
break; |
190
|
|
|
default: |
191
|
|
|
$err_msg = 'msg_krzip_riddling_wrong'; |
192
|
|
|
break; |
193
|
|
|
} |
194
|
|
|
} |
195
|
|
|
|
196
|
|
|
return $this->makeObject(-1, $err_msg); |
197
|
|
|
} |
198
|
|
|
if(!$result->post) |
199
|
|
|
{ |
200
|
|
|
return $this->makeObject(-1, 'msg_krzip_riddling_wrong'); |
201
|
|
|
} |
202
|
|
|
|
203
|
|
|
$item_list = $result->post->itemlist->item; |
204
|
|
|
if(!is_array($item_list)) |
205
|
|
|
{ |
206
|
|
|
$item_list = array($item_list); |
207
|
|
|
} |
208
|
|
|
if(!$item_list) |
|
|
|
|
209
|
|
|
{ |
210
|
|
|
return $this->makeObject(-1, 'msg_krzip_no_result'); |
211
|
|
|
} |
212
|
|
|
|
213
|
|
|
$addr_list = array(); |
214
|
|
|
foreach($item_list as $key => $val) |
215
|
|
|
{ |
216
|
|
|
$postcode = $val->postcd->body; |
217
|
|
|
$road_addr = $val->address->body; |
218
|
|
|
$jibun_addr = $val->addrjibun->body; |
219
|
|
|
$detail = ''; |
220
|
|
|
$extra = ''; |
221
|
|
|
|
222
|
|
View Code Duplication |
if(preg_match('/\((?<detail>.+[읍면동리(마을)(0-9+가)](?:,.*)?)\)/', $road_addr, $matches)) |
223
|
|
|
{ |
224
|
|
|
$road_addr = trim(str_replace($matches[0], '', $road_addr)); |
225
|
|
|
$extra = '(' . $matches['detail'] . ')'; |
226
|
|
|
} |
227
|
|
View Code Duplication |
if(preg_match('/\((?<detail>.+[읍면동리(마을)(빌딩)(0-9+가)](?:,.*)?)\)/', $jibun_addr, $matches)) |
228
|
|
|
{ |
229
|
|
|
$jibun_addr = '(' . trim(str_replace($matches[0], '', $jibun_addr)) . ')'; |
230
|
|
|
} |
231
|
|
|
|
232
|
|
|
$addr_list[] = array( |
233
|
|
|
$postcode, // 0 우편번호 |
234
|
|
|
$road_addr, // 1 도로명 주소 |
235
|
|
|
$jibun_addr, // 2 지번 주소 |
236
|
|
|
$detail, // 3 상세 주소 |
237
|
|
|
$extra // 4 부가 정보 (**동, **빌딩) |
238
|
|
|
); |
239
|
|
|
} |
240
|
|
|
|
241
|
|
|
$output = $this->makeObject(); |
242
|
|
|
$output->add('address_list', $addr_list); |
243
|
|
|
|
244
|
|
|
return $output; |
245
|
|
|
} |
246
|
|
|
|
247
|
|
|
/** |
248
|
|
|
* @brief HTML 입력 폼 반환 |
249
|
|
|
* @param string $column_name |
250
|
|
|
* @param mixed $values |
251
|
|
|
* @return string |
252
|
|
|
*/ |
253
|
|
|
//06232 서울특별시 강남구 강남대로 382 서울특별시 강남구 역삼동 825-2 |
254
|
|
|
function getKrzipCodeSearchHtml($column_name, $values) |
255
|
|
|
{ |
256
|
|
|
$template_config = $this->getConfig(); |
257
|
|
|
$template_config->sequence_id = ++self::$sequence_id; |
258
|
|
|
$template_config->column_name = $column_name; |
259
|
|
|
$template_config->values = $this->getMigratedPostcode($values); |
260
|
|
|
Context::set('template_config', $template_config); |
261
|
|
|
|
262
|
|
|
$api_name = strval(self::$api_list[$template_config->api_handler]); |
263
|
|
|
$oTemplate = TemplateHandler::getInstance(); |
264
|
|
|
$output = $oTemplate->compile($this->module_path . 'tpl', 'template.' . $api_name); |
265
|
|
|
debugPrint($output); |
266
|
|
|
return $output; |
267
|
|
|
} |
268
|
|
|
} |
269
|
|
|
|
270
|
|
|
/* End of file krzip.model.php */ |
271
|
|
|
/* Location: ./modules/krzip/krzip.model.php */ |
272
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.