#512, #589: Can attach a file to the emails
authorx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Wed, 6 Dec 2006 00:17:56 +0000 (00:17 +0000)
committerx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Wed, 6 Dec 2006 00:17:56 +0000 (00:17 +0000)
Relook X.org 'send a mail' page

git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@1245 839d8a87-29fc-0310-9880-83ba4fa771e5

ChangeLog
modules/email.php
modules/xnetgrp.php
modules/xnetgrp/mail.inc.php
templates/emails/send.tpl
templates/xnet/groupe/mail.tpl

index b6a6a6e..86ec30f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -25,6 +25,9 @@ New:
 
 Bug/Wish:
 
+    * Emails:
+        - #512: Can attach a file                                          -FRU
+
     * Lists:
         - #588: Auto-select mail to moderate                               -FRU
 
@@ -33,6 +36,7 @@ Bug/Wish:
 
     * Xnet:
         - #570: Fix geoloc skin.                                           -FRU
+        - #589: Can attach a file when sending an email                    -FRU
 
 From 0.9.12 branch:
 
index a1dc2e3..6d690eb 100644 (file)
@@ -274,7 +274,21 @@ class EmailModule extends PLModule
         // action si on recoit un formulaire
         if (Env::v('submit') == 'Envoyer')
         {
-            $to2  = join(', ', Env::v('contacts', Array()));
+            function getEmails($aliases)
+            {
+                if (!is_array($aliases)) {
+                    return null;
+                }
+                $rel = Env::v('contacts');
+                $ret = array();
+                foreach ($aliases as $alias) {
+                    $ret[$alias] = $rel[$alias];
+                }
+                return join(', ', $ret);
+            }
+
+            $to2  = getEmails(Env::v('to_contacts'));
+            $cc2  = getEmails(Env::v('cc_contacts'));
             $txt  = str_replace('^M', '', Env::v('contenu'));
             $to   = Env::v('to');
             $subj = Env::v('sujet');
@@ -292,6 +306,12 @@ class EmailModule extends PLModule
                 if (!empty($cc))  { $mymail->addCc($cc); }
                 if (!empty($bcc)) { $mymail->addBcc($bcc); }
                 if (!empty($to2)) { $mymail->addTo($to2); }
+                if (!empty($cc2)) { $mymail->addCc($cc2); }
+                if (isset($_FILES['uploaded'])) {
+                    $mymail->addAttachment($_FILES['uploaded']['tmp_name'],
+                                           $_FILES['uploaded']['type'],
+                                           $_FILES['uploaded']['name']);  
+                }
                 $mymail->setTxtBody(wordwrap($txt,72,"\n"));
                 if ($mymail->send()) {
                     $page->trig("Ton mail a bien été envoyé.");
index ad4ac2a..00bc231 100644 (file)
@@ -283,7 +283,7 @@ class XnetGrpModule extends PLModule
 
             require_once dirname(__FILE__) . '/xnetgrp/mail.inc.php';
             $tos = get_all_redirects($mbr,  $mls, $mmlist);
-            send_xnet_mails($from, $sujet, $body, $tos, Post::v('replyto'));
+            send_xnet_mails($from, $sujet, $body, $tos, Post::v('replyto'), $_FILES['uploaded']);
             $page->kill("Mail envoyé !");
             $page->assign('sent', true);
         }
index 3d55413..646883c 100644 (file)
@@ -93,13 +93,13 @@ function _send_xnet_mail($user, $body, $mailer, $replyto = null)
         $mailer->addHeader('Reply-To', $replyto);
     }
     $mailer->setTxtBody(wordwrap($text, 72));
-//    $mailer->send();
+    $mailer->send();
 }
 
 // }}}
 // {{{ send_xnet_mails
 
