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.
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;
$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));
}
static public function formatFormArray(array $data, &$success = true, $maxPublicity = null)
{
$phones = self::formArrayWalk($data, 'toFormArray', $success, true, $maxPublicity);
- usort($phones, 'ProfileVisibility::comparePublicity');
+ usort($phones, 'Visibility::comparePublicity');
return $phones;
}
}
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);
}
}
{
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) {
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()