Adds phone number search
[platal.git] / modules / profile / addresses.inc.php
CommitLineData
0b14f91d
FB
1<?php
2/***************************************************************************
179afa7f 3 * Copyright (C) 2003-2008 Polytechnique.org *
0b14f91d
FB
4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
37d44b3b 22class ProfileAddress extends ProfileGeoloc
0b14f91d 23{
d5489b09
FB
24 private $bool;
25 private $pub;
a619333a 26 private $tel;
d5489b09
FB
27
28 public function __construct()
29 {
30 $this->bool = new ProfileBool();
31 $this->pub = new ProfilePub();
a619333a 32 $this->tel = new ProfileTel();
d5489b09
FB
33 }
34
a619333a 35 private function cleanAddress(ProfilePage &$page, array &$address, &$success)
d5489b09
FB
36 {
37 if (@$address['changed']) {
38 $address['datemaj'] = time();
39 }
a619333a 40 $success = true;
d5489b09 41 foreach ($address['tel'] as $t=>&$tel) {
c6a7beb2 42 if (@$tel['removed'] || !trim($tel['tel'])) {
d5489b09
FB
43 unset($address['tel'][$t]);
44 } else {
a619333a
FB
45 $tel['pub'] = $this->pub->value($page, 'pub', $tel['pub'], $s);
46 $tel['tel'] = $this->tel->value($page, 'tel', $tel['tel'], $s);
47 if (!$s) {
48 $tel['error'] = true;
49 $success = false;
50 }
d5489b09 51 }
c24a06aa 52 unset($tel['removed']);
d5489b09 53 }
f93fb300 54 $address['checked'] = $this->bool->value($page, 'checked', $address['checked'], $s);
a619333a
FB
55 $address['secondaire'] = $this->bool->value($page, 'secondaire', $address['secondaire'], $s);
56 $address['mail'] = $this->bool->value($page, 'mail', $address['mail'], $s);
57 $address['temporary'] = $this->bool->value($page, 'temporary', $address['temporary'], $s);
58 $address['current'] = $this->bool->value($page, 'current', @$address['current'], $s);
59 $address['pub'] = $this->pub->value($page, 'pub', $address['pub'], $s);
c24a06aa
FB
60 unset($address['parsevalid']);
61 unset($address['changed']);
62 unset($address['removed']);
63 unset($address['display']);
d5489b09
FB
64 }
65
0b14f91d
FB
66 public function value(ProfilePage &$page, $field, $value, &$success)
67 {
7568a515 68 $init = false;
0b14f91d 69 if (is_null($value)) {
7568a515
FB
70 $value = $page->values['addresses'];
71 $init = true;
0b14f91d
FB
72 }
73 foreach ($value as $key=>&$adr) {
7568a515 74 if (@$adr['removed']) {
0b14f91d
FB
75 unset($value[$key]);
76 }
77 }
9a1cb883 78 $current = 0;
2db7542d 79 $success = true;
9a1cb883
FB
80 foreach ($value as $key=>&$adr) {
81 if (@$adr['current']) {
82 $current++;
83 }
84 }
2db7542d
FB
85 if ($current == 0 && count($value) > 0) {
86 foreach ($value as $key=>&$adr) {
87 $adr['current'] = true;
88 break;
89 }
90 } else if ($current > 1) {
9a1cb883 91 $success = false;
9a1cb883 92 }
7568a515 93 foreach ($value as $key=>&$adr) {
a619333a 94 $ls = true;
7568a515 95 $this->geolocAddress($adr, $s);
a619333a
FB
96 $ls = ($ls && $s);
97 $this->cleanAddress($page, $adr, $s);
98 $ls = ($ls && $s);
c6a7beb2
FB
99 if (!trim($adr['text'])) {
100 unset($value[$key]);
a619333a
FB
101 } else if (!$init) {
102 $success = ($success && $ls);
c6a7beb2 103 }
7568a515 104 }
0b14f91d
FB
105 return $value;
106 }
d5489b09
FB
107
108 private function saveTel($adrid, $telid, array &$tel)
109 {
110 XDB::execute("INSERT INTO tels (uid, adrid, telid,
111 tel_type, tel_pub, tel)
112 VALUES ({?}, {?}, {?},
113 {?}, {?}, {?})",
114 S::i('uid'), $adrid, $telid,
115 $tel['type'], $tel['pub'], $tel['tel']);
116 }
117
118 private function saveAddress($adrid, array &$address)
119 {
120 $flags = array();
121 if ($address['secondaire']) {
122 $flags[] = 'res-secondaire';
123 }
124 if ($address['mail']) {
125 $flags[] = 'courrier';
126 }
127 if ($address['temporary']) {
128 $flags[] = 'temporaire';
129 }
130 if ($address['current']) {
131 $flags[] = 'active';
132 }
f93fb300
FB
133 if ($address['checked']) {
134 $flags[] = 'coord-checked';
135 }
d5489b09 136 $flags = implode(',', $flags);
c24a06aa 137 XDB::execute("INSERT INTO adresses (adr1, adr2, adr3,
d5489b09
FB
138 postcode, city, cityid,
139 country, region, regiontxt,
140 pub, datemaj, statut,
646a4582 141 uid, adrid, glat, glng, comment)
d5489b09
FB
142 VALUES ({?}, {?}, {?},
143 {?}, {?}, {?},
144 {?}, {?}, {?},
145 {?}, FROM_UNIXTIME({?}), {?},
646a4582 146 {?}, {?}, {?}, {?}, {?})",
d5489b09
FB
147 $address['adr1'], $address['adr2'], $address['adr3'],
148 $address['postcode'], $address['city'], $address['cityid'],
149 $address['country'], $address['region'], $address['regiontxt'],
150 $address['pub'], $address['datemaj'], $flags,
646a4582 151 S::i('uid'), $adrid, $address['precise_lat'], $address['precise_lon'], $address['comment']);
d5489b09
FB
152 foreach ($address['tel'] as $telid=>&$tel) {
153 $this->saveTel($adrid, $telid, $tel);
154 }
155 }
156
157 public function save(ProfilePage &$page, $field, $value)
158 {
159 XDB::execute("DELETE FROM adresses
160 WHERE uid = {?}",
161 S::i('uid'));
162 XDB::execute("DELETE FROM tels
163 WHERE uid = {?}",
164 S::i('uid'));
165 foreach ($value as $adrid=>&$address) {
166 $this->saveAddress($adrid, $address);
167 }
168 }
0b14f91d
FB
169}
170
171class ProfileAddresses extends ProfilePage
172{
173 protected $pg_template = 'profile/adresses.tpl';
174
175 public function __construct(PlWizard &$wiz)
176 {
177 parent::__construct($wiz);
178 $this->settings['addresses'] = new ProfileAddress();
a2a1c2f2 179 $this->watched['addresses'] = true;
0b14f91d
FB
180 }
181
7c2e0f0d 182 protected function _fetchData()
0b14f91d 183 {
0b14f91d 184 // Build the addresses tree
7568a515 185 $res = XDB::query("SELECT a.adrid AS id, a.adr1, a.adr2, a.adr3,
d5489b09 186 UNIX_TIMESTAMP(a.datemaj) AS datemaj,
7568a515 187 a.postcode, a.city, a.cityid, a.region, a.regiontxt,
d5489b09 188 a.pub, a.country, gp.pays AS countrytxt, gp.display,
f93fb300 189 FIND_IN_SET('coord-checked', a.statut) AS checked,
7568a515
FB
190 FIND_IN_SET('res-secondaire', a.statut) AS secondaire,
191 FIND_IN_SET('courrier', a.statut) AS mail,
d5489b09 192 FIND_IN_SET('temporaire', a.statut) AS temporary,
de0485fd 193 FIND_IN_SET('active', a.statut) AS current,
646a4582
GB
194 a.glat AS precise_lat, a.glng AS precise_lon,
195 a.comment
7568a515 196 FROM adresses AS a
37d44b3b 197 INNER JOIN geoloc_pays AS gp ON(gp.a2 = a.country)
7568a515 198 WHERE uid = {?} AND NOT FIND_IN_SET('pro', statut)
0b14f91d
FB
199 ORDER BY adrid",
200 S::i('uid'));
c24a06aa
FB
201 if ($res->numRows() == 0) {
202 $this->values['addresses'] = array();
203 } else {
204 $this->values['addresses'] = $res->fetchAllAssoc();
205 }
0b14f91d 206
7568a515
FB
207 $res = XDB::iterator("SELECT adrid, tel_type AS type, tel_pub AS pub, tel
208 FROM tels
209 WHERE uid = {?}
210 ORDER BY adrid",
211 S::i('uid'));
0b14f91d 212 $i = 0;
c24a06aa 213 $adrNb = count($this->values['addresses']);
7568a515
FB
214 while ($tel = $res->next()) {
215 $adrid = $tel['adrid'];
216 unset($tel['adrid']);
c24a06aa 217 while ($i < $adrNb && $this->values['addresses'][$i]['id'] < $adrid) {
0b14f91d
FB
218 $i++;
219 }
c24a06aa
FB
220 if ($i >= $adrNb) {
221 break;
222 }
0b14f91d
FB
223 $address =& $this->values['addresses'][$i];
224 if (!isset($address['tel'])) {
225 $address['tel'] = array();
226 }
227 if ($address['id'] == $adrid) {
7568a515 228 $address['tel'][] = $tel;
0b14f91d
FB
229 }
230 }
7568a515 231 foreach ($this->values['addresses'] as $id=>&$address) {
c24a06aa
FB
232 if (!isset($address['tel'])) {
233 $address['tel'] = array();
234 }
7568a515
FB
235 unset($address['id']);
236 }
0b14f91d 237 }
0b14f91d
FB
238}
239
240// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
241?>