<?php
require './connect.db.inc.php';
-require_once 'profil.func.inc.php';
$globals->debug = 0; // do not store backtraces
-
+// TODO: Improve this using Phone::iterate.
function do_update_by_block($values)
{
$values = '';
$i = 0;
while ($phone = $res->next()) {
- $disp = format_display_number($phone['search_tel'], $error, array('format' => $format, 'phoneprf' => $prefix));
+ $phone = new Phone('display' => $phone['display_tel']);
+ $phone->format(array('format' => $format, 'phoneprf' => $prefix));
if ($values != '') {
$values .= ",\n";
}
$values .= "('" . addslashes($phone['pid']) . "', '" . addslashes($phone['link_type'])
. "', '" . addslashes($phone['link_id'])
. "', '" . addslashes($phone['tel_id']) . "', '" . addslashes($phone['tel_type'])
- . "', '" . addslashes($phone['search_tel']) . "', '" . addslashes($disp)
+ . "', '" . addslashes($phone['search_tel']) . "', '" . addslashes($phone->display)
. "', '" . addslashes($phone['pub']) . "', '" . addslashes($phone['comment']) . "')";
$i++;
if ($i == 1000) {
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2010 Polytechnique.org *
+ * http://opensource.polytechnique.org/ *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+ ***************************************************************************/
+
+/** Class Phone is meant to perform most of the access to the table profile_phones.
+ *
+ * profile_phone describes a Phone, which can be related to an Address,
+ * a Job, a Profile or a Company:
+ * - for a Profile:
+ * - `link_type` is set to 'user'
+ * - `link_id` is set to 0
+ * - `pid` is set to the id of the related Profile (in profiles)
+ *
+ * - for a Company:
+ * - `link_type` is set to 'hq'
+ * - `link_id` is set to the id of the related Company (in profile_job_enum)
+ * - `pid` is set to 0
+ *
+ * - for an Address (this only applies to a personal address)
+ * - `link_type` is set to 'address'
+ * - `link_id` is set to the related Address `id` (in profile_addresses)
+ * - `pid` is set to the related Address `pid` (in both profiles and profile_addresses)
+ *
+ * - for a Job:
+ * - `link_type` is set to 'pro'
+ * - `link_id` is set to the related Job `id` (not `jobid`) (in profile_job)
+ * - `pid` is set to the related Job `pid` (in both profiles and profile_job)
+ *
+ * Thus a Phone can be linked to a Company, a Profile, a Job, or a Profile-related Address.
+*/
+class Phone
+{
+ const TYPE_FAX = 'fax';
+ const TYPE_FIXED = 'fixed';
+ const TYPE_MOBILE = 'mobile';
+
+ const LINK_JOB = 'pro';
+ const LINK_ADDRESS = 'address';
+ const LINK_PROFILE = 'user';
+ const LINK_COMPANY = 'hq';
+
+ /** The following fields, but $error, all correspond to the fields of the
+ * database table profile_phones.
+ */
+ private $id = 0;
+ private $pid = 0;
+ private $search = '';
+ private $link_type = 'user';
+ private $link_id = 0;
+ // The following fields are the fields of the form in the profile edition.
+ private $type = 'fixed';
+ public $display = '';
+ private $pub = 'private';
+ public $comment = '';
+ private $error = false;
+
+ public function __construct(array $data = array())
+ {
+ if (count($data) > 0) {
+ foreach ($data as $key => $val) {
+ $this->$key = $val;
+ }
+ }
+ }
+
+ public function linkType()
+ {
+ return $this->link_type;
+ }
+
+ public function linkId()
+ {
+ return $this->link_id;
+ }
+
+ public function id()
+ {
+ return $this->id;
+ }
+
+ public function pid()
+ {
+ return $this->pid;
+ }
+
+ public function search()
+ {
+ return $this->search;
+ }
+
+ /** Returns the unique ID of a phone.
+ * This ID will allow to link it to an address, a user or a job.
+ * The format is address_addressId_phoneId (where phoneId is the id
+ * of the phone in the list of those associated with the address).
+ */
+ public function uniqueId() {
+ return $this->link_type . '_' . $this->link_id . '_' . $this->id;
+ }
+
+ public function hasFlags($flags) {
+ return $this->hasType($flags) && $this->hasLink($flags);
+ }
+
+ /** Returns true if this phone's type matches the flags.
+ */
+ public function hasType($flags) {
+ $flags = $flags & Profile::PHONE_TYPE_ANY;
+ return (
+ ($flags == Profile::PHONE_TYPE_ANY)
+ ||
+ (($flags & Profile::PHONE_TYPE_FAX) && $this->type == self::TYPE_FAX)
+ ||
+ (($flags & Profile::PHONE_TYPE_FIXED) && $this->type == self::TYPE_FIXED)
+ ||
+ (($flags & Profile::PHONE_TYPE_MOBILE) && $this->type == self::TYPE_MOBILE)
+ );
+ }
+
+ /** User-friendly accessible version of the type.
+ */
+ public function displayType($short = false)
+ {
+ switch ($this->type) {
+ case Phone::TYPE_FIXED:
+ return $short ? 'Tél' : 'Fixe';
+ case Phone::TYPE_FAX:
+ return 'Fax';
+ case Phone::TYPE_MOBILE:
+ return $short ? 'Mob' : 'Mobile';
+ default:
+ return $this->type;
+ }
+ }
+
+ /** Returns true if this phone's link matches the flags.
+ */
+ public function hasLink($flags)
+ {
+ $flags = $flags & Profile::PHONE_LINK_ANY;
+ return (
+ ($flags == Profile::PHONE_LINK_ANY)
+ ||
+ (($flags & Profile::PHONE_LINK_COMPANY) && $this->link_type == self::LINK_COMPANY)
+ ||
+ (($flags & Profile::PHONE_LINK_JOB) && $this->link_type == self::LINK_JOB)
+ ||
+ (($flags & Profile::PHONE_LINK_ADDRESS) && $this->link_type == self::LINK_ADDRESS)
+ ||
+ (($flags & Profile::PHONE_LINK_PROFILE) && $this->link_type == self::LINK_PROFILE)
+ );
+ }
+
+ /* Properly formats the search phone, based on actual display phone.
+ *
+ * Computes a base form of the phone number with the international prefix.
+ * This number only contains digits, thus does not begin with the '+' sign.
+ * Numbers starting with 0 (or '(0)') are considered as French.
+ * This assumes that non-French numbers have their international prefix.
+ */
+ private function formatSearch()
+ {
+ $tel = trim($this->display);
+ // Number starting with "(0)" is a French number.
+ if (substr($tel, 0, 3) === '(0)') {
+ $tel = '33' . $tel;
+ }
+ // Removes all "(0)" often used as local prefix.
+ $tel = str_replace('(0)', '', $tel);
+ // Removes all non-digit chars.
+ $tel = preg_replace('/[^0-9]/', '', $tel);
+
+ if (substr($tel, 0, 2) === '00') {
+ // Removes prefix for international calls.
+ $tel = substr($tel, 2);
+ } else if (substr($tel, 0, 1) === '0') {
+ // Number starting with 0 is a French number.
+ $tel = '33' . substr($tel, 1);
+ }
+ $this->search = $tel;
+ }
+
+ // Properly formats the display phone, it requires the search phone to be already formatted.
+ private function formatDisplay($format = array())
+ {
+ $tel = $this->search;
+ $ret = '';
+ $telLength = strlen($tel);
+ // Try to find the country by trying to find a matching prefix of 1, 2 or 3 digits.
+ 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 = {?}
+ LIMIT 1',
+ substr($tel, 0, 1), substr($tel, 0, 2), substr($tel, 0, 3));
+ if ($res->numRows() == 0) {
+ // No country found, does not format more than prepending a '+' sign.
+ $this->error = true;
+ $this->display = '+' . $tel;
+ return;
+ }
+ $format = $res->fetchOneAssoc();
+ }
+ if ($format['format'] == '') {
+ // If the country does not have a phone number format, the number will be displayed
+ // as "+prefix ## ## ## ##...".
+ $format['format'] = '+p';
+ }
+
+ /* Formats the phone number according t the template with these rules:
+ * - p is replaced by the international prefix,
+ * - # is replaced by one digit,
+ * - other chars are left intact.
+ * If the number is longer than the format, remaining digits are
+ * appended by blocks of two digits separated by spaces.
+ * The last block can have 3 digits to avoid a final single-digit block.
+ */
+ $j = 0;
+ $i = strlen($format['phoneprf']);
+ $lengthFormat = strlen($format['format']);
+ while (($i < $telLength) && ($j < $lengthFormat)) {
+ if ($format['format'][$j] == '#') {
+ $ret .= $tel[$i];
+ ++$i;
+ } else if ($format['format'][$j] == 'p') {
+ $ret .= $format['phoneprf'];
+ } else {
+ $ret .= $format['format'][$j];
+ }
+ ++$j;
+ }
+ for (; $i < $telLength - 1; $i += 2) {
+ $ret .= ' ' . substr($tel, $i, 2);
+ }
+ // Appends last left alone numbers to the last block.
+ if ($i < $telLength) {
+ $ret .= substr($tel, $i);
+ }
+ $this->display = $ret;
+ }
+
+
+ public function format($format = array())
+ {
+ if (!($this->type == Phone::TYPE_FIXED
+ || $this->type == Phone::TYPE_MOBILE
+ || $this->type == Phone::TYPE_FAX)) {
+ $this->type = Phone::TYPE_FIXED;
+ }
+ $this->formatSearch();
+ $this->formatDisplay($format);
+ return !$this->error;
+ }
+
+ public function toFormArray()
+ {
+ return array(
+ 'type' => $this->type,
+ 'display' => $this->display,
+ 'pub' => $this->pub,
+ 'comment' => $this->comment,
+ 'error' => $this->error
+ );
+ }
+
+ private function toString()
+ {
+ return 'type : ' . $this->type .', numéro : ' . $this->display
+ . ', commentaire : « ' . $this->comment . ' », affichage : ' . $this->pub;
+ }
+
+ private function isEmpty()
+ {
+ return (!$this->search || $this->search == '');
+ }
+
+ public function save()
+ {
+ $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 ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})',
+ $this->pid, $this->link_type, $this->link_id, $this->id, $this->type,
+ $this->search, $this->display, $this->pub, $this->comment);
+ }
+ }
+
+ static public function deletePhones($pid, $link_type, $link_id = null)
+ {
+ $where = '';
+ if (!is_null($link_id)) {
+ $where = XDB::format(' AND link_id = {?}', $link_id);
+ }
+ XDB::execute('DELETE FROM profile_phones
+ WHERE pid = {?} AND link_type = {?}' . $where,
+ $pid, $link_type);
+ }
+
+ /** Saves phones into the database.
+ * @param $data: an array of form formatted phones.
+ * @param $pid, $link_type, $link_id: pid, link_type and link_id concerned by the update.
+ */
+ static public function savePhones(array $data, $pid, $link_type, $link_id = null)
+ {
+ foreach ($data as $id => $value) {
+ $value['id'] = $id;
+ if (!is_null($pid)) {
+ $value['pid'] = $pid ;
+ }
+ if (!is_null($link_type)) {
+ $value['link_type'] = $link_type ;
+ }
+ if (!is_null($link_id)) {
+ $value['link_id'] = $link_id ;
+ }
+ $phone = new Phone($value);
+ $phone->save();
+ }
+ }
+
+ static private function formArrayWalk(array $data, $function, &$success = true, $requiresEmptyPhone = false)
+ {
+ $phones = array();
+ foreach ($data as $item) {
+ $phone = new Phone($item);
+ $success = ($phone->format() && $success);
+ if (!$phone->isEmpty()) {
+ $phones[] = call_user_func(array($phone, $function));
+ }
+ }
+ if (count($phones) == 0 && $requiresEmptyPhone) {
+ $phone = new Phone();
+ $phones[] = call_user_func(array($phone, $function));
+ }
+ return $phones;
+ }
+
+ // Formats an array of form phones into an array of form formatted phones.
+ static public function formatFormArray(array $data, &$success = true)
+ {
+ return self::formArrayWalk($data, 'toFormArray', $success, true);
+ }
+
+ static public function formArrayToString(array $data)
+ {
+ return implode(' ; ', self::formArrayWalk($data, 'toString'));
+ }
+
+ static public function iterate(array $pids = array(), array $link_types = array(),
+ array $link_ids = array(), array $pubs = array())
+ {
+ return new PhoneIterator($pids, $link_types, $link_ids, $pubs);
+ }
+}
+
+/** Iterator over a set of Phones
+ *
+ * @param $pid, $link_type, $link_id, $pub
+ *
+ * The iterator contains the phones that correspond to the value stored in the
+ * parameters' arrays.
+ */
+class PhoneIterator implements PlIterator
+{
+ private $dbiter;
+
+ public function __construct(array $pids, array $link_types, array $link_ids, array $pubs)
+ {
+ $where = array();
+ if (count($pids) != 0) {
+ $where[] = XDB::format('(pid IN {?})', $pids);
+ }
+ if (count($link_types) != 0) {
+ $where[] = XDB::format('(link_type IN {?})', $link_types);
+ }
+ if (count($link_ids) != 0) {
+ $where[] = XDB::format('(link_id IN {?})', $link_ids);
+ }
+ if (count($pubs) != 0) {
+ $where[] = XDB::format('(pub IN {?})', $pubs);
+ }
+ $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
+ WHERE ' . implode(' AND ', $where) . '
+ ORDER BY link_id, tel_id';
+ $this->dbiter = XDB::iterator($sql);
+ }
+
+ public function next()
+ {
+ if (is_null($this->dbiter)) {
+ return null;
+ }
+ $data = $this->dbiter->next();
+ if (is_null($data)) {
+ return null;
+ }
+ return new Phone($data);
+ }
+
+ public function total()
+ {
+ return $this->dbiter->total();
+ }
+
+ public function first()
+ {
+ return $this->dbiter->first();
+ }
+
+ public function last()
+ {
+ return $this->dbiter->last();
+ }
+
+ public function value()
+ {
+ return $this->dbiter;
+ }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
public function __construct($number, $num_type = self::NUM_ANY, $phone_type = self::PHONE_ANY)
{
- require_once('profil.func.inc.php');
- $this->number = $number;
+ $phone = new Phone('display' => $number);
+ $phone->format();
+ $this->number = $phone->search();
$this->num_type = $num_type;
- $this->phone_type = format_phone_number($phone_type);
+ $this->phone_type = $phone_type;
}
public function buildCondition(PlFilter &$uf)
$('#' + id).find('div.titre').html('N°' + i);
$('#' + id).find('a.removeTel').attr('href', 'javascript:removeTel(\'' + prefname + '\',\'' + prefid + '\',' + telid + ')');
$('#' + id).find('select').attr('name', telpref + '[type]');
- $('#' + id).find("[name='" + telprefOld + "[tel]']").attr('name', telpref + '[tel]');
+ $('#' + id).find("[name='" + telprefOld + "[display]']").attr('name', telpref + '[display]');
$('#' + id).find("[name='" + telprefOld + "[comment]']").attr('name', telpref + '[comment]');
$('#' + id).find('a.removePhoneComment').attr('href', 'javascript:removePhoneComment(' + id + ',' + telpref + ')');
$('#' + id).find('#' + idOld + '_addComment').attr('id', id + '_addComment');
+++ /dev/null
-<?php
-/***************************************************************************
- * Copyright (C) 2003-2010 Polytechnique.org *
- * http://opensource.polytechnique.org/ *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the Free Software *
- * Foundation, Inc., *
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
- ***************************************************************************/
-
-function format_phone_number($tel)
-{
- $tel = trim($tel);
- if (substr($tel, 0, 3) === '(0)') {
- $tel = '33' . $tel;
- }
- $tel = preg_replace('/\(0\)/', '', $tel);
- $tel = preg_replace('/[^0-9]/', '', $tel);
- if (substr($tel, 0, 2) === '00') {
- $tel = substr($tel, 2);
- } else if(substr($tel, 0, 1) === '0') {
- $tel = '33' . substr($tel, 1);
- }
- return $tel;
-}
-
-function format_display_number($tel, &$error, $format = array('format'=>'','phoneprf'=>''))
-{
- $error = false;
- $ret = '';
- $tel_length = strlen($tel);
- 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 = {?}
- LIMIT 1",
- substr($tel, 0, 1), substr($tel, 0, 2), substr($tel, 0, 3));
- if ($res->numRows() == 0) {
- $error = true;
- return '+' . $tel;
- }
- $format = $res->fetchOneAssoc();
- }
- if ($format['format'] == '') {
- $format['format'] = '+p';
- }
- $j = 0;
- $i = strlen($format['phoneprf']);
- $length_format = strlen($format['format']);
- while (($i < $tel_length) && ($j < $length_format)){
- if ($format['format'][$j] == '#'){
- $ret .= $tel[$i];
- $i++;
- } else if ($format['format'][$j] == 'p') {
- $ret .= $format['phoneprf'];
- } else {
- $ret .= $format['format'][$j];
- }
- $j++;
- }
- for (; $i < $tel_length - 1; $i += 2) {
- $ret .= ' ' . substr($tel, $i, 2);
- }
- //appends last alone number to the last block
- if ($i < $tel_length) {
- $ret .= substr($tel, $i);
- }
- return $ret;
-}
-
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
-?>
}
// }}}
-// {{{ class Phone
-class Phone
-{
- const TYPE_FAX = 'fax';
- const TYPE_FIXED = 'fixed';
- const TYPE_MOBILE = 'mobile';
- public $type;
-
- public $search;
- public $display;
- public $comment = '';
-
- const LINK_JOB = 'pro';
- const LINK_ADDRESS = 'address';
- const LINK_PROFILE = 'user';
- const LINK_COMPANY = 'hq';
- public $link_type;
- public $link_id;
-
- public $id;
-
- /** Fields are :
- * $type, $search, $display, $link_type, $link_id, $comment, $pid, $id
- */
- public function __construct($data)
- {
- foreach ($data as $key => $val) {
- $this->$key = $val;
- }
- }
-
- /** Returns the unique ID of a phone
- * This ID will allow to link it to an address, a user or a job
- * The format is address_addressId_phoneId (where phoneId is the id
- * of the phone in the list of those associated with the address)
- */
- public function uid() {
- return $this->link_type . '_' . $this->link_id . '_' . $this->id;
- }
-
- public function hasFlags($flags) {
- return $this->hasType($flags) && $this->hasLink($flags);
- }
-
- /** Returns true if this phone's type matches the flags
- */
- public function hasType($flags) {
- $flags = $flags & Profile::PHONE_TYPE_ANY;
- return (
- ($flags == Profile::PHONE_TYPE_ANY)
- ||
- (($flags & Profile::PHONE_TYPE_FAX) && $this->type == self::TYPE_FAX)
- ||
- (($flags & Profile::PHONE_TYPE_FIXED) && $this->type == self::TYPE_FIXED)
- ||
- (($flags & Profile::PHONE_TYPE_MOBILE) && $this->type == self::TYPE_MOBILE)
- );
- }
-
- /** User accessible version of the type
- */
- public function displayType($short = false)
- {
- switch ($this->type) {
- case Phone::TYPE_FIXED:
- return $short ? 'Tél' : 'Fixe';
- case Phone::TYPE_FAX:
- return 'Fax';
- case Phone::TYPE_MOBILE:
- return $short ? 'Mob' : 'Mobile';
- default:
- return $this->type;
- }
- }
-
- /** Returns true if this phone's link matches the flags
- */
- public function hasLink($flags) {
- $flags = $flags & Profile::PHONE_LINK_ANY;
- return (
- ($flags == Profile::PHONE_LINK_ANY)
- ||
- (($flags & Profile::PHONE_LINK_COMPANY) && $this->link_type == self::LINK_COMPANY)
- ||
- (($flags & Profile::PHONE_LINK_JOB) && $this->link_type == self::LINK_JOB)
- ||
- (($flags & Profile::PHONE_LINK_ADDRESS) && $this->link_type == self::LINK_ADDRESS)
- ||
- (($flags & Profile::PHONE_LINK_PROFILE) && $this->link_type == self::LINK_PROFILE)
- );
- }
-}
-// }}}
// {{{ class Company
class Company
{
public function setPhone(Phone &$phone)
{
- if ($phone->link_type == Phone::LINK_COMPANY && $phone->link_id == $this->id) {
+ if ($phone->linkType() == Phone::LINK_COMPANY && $phone->linkId() == $this->id) {
$this->phone = $phone;
}
}
public function addPhone(Phone &$phone)
{
- if ($phone->link_type == Phone::LINK_JOB && $phone->link_id == $this->id && $phone->pid == $this->pid) {
- $this->phones[$phone->uid()] = $phone;
+ if ($phone->linkType() == Phone::LINK_JOB && $phone->linkId() == $this->id && $phone->pid() == $this->pid) {
+ $this->phones[$phone->uniqueId()] = $phone;
}
}
public function addPhone(Phone &$phone)
{
if (
- $phone->link_type == Phone::LINK_ADDRESS && $phone->link_id == $this->id &&
- ($this->link_type == self::LINK_COMPANY || $phone->pid == $this->pid) ) {
- $this->phones[$phone->uid()] = $phone;
+ $phone->linkType() == Phone::LINK_ADDRESS && $phone->linkId() == $this->id &&
+ ($this->link_type == self::LINK_COMPANY || $phone->pid() == $this->pid) ) {
+ $this->phones[$phone->uniqueId()] = $phone;
}
}
* 3) attach addresses to jobs and profiles
*/
-// {{{ Database schema (profile_address, profile_phones, profile_jobs)
+// {{{ Database schema (profile_address, profile_jobs)
/** The database for this is very unclear, so here is a little schema :
* profile_job describes a Job, links to:
* - a Profile, through `pid`
* with that of the row of profile_job for the related job)
* - `id` is the id of the job to which we refer (i.e `profile_job.id`)
*
- * profile_phone describes a Phone, which can be related to an Address,
- * a Job, a Profile or a Company:
- * - for a Profile:
- * - `link_type` is set to 'user'
- * - `link_id` is set to 0
- * - `pid` is set to the id of the related Profile
- *
- * - for a Company:
- * - `link_type` is set to 'hq'
- * - `link_id` is set to the id of the related Company
- * - `pid` is set to 0
- *
- * - for an Address (this is only possible for a *personal* address)
- * - `link_type` is set to 'address'
- * - `link_id` is set to the related Address `id`
- * - `pid` is set to the related Address `pid`
- *
- * - for a Job:
- * - `link_type` is set to 'pro'
- * - `link_id` is set to the related Job `id` (not `jobid`)
- * - `pid` is set to the related Job `pid`
- *
+ * For the documentation of the phone table, please see classes/phone.php.
*
* The possible relations are as follow:
* An Address can be linked to a Company, a Profile, a Job
* A Job is linked to a Company and a Profile
- * A Phone can be linked to a Company, a Profile, a Job, or a Profile-related Address
*/
// }}}
{
$p = $phones->get(Profile::PHONE_LINK_ADDRESS | Profile::PHONE_TYPE_ANY);
foreach ($p as $phone) {
- if ($phone->link_type == Phone::LINK_ADDRESS && array_key_exists($phone->link_id, $this->addresses)) {
- $this->addresses[$phone->link_id]->addPhone($phone);
+ if ($phone->linkType() == Phone::LINK_ADDRESS && array_key_exists($phone->linkId(), $this->addresses)) {
+ $this->addresses[$phone->linkId()]->addPhone($phone);
}
}
}
public static function fetchData(array $pids, ProfileVisibility $visibility)
{
- $data = XDB::iterator('SELECT tel_type AS type, search_tel AS search, display_tel AS display, link_type, comment, pid, link_id, tel_id AS id
- FROM profile_phones
- WHERE pid IN {?} AND pub IN {?}
- ORDER BY ' . XDB::formatCustomOrder('pid', $pids),
- $pids, $visibility->levels());
- return PlIteratorUtils::subIterator($data, PlIteratorUtils::arrayValueCallback('pid'));
+ $it = Phone::iterate($pids, array(), array(), $visibility->levels());
+ return PlIteratorUtils::subIterator($it->value(), PlIteratorUtils::arrayValueCallback('pid'));
}
}
// }}}
{
$p = $phones->get(Profile::PHONE_LINK_JOB | Profile::PHONE_TYPE_ANY);
foreach ($p as $phone) {
- if ($phone->link_type == Phone::LINK_JOB && array_key_exists($phone->link_id, $this->jobs)) {
- $this->jobs[$phone->link_id]->addPhone($phone);
+ if ($phone->linkType() == Phone::LINK_JOB && array_key_exists($phone->linkId(), $this->jobs)) {
+ $this->jobs[$phone->linkId()]->addPhone($phone);
}
}
}
// Add phones to hq
if (count($newcompanies)) {
- $it = XDB::iterator('SELECT search_tel AS search, display_tel AS display, comment, link_id, tel_type AS type, link_type, tel_id AS id
- FROM profile_phones
- WHERE link_id IN {?} AND link_type = \'hq\'',
- $newcompanies);
- while ($row = $it->next()) {
- $p = new Phone($row);
- self::$companies[$row['link_id']]->setPhone($p);
+ $it = Phone::iterate(array(), array(Phone::LINK_COMPANY), $newcompanies);
+ while ($phone = $it->next()) {
+ self::$companies[$phone->linkId()]->setPhone($phone);
}
}
public function commit()
{
- // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
+ // TODO: use address update profile_job_enum once it is done.
$res = XDB::query('SELECT id
FROM profile_job_enum
WHERE name = {?}',
$this->name);
if ($res->numRows() != 1) {
- require_once 'profil.func.inc.php';
require_once 'geocoding.inc.php';
XDB::execute('INSERT INTO profile_job_enum (name, acronym, url, email, holdingid, NAF_code, AX_code)
$this->holdingid, $this->NAF_code, $this->AX_code);
$jobid = XDB::insertId();
- $display_tel = format_display_number($this->tel, $error_tel);
- $display_fax = format_display_number($this->fax, $error_fax);
- XDB::execute("INSERT INTO profile_phones (pid, link_type, link_id, tel_id, tel_type,
- search_tel, display_tel, pub)
- VALUES ({?}, 'hq', 0, 0, 'fixed', {?}, {?}, 'public'),
- ({?}, 'hq', 0, 1, 'fax', {?}, {?}, 'public')",
- $jobid, format_phone_number($this->tel), $display_tel,
- $jobid, format_phone_number($this->fax), $display_fax);
+ $phone = new Phone(array('link_type' => 'hq', 'link_id' => $jobid, 'id' => 0,
+ 'type' => 'fixed', 'display' => $this->tel, 'pub' => 'public'));
+ $fax = new Phone(array('link_type' => 'hq', 'link_id' => $jobid, 'id' => 1,
+ 'type' => 'fax', 'display' => $this->fax, 'pub' => 'public'));
+ $phone->save();
+ $fax->save();
$gmapsGeocoder = new GMapsGeocoder();
$address = $gmapsGeocoder->getGeocodedAddress($this->address);
}
if (Env::has('edit')) {
- // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
+ // TODO: use address class to update profile_job_enum once it is done.
S::assert_xsrf_token();
$selectedJob = Env::has('selectedJob');
- XDB::execute("DELETE FROM profile_phones
- WHERE pid = {?} AND link_type = 'hq'",
- $id);
+ Phone::deletePhones(0, Phone::LINK_COMPANY, $id);
XDB::execute("DELETE FROM profile_addresses
WHERE jobid = {?} AND type = 'hq'",
$id);
$page->trigSuccess("L'entreprise a bien été remplacée.");
} else {
- require_once 'profil.func.inc.php';
require_once 'geocoding.inc.php';
- $display_tel = format_display_number(Env::v('tel'), $error_tel);
- $display_fax = format_display_number(Env::v('fax'), $error_fax);
$gmapsGeocoder = new GMapsGeocoder();
$address = array('text' => Env::t('address'));
$address = $gmapsGeocoder->getGeocodedAddress($address);
Env::t('name'), Env::t('acronym'), Env::t('url'), Env::t('email'),
Env::t('NAF_code'), Env::i('AX_code'), Env::i('holdingId'), $id);
- XDB::execute("INSERT INTO profile_phones (pid, link_type, link_id, tel_id, tel_type,
- search_tel, display_tel, pub)
- VALUES ({?}, 'hq', 0, 0, 'fixed', {?}, {?}, 'public'),
- ({?}, 'hq', 0, 1, 'fax', {?}, {?}, 'public')",
- $id, format_phone_number(Env::v('tel')), $display_tel,
- $id, format_phone_number(Env::v('fax')), $display_fax);
+ $phone = new Phone(array('display' => Env::v('tel'), 'link_id' => $id, 'id' => 0, 'type' => 'fixed',
+ 'link_type' => Phone::LINK_COMPANY, 'pub' => 'public'));
+ $fax = new Phone(array('display' => Env::v('fax'), 'link_id' => $id, 'id' => 1, 'type' => 'fax',
+ 'link_type' => Phone::LINK_COMPANY, 'pub' => 'public'));
+ $phone->save();
+ $fax->save();
XDB::execute("INSERT INTO profile_addresses (jobid, type, id, accuracy,
text, postalText, postalCode, localityId,
{
global $globals;
- require_once 'profil.func.inc.php' ;
$this->load('money.inc.php');
if (!empty($GLOBALS['IS_XNET_SITE'])) {
private function cleanAddress(ProfilePage &$page, $addrid, array &$address)
{
- if (!isset($address['tel'])) {
- $address['tel'] = array();
- }
- $profiletel = new ProfileSettingPhones('address', $addrid);
- $address['tel'] = $profiletel->value($page, 'tel', $address['tel'], $s);
+ $address['tel'] = Phone::formatFormArray($address['tel'], $s);
$address['current'] = $this->bool->value($page, 'current', $address['current'], $s);
$address['temporary'] = $this->bool->value($page, 'temporary', $address['temporary'], $s);
$address['secondary'] = $this->bool->value($page, 'secondary', $address['secondary'], $s);
XDB::execute("DELETE FROM profile_addresses
WHERE pid = {?} AND type = 'home'",
$page->pid());
- XDB::execute("DELETE FROM profile_phones
- WHERE pid = {?} AND link_type = 'address'",
- $page->pid());
+ Phone::deletePhones($page->pid(), Phone::LINK_ADDRESS);
foreach ($value as $addrid => &$address) {
$this->saveAddress($page->pid(), $addrid, $address, 'home');
- $profiletel = new ProfileSettingPhones('address', $addrid);
- $profiletel->saveTels($page->pid(), 'tel', $address['tel']);
+ Phone::savePhones($address['tel'], $page->pid(), Phone::LINK_ADDRESS, $addrid);
}
}
public function getText($value) {
$addresses = array();
foreach ($value as $addrid => $address) {
- $phones = new ProfileSettingPhones('address', $addrid);
+ $phones = Phone::formArrayToString($address['tel']);
$addresses[] = 'Adresse : ' . $address['text'] . ', affichage : ' . $address['pub']
. ', commentaire : ' . $address['comment'] . ', actuelle : ' . ($address['current'] ? 'oui' : 'non')
. ', temporaire : ' . ($address['temporary'] ? 'oui' : 'non') . ', secondaire : '
. ($address['secondary'] ? 'oui' : 'non') . ', conctactable par courier : '
- . ($address['mail'] ? 'oui' : 'non') . ', ' . $phones->getText($address['tel']);
+ . ($address['mail'] ? 'oui' : 'non') . ($phones ? ', ' . $phones : '');
}
return implode(' ; ' , $addresses);
}
$this->values['addresses'] = $res->fetchAllAssoc();
}
- $res = XDB::iterator("SELECT link_id AS addrid, tel_type AS type, pub, display_tel AS tel, comment
- FROM profile_phones
- WHERE pid = {?} AND link_type = 'address'
- ORDER BY link_id",
- $this->pid());
- $i = 0;
- $adrNb = count($this->values['addresses']);
- while ($tel = $res->next()) {
- $addrid = $tel['addrid'];
- unset($tel['addrid']);
- while ($i < $adrNb && $this->values['addresses'][$i]['id'] < $addrid) {
- $i++;
- }
- if ($i >= $adrNb) {
- break;
- }
- $address =& $this->values['addresses'][$i];
- if (!isset($address['tel'])) {
- $address['tel'] = array();
- }
- if ($address['id'] == $addrid) {
- $address['tel'][] = $tel;
- }
+ // Adds phones to addresses.
+ $it = Phone::iterate(array($this->pid()), array(Phone::LINK_ADDRESS));
+ while ($phone = $it->next()) {
+ $this->values['addresses'][$phone->linkId()]['tel'][$phone->id()] = $phone->toFormArray();
}
+
+ // Properly formats addresses.
foreach ($this->values['addresses'] as $id => &$address) {
+ $phone = new Phone();
if (!isset($address['tel'])) {
- $address['tel'] = array(
- 0 => array(
- 'type' => 'fixed',
- 'tel' => '',
- 'pub' => 'private',
- 'comment' => '',
- )
- );
+ $address['tel'] = array(0 => $phone->toFormArray());
}
unset($address['id']);
$address['changed'] = 0;
$address['removed'] = 0;
}
+ //var_dump($this->values['addresses']['tel']);
}
}
$this->settings['email_directory_new']
= new ProfileSettingEmailDirectory();
$this->settings['networking'] = new ProfileSettingNetworking();
- $this->settings['tels'] = new ProfileSettingPhones('user', 0);
+ $this->settings['tels'] = new ProfileSettingPhones();
$this->settings['edus'] = new ProfileSettingEdu();
$this->settings['promo'] = new ProfileSettingPromo();
$this->watched= array('freetext' => true, 'tels' => true,
{
// Checkout all data...
$res = XDB::query("SELECT p.nationality1, p.nationality2, p.nationality3, p.birthdate,
- pp.display_tel as mobile, pp.pub as mobile_pub,
p.email_directory as email_directory, pd.promo AS promo_display,
p.freetext, p.freetext_pub, p.ax_id AS matricule_ax, pd.yourself
FROM profiles AS p
INNER JOIN profile_display AS pd ON (pd.pid = p.pid)
- LEFT JOIN profile_phones AS pp ON (pp.pid = p.pid AND link_type = 'user')
WHERE p.pid = {?}", $this->pid());
$this->values = $res->fetchOneAssoc();
'changed' => '0',
'removed' => '0',
),
- 'hq_phone' => '',
+ 'hq_fixed' => '',
'hq_fax' => '',
'subSubSectorName' => null,
'sector' => '0',
}
}
$job['w_address']['pub'] = $this->pub->value($page, 'address_pub', $job['w_address']['pub'], $s);
- if (!isset($job['w_phone'])) {
- $job['w_phone'] = array();
- }
- $profiletel = new ProfileSettingPhones('pro', $jobid);
- $job['w_phone'] = $profiletel->value($page, 'tel', $job['w_phone'], $s);
+ $job['w_phone'] = Phone::formatFormArray($job['w_phone'], $s);
unset($job['removed']);
unset($job['new']);
public function save(ProfilePage &$page, $field, $value)
{
- // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
-
- require_once 'profil.func.inc.php';
-
+ // TODO: use address class to update profile_job_enum once it is done.
XDB::execute("DELETE FROM profile_job
WHERE pid = {?}",
$page->pid());
XDB::execute("DELETE FROM profile_addresses
WHERE pid = {?} AND type = 'job'",
$page->pid());
- XDB::execute("DELETE FROM profile_phones
- WHERE pid = {?} AND link_type = 'pro'",
- $page->pid());
+ Phone::deletePhones($page->pid(), Phone::LINK_JOB);
foreach ($value as $id => &$job) {
if (isset($job['name']) && $job['name']) {
if (isset($job['jobid']) && $job['jobid']) {
}
$address = new ProfileSettingAddress();
$address->saveAddress($page->pid(), $id, $job['w_address'], 'job');
- $profiletel = new ProfileSettingPhones('pro', $id);
- $profiletel->saveTels($page->pid(), 'tel', $job['w_phone']);
+ Phone::savePhones($job['w_phone'], $page->pid(), Phone::LINK_JOB, $id);
}
}
}
$jobs = array();
foreach ($value as $id => $job) {
$address = new ProfileSettingAddress();
- $phones = new ProfileSettingPhones('pro', $id);
+ $phones = Phone::formArrayToString($job['w_phone']);
$jobs[] = 'Entreprise : ' . $job['name'] . ', secteur : ' . $job['subSubSectorName']
. ', description : ' . $job['description'] . ', web : ' . $job['w_url']
. ', email : ' . $job['w_email']
- . ', ' . $phones->getText($job['w_phone']) . ', ' . $address->getText($job['w_address']);
+ . ($phones ? ', ' . $phones : '') . ', ' . $address->getText($job['w_address']);
}
return implode(' ; ' , $jobs);
}
);
}
- $res = XDB::iterator("SELECT link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment
- FROM profile_phones
- WHERE pid = {?} AND link_type = 'pro'
- ORDER BY link_id",
- $this->pid());
- $i = 0;
- $jobNb = count($this->values['jobs']);
- while ($phone = $res->next()) {
- $jobid = $phone['jobid'];
- while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) {
- $i++;
- }
- if ($i >= $jobNb) {
- break;
- }
- $job =& $this->values['jobs'][$i];
- if (!isset($job['w_phone'])) {
- $job['w_phone'] = array();
- }
- if ($job['id'] == $jobid) {
- $job['w_phone'][] = $phone;
- }
+ $it = Phone::iterate(array($this->pid()), array(Phone::LINK_JOB));
+ while ($phone = $it->next()) {
+ $this->values['jobs'][$phone->linkId()]['w_phone'][$phone->id()] = $phone->toFormArray();
}
foreach ($this->values['jobs'] as $id => &$job) {
+ $phone = new Phone();
if (!isset($job['w_phone'])) {
- $job['w_phone'] = array(
- 0 => array(
- 'type' => 'fixed',
- 'tel' => '',
- 'pub' => 'private',
- 'comment' => '',
- )
- );
+ $job['w_phone'] = array(0 => $phone->toFormArray());
}
}
$job['w_email_new'] = '';
- if (!isset($job['hq_phone'])) {
- $job['hq_phone'] = '';
+ if (!isset($job['hq_fixed'])) {
+ $job['hq_fixed'] = '';
}
if (!isset($job['hq_fax'])) {
$job['hq_fax'] = '';
}
}
-
-class ProfileSettingTel extends ProfileNoSave
-{
- public function value(ProfilePage &$page, $field, $value, &$success)
- {
- if (is_null($value)) {
- return isset($page->values[$field]) ? $page->values[$field] : S::v($field);
- }
- require_once('profil.func.inc.php');
- $value = format_phone_number($value);
- if($value == '') {
- $success = true;
- return $value;
- }
- $value = format_display_number($value,$error);
- $success = !$error;
- if (!$success) {
- Platal::page()->trigError('Le préfixe international du numéro de téléphone est inconnu. ');
- }
- return $value;
- }
-}
-
class ProfileSettingPhones implements ProfileSetting
{
- private $tel;
- private $pub;
- protected $link_type;
- protected $link_id;
-
- public function __construct($type, $link_id)
- {
- $this->tel = new ProfileSettingTel();
- $this->pub = new ProfileSettingPub();
- $this->link_type = $type;
- $this->link_id = $link_id;
- }
-
public function value(ProfilePage &$page, $field, $value, &$success)
{
$success = true;
- if (is_null($value)) {
- $value = array();
- $res = XDB::iterator('SELECT display_tel AS tel, tel_type AS type, pub, comment
- FROM profile_phones
- WHERE pid = {?} AND link_type = {?}
- ORDER BY tel_id',
- $page->pid(), $this->link_type);
- if ($res->numRows() > 0) {
- $value = $res->fetchAllAssoc();
- } else {
- $value = array(
- 0 => array(
- 'type' => 'fixed',
- 'tel' => '',
- 'pub' => 'private',
- 'comment' => '',
- )
- );
- }
- }
+ $phones = array();
- foreach ($value as $key=>&$phone) {
- $phone['pub'] = $this->pub->value($page, 'pub', $phone['pub'], $s);
- $phone['tel'] = $this->tel->value($page, 'tel', $phone['tel'], $s);
- if(!isset($phone['type']) || ($phone['type'] != 'fixed' && $phone['type'] != 'mobile' && $phone['type'] != 'fax')) {
- $phone['type'] = 'fixed';
- $s = false;
- }
- if (!$s) {
- $phone['error'] = true;
- $success = false;
+ if (is_null($value)) {
+ $it = Phone::iterate(array($page->pid()), array(Phone::LINK_PROFILE), array(0));
+ while ($phone = $it->next()) {
+ $success = ($phone->format() && $success);
+ $phones[] = $phone->toFormArray();
}
- if (!isset($phone['comment'])) {
- $phone['comment'] = '';
+ if (count($phones) == 0) {
+ $phone = new Phone();
+ $phones[] = $phone->toFormArray();
}
+ return $phones;
}
- return $value;
- }
-
- private function saveTel($pid, $telid, array &$phone)
- {
- if ($phone['tel'] != '') {
- XDB::execute("INSERT INTO profile_phones (pid, link_type, link_id, tel_id, tel_type,
- search_tel, display_tel, pub, comment)
- VALUES ({?}, {?}, {?}, {?}, {?},
- {?}, {?}, {?}, {?})",
- $pid, $this->link_type, $this->link_id, $telid, $phone['type'],
- format_phone_number($phone['tel']), $phone['tel'], $phone['pub'], $phone['comment']);
- }
+ return Phone::formatFormArray($value, $success);
}
public function save(ProfilePage &$page, $field, $value)
{
- XDB::execute("DELETE FROM profile_phones
- WHERE pid = {?} AND link_type = {?} AND link_id = {?}",
- $page->pid(), $this->link_type, $this->link_id);
- $this->saveTels($page->pid(), $field, $value);
- }
-
- //Only saves phones without a delete operation
- public function saveTels($pid, $field, $value)
- {
- foreach ($value as $telid=>&$phone) {
- $this->saveTel($pid, $telid, $phone);
- }
+ Phone::deletePhones($page->pid(), Phone::LINK_PROFILE);
+ Phone::savePhones($value, $page->pid(), Phone::LINK_PROFILE);
}
public function getText($value) {
- $phones = array();
- foreach ($value as $phone) {
- if ($phone['tel'] != '') {
- $phones[] = 'type : ' . $phone['type'] .', numéro : ' . $phone['tel']
- . ', commentaire : « ' . $phone['comment'] . ' », affichage : ' . $phone['pub'];
- }
- }
- return implode(' ; ' , $phones);
+ return Phone::formArrayToString($value);
}
}
{/if}
{if $vcard.tels}
{foreach item=tel from=$vcard.tels}
-{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.tel|vcard_enc}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.display|vcard_enc}
{/foreach}
{/if}
{if $vcard.adr_pro}
{/if}
{if $vcard.adr_pro[0].tels}
{foreach item=tel from=$vcard.adr_pro[0].tels}
-{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,work{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=work{/if}:{$tel.tel|vcard_enc}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,work{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=work{/if}:{$tel.display|vcard_enc}
{/foreach}
{/if}
ADR;TYPE=work:{format_adr adr=$vcard.adr_pro[0]}
ADR;TYPE=home{if $adr.courier},postal{/if}:{format_adr adr=$adr}
{if $adr.tels}
{foreach item=tel from=$adr.tels}
-{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,home{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.tel|vcard_enc}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,home{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.display|vcard_enc}
{/foreach}
{/if}
{/foreach}
<td class="titre">Téléphone</td>
<td>
<input type="text" maxlength="28" {if $job.hq_tel_error}class="error"{/if}
- name="{$jobpref}[hq_phone]" value="{$job.hq_phone}" />
+ name="{$jobpref}[hq_fixed]" value="{$job.hq_fixed}" />
</td>
</tr>
<tr class="{$entreprise}" style="display: none">
<option value="mobile"{if $tel.type eq 'mobile'} selected="selected"{/if}>Mobile</option>
<option value="fax"{if $tel.type eq 'fax'} selected="selected"{/if}>Fax</option>
</select>
- <input type="text" size="19" maxlength="28" name="{$telpref}[tel]" {if $tel.error}class="error"{/if} value="{$tel.tel}" />
+ <input type="text" size="19" maxlength="28" name="{$telpref}[display]" {if $tel.error}class="error"{/if} value="{$tel.display}" />
<a class="removeTel" href="javascript:removeTel('{$prefname}','{$prefid}','{$telid}')">
{icon name=cross title="Supprimer ce numéro de téléphone"}
</a>
--- /dev/null
+ALTER TABLE profile_phones MODIFY COLUMN pid INT(6) NOT NULL DEFAULT 0;
+ALTER TABLE profile_phones MODIFY COLUMN link_id INT(6) NOT NULL DEFAULT 0;
+
+-- vim:set syntax=mysql: