X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fphone.php;h=21be6a67a863033e7688da1499f0f3e87d3535ec;hb=c90dde9391588ae99bd1852fa1e95f32b016e013;hp=8a63d66cc854ea0b17fbbd5c0f20744110d465ad;hpb=5b48ebf46ef939d701852d2117bbcf308036027c;p=platal.git diff --git a/classes/phone.php b/classes/phone.php index 8a63d66..21be6a6 100644 --- a/classes/phone.php +++ b/classes/phone.php @@ -1,6 +1,6 @@ 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); } @@ -327,20 +329,24 @@ class Phone static private function formArrayWalk(array $data, $function, &$success = true, $requiresEmptyPhone = false, $maxPublicity = null) { $phones = array(); - foreach ($data as $item) { - $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(); + if (!is_null($data)) { + foreach ($data as $item) { + $phone = new Phone($item); + $success = (!$phone->error && ($phone->format() || $phone->isEmpty()) && $success); + if (!$phone->isEmpty()) { + // Restrict phone visibility to $maxPublicity + if (!is_null($maxPublicity) && Visibility::isLessRestrictive($maxPublicity, $phone->pub)) { + $phone->pub = $maxPublicity; + } + $phones[] = call_user_func(array($phone, $function)); } - $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 +356,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 +366,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 +394,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 +406,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()