X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fprofile%2Faddresses.inc.php;h=2fe7a8d4c08749f6c3039cb5ed1affe8034aaaa5;hb=5a5d0431dc41c6eb1adf10c134331d8f44c91277;hp=1ea88695fd19b448b3155bc908af93ad1bbe278c;hpb=0b14f91d0a35ef3228101b9740164582a266ce04;p=platal.git diff --git a/modules/profile/addresses.inc.php b/modules/profile/addresses.inc.php index 1ea8869..2fe7a8d 100644 --- a/modules/profile/addresses.inc.php +++ b/modules/profile/addresses.inc.php @@ -1,6 +1,6 @@ bool = new ProfileBool(); + $this->pub = new ProfilePub(); + $this->tel = new ProfileTel(); + } + + private function cleanAddress(ProfilePage &$page, array &$address, &$success) + { + if (@$address['changed']) { + $address['datemaj'] = time(); + } $success = true; + foreach ($address['tel'] as $t=>&$tel) { + if (@$tel['removed'] || !trim($tel['tel'])) { + unset($address['tel'][$t]); + } else { + $tel['pub'] = $this->pub->value($page, 'pub', $tel['pub'], $s); + $tel['tel'] = $this->tel->value($page, 'tel', $tel['tel'], $s); + if (!$s) { + $tel['error'] = true; + $success = false; + } + } + unset($tel['removed']); + } + $address['checked'] = $this->bool->value($page, 'checked', $address['checked'], $s); + $address['secondaire'] = $this->bool->value($page, 'secondaire', $address['secondaire'], $s); + $address['mail'] = $this->bool->value($page, 'mail', $address['mail'], $s); + $address['temporary'] = $this->bool->value($page, 'temporary', $address['temporary'], $s); + $address['current'] = $this->bool->value($page, 'current', @$address['current'], $s); + $address['pub'] = $this->pub->value($page, 'pub', $address['pub'], $s); + unset($address['parsevalid']); + unset($address['changed']); + unset($address['removed']); + unset($address['display']); + } + + public function value(ProfilePage &$page, $field, $value, &$success) + { + $init = false; if (is_null($value)) { - return $page->values['addresses']; + $value = $page->values['addresses']; + $init = true; + } + foreach ($value as $key=>&$adr) { + if (@$adr['removed']) { + unset($value[$key]); + } } + $current = 0; + $success = true; foreach ($value as $key=>&$adr) { - if ($adr['removed']) { + if (@$adr['current']) { + $current++; + } + } + if ($current == 0 && count($value) > 0) { + foreach ($value as $key=>&$adr) { + $adr['current'] = true; + break; + } + } else if ($current > 1) { + $success = false; + } + foreach ($value as $key=>&$adr) { + $ls = true; + $this->geolocAddress($adr, $s); + $ls = ($ls && $s); + $this->cleanAddress($page, $adr, $s); + $ls = ($ls && $s); + if (!trim($adr['text'])) { unset($value[$key]); + } else if (!$init) { + $success = ($success && $ls); } } return $value; } + + private function saveTel($adrid, $telid, array &$tel) + { + XDB::execute("INSERT INTO tels (uid, adrid, telid, + tel_type, tel_pub, tel) + VALUES ({?}, {?}, {?}, + {?}, {?}, {?})", + S::i('uid'), $adrid, $telid, + $tel['type'], $tel['pub'], $tel['tel']); + } + + private function saveAddress($adrid, array &$address) + { + $flags = array(); + if ($address['secondaire']) { + $flags[] = 'res-secondaire'; + } + if ($address['mail']) { + $flags[] = 'courrier'; + } + if ($address['temporary']) { + $flags[] = 'temporaire'; + } + if ($address['current']) { + $flags[] = 'active'; + } + if ($address['checked']) { + $flags[] = 'coord-checked'; + } + $flags = implode(',', $flags); + XDB::execute("INSERT INTO adresses (adr1, adr2, adr3, + postcode, city, cityid, + country, region, regiontxt, + pub, datemaj, statut, + uid, adrid, glat, glng) + VALUES ({?}, {?}, {?}, + {?}, {?}, {?}, + {?}, {?}, {?}, + {?}, FROM_UNIXTIME({?}), {?}, + {?}, {?}, {?}, {?})", + $address['adr1'], $address['adr2'], $address['adr3'], + $address['postcode'], $address['city'], $address['cityid'], + $address['country'], $address['region'], $address['regiontxt'], + $address['pub'], $address['datemaj'], $flags, + S::i('uid'), $adrid, $address['precise_lat'], $address['precise_lon']); + foreach ($address['tel'] as $telid=>&$tel) { + $this->saveTel($adrid, $telid, $tel); + } + } + + public function save(ProfilePage &$page, $field, $value) + { + XDB::execute("DELETE FROM adresses + WHERE uid = {?}", + S::i('uid')); + XDB::execute("DELETE FROM tels + WHERE uid = {?}", + S::i('uid')); + foreach ($value as $adrid=>&$address) { + $this->saveAddress($adrid, $address); + } + } } class ProfileAddresses extends ProfilePage @@ -44,62 +176,63 @@ class ProfileAddresses extends ProfilePage { parent::__construct($wiz); $this->settings['addresses'] = new ProfileAddress(); + $this->watched['addresses'] = true; } - protected function fetchData() + protected function _fetchData() { - if (count($this->orig) > 0) { - $this->values = $this->orig; - return; - } // Build the addresses tree - $res = XDB::query("SELECT adrid AS id, adr1, adr2, adr3, - postcode, city, cityid, region, regiontxt, - fax, glat, glng, datemaj, pub, - FIND_IN_SET('res-secondaire', statut) AS secondaire, - FIND_IN_SET('courrier', statut) AS mail, - FIND_IN_SET('temporary', statut) AS temporary, - FIND_IN_SET('active', statut) AS current, - FIND_IN_SET('coord-checked', statut) AS checked, - FIND_IN_SET('coord-valid', statut) AS valid - FROM adresses - WHERE uid = {?} + $res = XDB::query("SELECT a.adrid AS id, a.adr1, a.adr2, a.adr3, + UNIX_TIMESTAMP(a.datemaj) AS datemaj, + a.postcode, a.city, a.cityid, a.region, a.regiontxt, + a.pub, a.country, gp.pays AS countrytxt, gp.display, + FIND_IN_SET('coord-checked', a.statut) AS checked, + FIND_IN_SET('res-secondaire', a.statut) AS secondaire, + FIND_IN_SET('courrier', a.statut) AS mail, + FIND_IN_SET('temporaire', a.statut) AS temporary, + FIND_IN_SET('active', a.statut) AS current, + a.glat AS precise_lat, a.glng AS precise_lon + FROM adresses AS a + INNER JOIN geoloc_pays AS gp ON(gp.a2 = a.country) + WHERE uid = {?} AND NOT FIND_IN_SET('pro', statut) ORDER BY adrid", S::i('uid')); - $this->values['addresses'] = $res->fetchAllAssoc(); + if ($res->numRows() == 0) { + $this->values['addresses'] = array(); + } else { + $this->values['addresses'] = $res->fetchAllAssoc(); + } - $res = XDB::iterRow("SELECT adrid, telid, tel_type, tel_pub, tel - FROM tels - WHERE uid = {?} - ORDER BY adrid", - S::i('uid')); + $res = XDB::iterator("SELECT adrid, tel_type AS type, tel_pub AS pub, tel + FROM tels + WHERE uid = {?} + ORDER BY adrid", + S::i('uid')); $i = 0; - while (list($adrid, $telid, $type, $pub, $tel) = $res->next()) { - while ($this->values['addresses'][$i]['id'] < $adrid) { + $adrNb = count($this->values['addresses']); + while ($tel = $res->next()) { + $adrid = $tel['adrid']; + unset($tel['adrid']); + while ($i < $adrNb && $this->values['addresses'][$i]['id'] < $adrid) { $i++; } + if ($i >= $adrNb) { + break; + } $address =& $this->values['addresses'][$i]; if (!isset($address['tel'])) { $address['tel'] = array(); } if ($address['id'] == $adrid) { - $address['tel'][] = array('id' => $telid, - 'type' => $type, - 'pub' => $pub, - 'tel' => $tel); + $address['tel'][] = $tel; } } - parent::fetchData(); - } - - protected function saveData() - { - parent::saveData(); - } - - public function prepare(PlatalPage &$page) - { - parent::prepare($page); + foreach ($this->values['addresses'] as $id=>&$address) { + if (!isset($address['tel'])) { + $address['tel'] = array(); + } + unset($address['id']); + } } }