-function send_xnet_mails($from, $sujet, $body, $tos, $replyto = null)
+function send_xnet_mails($from, $sujet, $body, $tos, $replyto = null, $attach = null)
 {
     global $globals;
     $sent = array();
@@ -107,6 +107,11 @@ function send_xnet_mails($from, $sujet, $body, $tos, $replyto = null)
     $mailer = new PlMailer();
     $mailer->setSubject($sujet);
     $mailer->setFrom($from);
+    if (isset($attach)) {
+        $mailer->addAttachment($attach['tmp_name'],
+                               $attach['type'],
+                               $attach['name']);
+    }
 
     foreach ($tos as $user) {
         if ($sent[$user['email']]) continue;
index 0fa0663..a644398 100644 (file)
 
 <h1>Envoyer un mail</h1>
 
-<ul>
-  <li>
-    Les destinataires sont simplement séparés par des virgules
-  </li>
-  <li>
-    Pense à te mettre en copie cachée du mail sinon tu n'auras aucun moyen de retrouver 
-    le mail que tu envoies par cette page
-  </li>
-</ul>
-
 <script type="text/javascript">//<![CDATA[
   {literal}
+  function _selectAll(id) {
+    var list = document.getElementById(id);
+    for (i = 0 ; i < list.length ; i++) {
+      list.options[i].selected = true;
+    }
+  }
+
   function check(form) {
+    _selectAll('to_contacts');
+    _selectAll('cc_contacts');
     if(form.sujet.value == "") {
       form.sujet.focus();
       return confirm ("Le sujet du mail est vide, veux tu continuer ?");
     }
     return true;
   }
+
+  function _move(idFrom, idTo) {
+    var from = document.getElementById(idFrom);
+    var to   = document.getElementById(idTo);
+
+    var index = new Array();
+    var j = 0;
+    for (i = 0 ; i < from.length ; i++) {
+      if (from.options[i].selected) {
+        var option = document.createElement('option');
+        option.value = from.options[i].value;
+        option.text  = from.options[i].text;
+        try {
+          to.add(option, null);
+        } catch(ex) {
+          to.add(option);
+        }
+        index[j++] = i;
+      }
+    }
+    for (i = index.length - 1 ; i >= 0 ; i--) {
+      from.remove(index[i]);
+    }
+  }
+
+  function addTo() {
+    _move('contacts', 'to_contacts');
+  }
+
+  function removeTo() {
+    _move('to_contacts', 'contacts');
+  }
+
+  function addCc() {
+    _move('contacts', 'cc_contacts');
+  }
+
+  function removeCc() {
+    _move('cc_contacts', 'contacts');
+  }
   {/literal}
 //]]>
 </script>
 
-<form action="emails/send" method="post" onsubmit="return check(this);">
+<form action="emails/send" method="post" enctype="multipart/form-data" onsubmit="return check(this);">
   <table class="bicol" cellpadding="2" cellspacing="0">
     <tr> 
       <th colspan="2">Destinataires</th>
         <input type='text' name='bcc' size='60' value="{$smarty.request.bcc}" />
       </td>
     </tr>
-  </table>
-
-  {if $contacts|@count}
-  <ul>
-    <li>
-      <p>
-        Tu peux également ajouter certains de tes contacts aux destinataires :
-      </p>
-    </li>
-  </ul>
-
-  <table class="bicol" cellpadding="2" cellspacing="0" summary="Destinataires parmi les contacts">
-{foreach key=key item=contact from=$contacts}
-{if $key is even}
-  <tr class="{cycle values="impair,pair"}">
-{/if}
-    <td>
-      <input type="checkbox" name="contacts[{$contact.forlife}]"
-        value="{$contact.prenom} {$contact.nom} &lt;{$contact.forlife}@{#globals.mail.domain#}&gt;"
-        {if $smarty.request.contacts && $smarty.request.contacts.forlife}checked="checked"{/if} />
-      <a href="profile/{$contact.forlife}" class="popup2">{$contact.prenom} {$contact.nom}</a> (X{$contact.promo})
-    </td>
-{if $key is odd}
-  </tr>
-{/if}
-{/foreach}
-{if $key is even}
-    <td></td>
-  </tr>
-{/if}
-  </table>
-{/if}
-
-  <ul>
-    <li>
-      Ne mets que du texte dans le contenu, pas de tags HTML
-    </li>
-    <li>
-      Il n'est pas possible d'envoyer un fichier en attachement
-    </li>
-  </ul>
-
-  <table class="bicol" cellspacing="0" cellpadding="2" summary="Corps du message">
-    <tr> 
-      <th>sujet</th>
-    </tr>
-    <tr> 
-      <td class="center"> 
-        <input type='text' name='sujet' size='75' value="{$smarty.request.sujet}" />
+    <tr class="pair">
+      <td colspan="2" class="smaller">
+        &bull;&nbsp;Les destinataires sont simplement séparés par des virgules<br />
+        &bull;&nbsp;Pense à te mettre en copie cachée du mail pour en avoir une trace
       </td>
     </tr>
-    <tr> 
-      <th>
-        Corps du mail
+    {if $contacts|@count}
+    <tr>
+      <th colspan="2">
+        Destinataires parmi tes contacts
       </th>
     </tr>
-    <tr> 
-      <td class="center">
-        <textarea name='contenu' rows="30" cols="75">
+    <tr>
+      <td colspan="2" style="padding: 4px">
+        <div style="float: right; width: 40%;">
+          <select id="to_contacts" name="to_contacts[]" multiple="multiple" style="width: 100%; height: 5em">
+          {foreach key=key item=contact from=$contacts}
+          {if in_array($contact.forlife, $smarty.request.to_contacts)}
+          <option value="{$contact.forlife}">
+            {$contact.prenom} {$contact.nom} (X{$contact.promo})
+          </option>
+          {/if}
+          {/foreach}
+          </select><br />
+          <select id="cc_contacts" name="cc_contacts[]" multiple="multiple" style="width: 100%; height: 5em">
+          {foreach key=key item=contact from=$contacts}
+          {if in_array($contact.forlife, $smarty.request.cc_contacts)}
+          <option value="{$contact.forlife}">
+            {$contact.prenom} {$contact.nom} (X{$contact.promo})
+          </option>
+          {/if}
+          {/foreach}
+          </select>
+        </div>
+        <div style="width: 19%; text-align: center; height: 8em; float: right;">
+          <div style="height: 4em">
+              Destinataires<br />
+              <a href="" onclick="addTo(); return false">&gt;&gt; &gt;&gt;</a><br />
+              <a href="" onclick="removeTo(); return false">&lt;&lt; &lt;&lt;</a>
+          </div>
+          <div style="height: 4em">
+              En copie<br />
+              <a href="" onclick="addCc(); return false">&gt;&gt; &gt;&gt;</a><br />
+              <a href="" onclick="removeCc(); return false">&lt;&lt; &lt;&lt;</a>
+          </div>
+        </div>
+        <div style="float: right; width: 40%">
+          <select id="contacts" name="all_contacts[]" multiple="multiple" style="height: 10em; width: 100%">
+            {foreach item=contact from=$contacts}
+            {if !in_array($contact.forlife, $smarty.request.to_contacts) && !in_array($contact.forlife, $smarty.request.cc_contacts)}
+            <option value="{$contact.forlife}">
+              {$contact.prenom} {$contact.nom} (X{$contact.promo})
+            </option>
+            {/if}
+            {/foreach}
+          </select>
+        </div>
+        {foreach item=contact from=$contacts}
+        <input type="hidden" name="contacts[{$contact.forlife}]" value="{$contact.prenom} {$contact.nom} &lt;{$contact.forlife}@{#globals.mail.domain#}&gt;" />
+        {/foreach}
+      </td>
+    </tr>
+    {/if}
+  </table>
+
+  <fieldset>
+    <legend>Sujet&nbsp;:&nbsp;<input type='text' name='sujet' size='60' value="{$smarty.request.sujet}" /></legend>
+    <div class="center">Ne mets que du texte dans le contenu, pas de tags HTML</div>
+    <textarea name='contenu' rows="30" cols="75">
 {$smarty.request.contenu}
 {if !$smarty.request.contenu}
 -- 
 {$smarty.session.prenom} {$smarty.session.nom}
 {/if}</textarea>
-      </td>
-    </tr>
-    <tr> 
-      <td class="center">
-        <input type="submit" name="submit" value="Envoyer" />
-      </td>
-    </tr>
-  </table>
+    <div>
+      <strong>Ajouter une pièce jointe&nbsp;:&nbsp;</strong>
+      <input type="file" name="uploaded" />
+    </div>
+    <div class="center">
+      <input type="submit" name="submit" value="Envoyer" />
+    </div>
+  </fieldset>
 </form>
 
 
index 3c87b79..75d82d3 100644 (file)
@@ -29,7 +29,7 @@ Ton message peut 
 masculin ou féminin, par son prénom, ou son nom.
 </p>
  
-<form action="{$platal->ns}mail" method="post">
+<form action="{$platal->ns}mail" method="post" enctype="multipart/form-data">
   <table class='bicol'>
     <tr>
       <th colspan="2">Ecrire un mail :</th>
@@ -106,6 +106,14 @@ Le bureau du groupe {$asso.nom}.
       </td>
     </tr>
     <tr>
+      <td class="titre">
+        Attacher un fichier
+      </td>
+      <td>
+        <input type="file" name="uploaded" />
+      </td>
+    </tr>
+    <tr>
       <td colspan="2" align="center"><input type="submit" name="send" value="Envoyer le message"></td>
     </tr>
   </table>