X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fphone.php;h=be6f3ad80fbd432795e44739f2ddd42d0fefb454;hb=e8ecbab4ad48a3c8c262c91bb492312be3738f86;hp=8a63d66cc854ea0b17fbbd5c0f20744110d465ad;hpb=a1c554a92888e0b017ba362817a67cc2849a9154;p=platal.git diff --git a/classes/phone.php b/classes/phone.php index 8a63d66..be6f3ad 100644 --- a/classes/phone.php +++ b/classes/phone.php @@ -55,6 +55,7 @@ class Phone const LINK_ADDRESS = 'address'; const LINK_PROFILE = 'user'; const LINK_COMPANY = 'hq'; + const LINK_GROUP = 'group'; /** The following fields, but $error, all correspond to the fields of the * database table profile_phones. @@ -186,9 +187,10 @@ class Phone if ((!isset($format['phoneprf'])) || ($format['phoneprf'] == '')) { $res = XDB::query('SELECT phonePrefix AS phoneprf, phoneFormat AS format FROM geoloc_countries - WHERE phonePrefix = {?} OR phonePrefix = {?} OR phonePrefix = {?} + WHERE phonePrefix = SUBSTRING({?}, 1, LENGTH(phonePrefix)) + ORDER BY LENGTH(phonePrefix) DESC LIMIT 1', - substr($tel, 0, 1), substr($tel, 0, 2), substr($tel, 0, 3)); + $tel); if ($res->numRows() == 0) { // No country found, does not format more than prepending a '+' sign. $this->error = true; @@ -276,9 +278,9 @@ class Phone { $this->format(); if (!$this->isEmpty()) { - XDB::execute('INSERT INTO profile_phones (pid, link_type, link_id, tel_id, tel_type, - search_tel, display_tel, pub, comment) - VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', + XDB::execute('INSERT IGNORE INTO profile_phones (pid, link_type, link_id, tel_id, tel_type, + search_tel, display_tel, pub, comment) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', $this->pid, $this->link_type, $this->link_id, $this->id, $this->type, $this->search, $this->display, $this->pub, $this->comment); } @@ -331,16 +333,18 @@ class Phone $phone = new Phone($item); $success = (!$phone->error && ($phone->format() || $phone->isEmpty()) && $success); if (!$phone->isEmpty()) { - if (!is_null($maxPublicity) && $maxPublicity->isVisible($phone->pub)) { - $phone->pub = $maxPublicity->level(); + // Restrict phone visibility to $maxPublicity + if (!is_null($maxPublicity) && Visibility::isLessRestrictive($maxPublicity, $phone->pub)) { + $phone->pub = $maxPublicity; } $phones[] = call_user_func(array($phone, $function)); } } if (count($phones) == 0 && $requiresEmptyPhone) { $phone = new Phone(); - if (!is_null($maxPublicity) && $maxPublicity->isVisible($phone->pub)) { - $phone->pub = $maxPublicity->level(); + if (!is_null($maxPublicity) && Visibility::isLessRestrictive($maxPublicity, $phone->pub)) { + // Restrict phone visibility to $maxPublicity + $phone->pub = $maxPublicity; } $phones[] = call_user_func(array($phone, $function)); } @@ -350,7 +354,9 @@ class Phone // Formats an array of form phones into an array of form formatted phones. static public function formatFormArray(array $data, &$success = true, $maxPublicity = null) { - return self::formArrayWalk($data, 'toFormArray', $success, true, $maxPublicity); + $phones = self::formArrayWalk($data, 'toFormArray', $success, true, $maxPublicity); + usort($phones, 'Visibility::comparePublicity'); + return $phones; } static public function formArrayToString(array $data) @@ -358,10 +364,20 @@ class Phone return implode(', ', self::formArrayWalk($data, 'toString')); } + static public function hasPrivate(array $phones) + { + foreach ($phones as $phone) { + if ($phone['pub'] == 'private') { + return true; + } + } + return false; + } + static public function iterate(array $pids = array(), array $link_types = array(), - array $link_ids = array(), array $pubs = array()) + array $link_ids = array(), $visibility = null) { - return new PhoneIterator($pids, $link_types, $link_ids, $pubs); + return new PhoneIterator($pids, $link_types, $link_ids, $visibility); } } @@ -376,7 +392,7 @@ class PhoneIterator implements PlIterator { private $dbiter; - public function __construct(array $pids, array $link_types, array $link_ids, array $pubs) + public function __construct(array $pids, array $link_types, array $link_ids, $visibility) { $where = array(); if (count($pids) != 0) { @@ -388,15 +404,18 @@ class PhoneIterator implements PlIterator if (count($link_ids) != 0) { $where[] = XDB::format('(link_id IN {?})', $link_ids); } - if (count($pubs) != 0) { - $where[] = XDB::format('(pub IN {?})', $pubs); + if ($visibility == null || !($visibility instanceof Visibility)) { + $visibility = Visibility::defaultForRead(); } + $where[] = 'pve.best_display_level+0 <= pub+0'; + $sql = 'SELECT search_tel AS search, display_tel AS display, comment, link_id, tel_type AS type, link_type, tel_id AS id, pid, pub FROM profile_phones - ' . ((count($where) > 0) ? 'WHERE ' . implode(' AND ', $where) : '') . ' + LEFT JOIN profile_visibility_enum AS pve ON (pve.access_level = {?}) + WHERE ' . implode(' AND ', $where) . ' ORDER BY pid, link_id, tel_id'; - $this->dbiter = XDB::iterator($sql); + $this->dbiter = XDB::iterator($sql, $visibility->level()); } public function next()