Improves email combobox (Closes #1110).
authorStéphane Jacob <sj@m4x.org>
Wed, 13 Apr 2011 16:00:30 +0000 (18:00 +0200)
committerStéphane Jacob <sj@m4x.org>
Wed, 13 Apr 2011 16:00:30 +0000 (18:00 +0200)
Signed-off-by: Stéphane Jacob <sj@m4x.org>
ChangeLog
include/emails.combobox.inc.php
modules/email.php
modules/profile.php
modules/profile/general.inc.php
modules/profile/jobs.inc.php
templates/include/emails.combobox.tpl

index d90e2a6..f91f7c9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@ VERSION 1.1.1                                                         XX XX XXXX
 Bug/Wish:
 
     * Emails:
+        - #1110: Improves email combobox                                   -JAC
         - #1459: Lists and administrates aliases on main domain            -JAC
 
     * Profile:
index 3409e7a..0e53f1b 100644 (file)
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-function fill_email_combobox(PlPage $page, $user = null, $profile = null)
+function fill_email_combobox(PlPage $page, array $retrieve, $user = null)
 {
+    require_once 'emails.inc.php';
     if (is_null($user)) {
         $user = S::user();
     }
-    if (is_null($profile)) {
-        /* Always refetch the profile. */
-        $profile = $user->profile(true);
-    }
-    $email_type = 'directory';
+    /* Always refetch the profile. */
+    $profile = $user->profile(true);
 
-    if ($profile) {
-        $email_directory = $profile->email_directory;
-        $page->assign('email_directory', $email_directory);
+    $emails = array();
+    if (in_array('source', $retrieve)) {
+        $emails['Emails polytechniciens'] = XDB::fetchColumn('SELECT  CONCAT(s.email, \'@\', d.name)
+                                                                FROM  email_source_account  AS s
+                                                          INNER JOIN  email_virtual_domains AS m ON (s.domain = m.id)
+                                                          INNER JOIN  email_virtual_domains AS d ON (d.aliasing = m.id)
+                                                               WHERE  s.uid = {?}
+                                                            ORDER BY  s.email, d.name',
+                                                             $user->id());
+    }
 
-        $res = XDB::fetchAllAssoc('SELECT  email
-                                     FROM  profile_job
-                                    WHERE  pid = {?}', $profile->id());
-        $pro = array();
-        foreach ($res as $res_it) {
-            if ($res_it['email'] != '') {
-                $pro[] = $res_it['email'];
-                if ($email_directory == $res_it['email']) {
-                    $email_type = "pro";
-                }
+    if (in_array('redirect', $retrieve)) {
+        $redirect = new Redirect($user);
+        $emails['Redirections'] = array();
+        foreach ($redirect->emails as $redirect_it) {
+            if ($redirect_it->is_redirection()) {
+                $emails['Redirections'] = $redirect_it->email;
             }
         }
-        $page->assign('list_email_pro', $pro);
     }
 
-    if ($user) {
-        $res = XDB::fetchAllAssoc('SELECT  CONCAT(s.email, \'@\', d.name) AS email
-                                     FROM  email_source_account  AS s
-                               INNER JOIN  email_virtual_domains AS m ON (s.domain = m.id)
-                               INNER JOIN  email_virtual_domains AS d ON (d.aliasing = m.id)
-                                    WHERE  s.uid = {?}
-                                 ORDER BY  s.email, d.name', $user->id());
-        $page->assign('list_email_X', $res);
-        foreach ($res as $res_it) {
-            if ($email_directory == $res_it) {
-                $email_type = 'X';
-            }
+    if ($profile) {
+        if (in_array('job', $retrieve)) {
+            $emails['Emails professionels'] = XDB::fetchColumn('SELECT  email
+                                                                  FROM  profile_job
+                                                                 WHERE  pid = {?} AND email IS NOT NULL AND email != \'\'',
+                                                               $profile->id());
         }
 
-        require_once 'emails.inc.php';
-        $redirect = new Redirect($user);
-        $redir    = array();
-        foreach ($redirect->emails as $redirect_it) {
-            if ($redirect_it->is_redirection()) {
-                $redir[] = $redirect_it->email;
-                if ($email_directory == $redirect_it->email) {
-                    $email_type = 'redir';
+        if ($profile->email_directory) {
+            if (in_array('directory', $retrieve)) {
+                foreach ($emails as &$email_list) {
+                    foreach ($email_list as $key => $email) {
+                        if ($profile->email_directory == $email) {
+                            unset($email_list[$key]);
+                        }
+                    }
+                }
+                $emails['Email annuaire AX'] = array($profile->email_directory);
+            } elseif (in_array('stripped_directory', $retrieve)) {
+                if (User::isForeignEmailAddress($profile->email_directory)) {
+                    $is_redirect = XDB::fecthOneCell('SELECT  COUNT(*)
+                                                        FROM  email_redirect_account
+                                                       WHERE  uid = {?} AND redirect = {?}',
+                                                     $user->id(), $profile->email_directory);
+                    if ($is_redirect == 0) {
+                        $emails['Email annuaire AX'] = array($profile->email_directory);
+                    }
                 }
             }
         }
-        $page->assign('list_email_redir', $redir);
-        $page->assign('email_type', $email_type);
-    } else {
-        $page->assign('list_email_X', array());
-        $page->assign('list_email_redir', array());
-        $page->assign('list_email_pro', array());
+
+        if (isset($emails['Emails professionels']) && isset($emails['Redirections'])) {
+            $intersect = array_intersect($emails['Emails professionels'], $emails['Redirections']);
+            foreach ($intersect as $key => $email) {
+                unset($emails['Emails professionels'][$key]);
+            }
+        }
+    }
+
+    $emails_count = 0;
+    foreach ($emails as $email_list) {
+        $emails_count += count($email_list);
     }
+    $page->assign('emails_count', $emails_count);
+    $page->assign('email_lists', $emails);
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 57dd50d..de8af94 100644 (file)
@@ -307,7 +307,7 @@ class EmailModule extends PLModule
         $page->assign('googleapps', GoogleAppsAccount::account_status($user->id()));
 
         require_once 'emails.combobox.inc.php';
-        fill_email_combobox($page);
+        fill_email_combobox($page, array('job', 'stripped_directory'));
     }
 
     function handler_antispam($page, $filter_status = null, $redirection = null)
index 4209f19..9416557 100644 (file)
@@ -443,7 +443,7 @@ class ProfileModule extends PLModule
         $page->assign('job', array());
         $page->assign('new', true);
         require_once "emails.combobox.inc.php";
-        fill_email_combobox($page);
+        fill_email_combobox($page, array('redirect', 'job', 'stripped_directory'));
     }
 
     /**
index b984472..2051f16 100644 (file)
@@ -717,7 +717,7 @@ class ProfilePageGeneral extends ProfilePage
         $page->assign('edu_fields', $res->fetchAllAssoc());
 
         require_once "emails.combobox.inc.php";
-        fill_email_combobox($page, $this->owner);
+        fill_email_combobox($page, array('source', 'redirect', 'job', 'directory'), $this->owner);
 
         $res = XDB::query("SELECT  nw.nwid AS type, nw.name
                              FROM  profile_networking_enum AS nw
index d8d27c8..37b8f3d 100644 (file)
@@ -438,7 +438,7 @@ class ProfilePageJobs extends ProfilePage
     public function _prepare(PlPage $page, $id)
     {
         require_once 'emails.combobox.inc.php';
-        fill_email_combobox($page, $this->owner);
+        fill_email_combobox($page, array('redirect', 'job', 'stripped_directory'), $this->owner);
 
         if (!S::user()->isMe($this->owner)) {
             $res = XDB::iterator('SELECT  id, name
index 021a47f..74e84b3 100644 (file)
   {if $name eq "email"}<td></td>{/if}
   <td>
     {if $name neq "email"}<div style="float: left">{/if}
+    {if $emails_count neq 0}
     <select name="{$name}" id="{$combobox}">
-      {if $email_type eq "directory"}
-      <optgroup label="Email annuaire AX">
-        <option value="{$email_directory}" {if
-        $val eq $email_directory}selected="selected"{/if}>{$email_directory}</option>
-      </optgroup>
-      {/if}
-      {if $name eq "email_directory"}
-      <optgroup label="Emails polytechniciens">
-        {foreach from=$list_email_X item=email}
-        <option value="{$email.email}" {if $val eq $email.email}selected="selected"{/if}>{$email.email}</option>
-        {/foreach}
-      </optgroup>
-      {/if}
-      {if (($name neq "email") && ($list_email_redir|@count neq 0))}
-      <optgroup label="Redirections">
-        {foreach from=$list_email_redir item=email}
+      {foreach from=$email_lists item=email_list key=key}
+      {if $email_list|@count}
+      <optgroup label="{$key}">
+        {foreach from=$email_list item=email}
         <option value="{$email}" {if $val eq $email}selected="selected"{/if}>{$email}</option>
         {/foreach}
       </optgroup>
       {/if}
-      {if $list_email_pro|@count neq 0}
-      <optgroup label="Emails professionels">
-        {foreach from=$list_email_pro item=email}
-        <option value="{$email}" {if
-                $val eq $email}selected="selected"{/if}>{$email}</option>
-        {/foreach}
-      </optgroup>
-      {/if}
+      {/foreach}
       <optgroup label="Autres choix">
         <option value="new@example.org" {if ($val eq '' && !$error && $name eq 'email') || $error}selected="selected"{/if}>Nouvelle adresse email</option>
-        <option value="" {if $val eq '' && !$error && $name neq 'email'}selected="selected"{/if}>{if $name neq "email"}Ne pas mettre d'adresse email{else}&nbsp;{/if}</option>
+        {if $name neq "email"}<option value="" {if $val eq '' && !$error}selected="selected"{/if}>Ne pas mettre d'adresse email</option>{/if}
       </optgroup>
     </select>
+    {else}
+    <input type="text" maxlength="255" {if $error}class="error" value="{$val}"{/if} name="{$name}"/>
+    {/if}
     {if $name neq "email"}
     </div>
     <div style="float: right" class="flags">