- #636: Remove non-X from trombi -FRU
- #638: Sort trombi by promo then name -FRU
+ * Register:
+ - #428: Can propose subscription to lists -FRU
+
* Search:
- #132: Better french soundex -FRU
- #173: Show only countries where there is a user -FRU
XDB::execute("DELETE FROM register_marketing WHERE uid = {?}", $uid);
} else {
XDB::execute("DELETE FROM register_marketing WHERE uid = {?} AND email = {?}", $uid, $email);
- XDB::execute("DELETE FROM register_subs WHERE uid = {?}", $uid);
}
}
// }}}
// {{{ function get_user_login()
-function get_user_login($data, $get_forlife = false) {
+// Defaut callback to call when a login is not found
+function _default_user_callback($login)
+{
+ global $page;
+ $page->trig("Il n'y a pas d'utilisateur avec l'identifiant : $login");
+ return;
+}
+
+function get_user_login($data, $get_forlife = false, $callback = '_default_user_callback')
+{
global $globals, $page;
if (is_numeric($data)) {
if ($res->numRows()) {
return $res->fetchOneCell();
} else {
- $page->trig("il n'y a pas d'utilisateur avec cet id");
+ call_user_func($callback, $data);
return false;
}
}
return $res->fetchOneCell();
}
}
- $page->trig("il n'y a pas d'utilisateur avec ce login");
+ call_user_func($callback, $data);
return false;
} elseif ($fqdn == $globals->mail->alias_dom || $fqdn == $globals->mail->alias_dom2) {
if ($redir = $res->fetchOneCell()) {
list($alias) = explode('@', $redir);
} else {
- $page->trig("il n'y a pas d'utilisateur avec cet alias");
+ call_user_func($callback, $data);
$alias = false;
}
return $alias;
-
} else {
$res = XDB::query("SELECT alias
WHERE e.email={?} AND a.type='a_vie'", $data);
switch ($i = $res->numRows()) {
case 0:
- $page->trig("il n'y a pas d'utilisateur avec cette addresse mail");
+ call_user_func($callback, $data);
return false;
case 1:
// }}}
// {{{ function get_user_forlife()
-function get_user_forlife($data) {
- return get_user_login($data, true);
+function get_user_forlife($data, $callback = '_default_user_callback')
+{
+ return get_user_login($data, true, $callback);
}
// }}}
// {{{ function get_users_forlife_list()
-function get_users_forlife_list($members, $strict = false)
+function get_users_forlife_list($members, $strict = false, $callback = '_default_user_callback')
{
if (strlen(trim($members)) == 0) {
return null;
if ($members) {
$list = array();
foreach ($members as $i => $alias) {
- if (($login = get_user_forlife($alias)) !== false) {
+ if (($login = get_user_forlife($alias, $callback)) !== false) {
$list[$i] = $login;
} else if(!$strict) {
$list[$i] = $alias;
return false;
}
// }}}
+// {{{ function get_not_registered_user()
+
+function get_not_registered_user($login, $iterator = false)
+{
+ global $globals;
+ @list($login, $domain) = explode('@', $login);
+ if ($domain && $domain != $globals->mail->domain && $domain != $globals->mail->domain2) {
+ return null;
+ }
+ @list($prenom, $nom, $promo) = explode('.', $login);
+ $where = 'REPLACE(REPLACE(REPLACE(nom, " ", ""), "-", ""), "\'", "") LIKE CONCAT("%", {?}, "%")
+ AND REPLACE(REPLACE(REPLACE(prenom, " ", ""), "-", ""), "\'", "") LIKE CONCAT("%", {?}, "%")';
+ if ($promo) {
+ if (preg_match('/^[0-9]{2}$/', $promo)) {
+ $where .= 'AND MOD(promo, 100) = {?}';
+ } elseif (preg_match('/^[0-9]{4}$/', $promo)) {
+ $where .= 'AND promo = {?}';
+ }
+ }
+ $sql = "SELECT user_id, nom, prenom, promo
+ FROM auth_user_md5
+ WHERE $where
+ ORDER BY promo, nom, prenom";
+ if ($iterator) {
+ return XDB::iterator($sql, $nom, $prenom, $promo);
+ } else {
+ $res = XDB::query($sql, $nom, $prenom, $promo);
+ return $res->fetchAllAssoc();
+ }
+}
+
+// }}}
// {{{ function get_user_details_pro()
function get_user_details_pro($uid, $view = 'private')
class ListsModule extends PLModule
{
- var $client;
+ protected $client;
function handlers()
{
}
}
+ static public function no_login_callback($login)
+ {
+ require_once 'user.func.inc.php';
+ global $list_unregistered;
+
+ $users = get_not_registered_user($login, true);
+ if ($users->total()) {
+ if (!isset($list_unregistered)) {
+ $list_unregistered = array();
+ }
+ $list_unregistered[$login] = $users;
+ } else {
+ _default_user_callback($login);
+ }
+ }
+
function handler_admin(&$page, $liste = null)
{
global $globals;
return PL_NOT_FOUND;
}
- $this->prepare_client($page);
+ $domain = $this->prepare_client($page);
$this->changeTpl('lists/admin.tpl');
+ if (Env::has('send_mark')) {
+ $actions = Env::v('mk_action');
+ $uids = Env::v('mk_uid');
+ $mails = Env::v('mk_email');
+ foreach ($actions as $key=>$action) {
+ switch ($action) {
+ case 'none':
+ break;
+
+ case 'marketu': case 'markets':
+ require_once 'emails.inc.php';
+ $mail = valide_email($mails[$key]);
+ if (isvalid_email_redirection($mail)) {
+ $from = ($action == 'marketu') ? 'user' : 'staff';
+ $market = Marketing::get($uids[$key], $mail);
+ if (!$market) {
+ $market = new Marketing($uids[$key], $mail, 'list', "$liste@$domain", $from, S::v('uid'));
+ $market->add();
+ break;
+ }
+ }
+
+ default:
+ XDB::execute('INSERT IGNORE INTO register_subs (uid, type, sub, domain)
+ VALUES ({?}, \'list\', {?}, {?})',
+ $uids[$key], $liste, $domain);
+ }
+ }
+ }
+
if (Env::has('add_member')) {
require_once('user.func.inc.php');
- $members = get_users_forlife_list(Env::v('add_member'));
+ $members = get_users_forlife_list(Env::v('add_member'), false, array('ListsModule', 'no_login_callback'));
$arr = $this->client->mass_subscribe($liste, $members);
if (is_array($arr)) {
foreach($arr as $addr) {
if (Env::has('add_owner')) {
require_once('user.func.inc.php');
- $owners = get_users_forlife_list(Env::v('add_owner'));
+ $owners = get_users_forlife_list(Env::v('add_owner'), false, array('ListsModule', 'no_login_callback'));
if ($owners) {
foreach ($owners as $login) {
if ($this->client->add_owner($liste, $login)) {
}
if (list($det,$mem,$own) = $this->client->get_members($liste)) {
+ global $list_unregistered;
+ if ($list_unregistered) {
+ $page->assign_by_ref('unregistered', $list_unregistered);
+ }
$membres = list_sort_members($mem, @$tri_promo);
$moderos = list_sort_owners($own, @$tri_promo);
$mmlist = new MMList(S::v('uid'), S::v('password'));
$mmlist->subscribe("promo".S::v('promo'));
}
+ if (Post::v('sub_ml')) {
+ $subs = array_keys(Post::v('sub_ml'));
+ $current_domain = null;
+ foreach ($subs as $list) {
+ list($sub, $domain) = explode('@', $list);
+ if ($domain != $current_domain) {
+ $current_domain = $domain;
+ $client = new MMList(S::v('uid'), S::v('password'), $domain);
+ }
+ $client->subscribe($sub);
+ }
+ }
if (is_ax_key_missing()) {
$page->assign('no_private_key', true);
$page->assign('mdpok', true);
}
+ $res = XDB::iterRow("SELECT sub, domain
+ FROM register_subs
+ WHERE uid = {?} AND type = 'list'
+ ORDER BY domain",
+ S::i('uid'));
+ $current_domain = null;
+ $lists = array();
+ while (list($sub, $domain) = $res->next()) {
+ if ($current_domain != $domain) {
+ $current_domain = $domain;
+ $client = new MMList(S::v('uid'), S::v('password'), $domain);
+ }
+ list($details, ) = $client->get_members($sub);
+ $lists["$sub@$domain"] = $details;
+ }
+ $page->assign_by_ref('lists', $lists);
+
$page->addJsLink('motdepasse.js');
}
}
{
header('Content-Type: text/html; charset="UTF-8"');
$page->changeTpl('xnetgrp/membres-new-search.tpl', NO_SKIN);
- list($nom, $prenom) = str_replace(array('-', ' ', "'"), '%', array(Env::v('nom'), Env::v('prenom')));
- $where = "perms = 'pending'";
- if (!empty($nom)) {
- $where .= " AND nom LIKE '%$nom%'";
- }
- if (!empty($prenom)) {
- $where .= " AND prenom LIKE '%$prenom%'";
- }
- if (preg_match('/^[0-9]{4}$/', Env::v('promo'))) {
- $where .= " AND promo = " . Env::i('promo');
- } elseif (Env::has('promo')) {
- return;
+ if (Env::has('login')) {
+ require_once 'user.func.inc.php';
+ $res = get_not_registered_user(Env::v('login'), true);
+ } else {
+ list($nom, $prenom) = str_replace(array('-', ' ', "'"), '%', array(Env::v('nom'), Env::v('prenom')));
+ $where = "perms = 'pending'";
+ if (!empty($nom)) {
+ $where .= " AND nom LIKE '%$nom%'";
+ }
+ if (!empty($prenom)) {
+ $where .= " AND prenom LIKE '%$prenom%'";
+ }
+ if (preg_match('/^[0-9]{4}$/', Env::v('promo'))) {
+ $where .= " AND promo = " . Env::i('promo');
+ } elseif (preg_match('/^[0-9]{2}$/', Env::v('promo'))) {
+ $where .= " AND MOD(promo, 100) = " . Env::i('promo');
+ } elseif (Env::has('promo')) {
+ return;
+ }
+ $res = XDB::iterator("SELECT user_id, nom, prenom, promo
+ FROM auth_user_md5
+ WHERE $where");
}
- $res = XDB::iterator("SELECT user_id, nom, prenom, promo
- FROM auth_user_md5
- WHERE $where");
if ($res->total() < 30) {
$page->assign("choix", $res);
}
qui y était abonné.
</p>
+{if $unregistered|@count neq 0}
+<h1>Marketing d'utilisateurs non-inscrits</h1>
+
+<p>
+{if $unregistered|@count eq 1}
+L'utilisateur suivant n'est pas inscrit à Polytechnique.org. Tu peux l'y inciter en lui faisant envoyer un mail de marketing. Une fois inscrit à Polytechnique.org, l'inscription à la liste lui sera automatiquement proposée.
+{else}
+Les utilisateurs suivants ne sont pas inscrits à Polytechnique.org. Tu peux les y inciter en leur faisant envoyer des
+mails de marketing. Une fois inscrits à Polytechnique.org, l'inscription à la liste leur sera automatique proposée.
+{/if}
+<p>
+
+<script type="text/javascript">
+ {literal}
+ function showEmail(val, login)
+ {
+ var span = document.getElementById("mk_s_mail[" + login + "]");
+ var state = (val == 'marketu' || val == 'markets') ? '' : 'none';
+ span.style.display = state;
+ }
+ {/literal}
+</script>
+
+<form method="post" action='{$smarty.server.REQUEST_URI}'>
+ <table class="bicol">
+ {foreach from=$unregistered key=login item=it}
+ <tr class="{cycle values="pair,impair"}">
+ <td>{$login}</td>
+ <td>
+ Camarade :
+ <select name="mk_uid[{$login}]">
+ {iterate from=$it item=user}
+ <option value="{$user.user_id}">{$user.prenom} {$user.nom} (X{$user.promo})</option>
+ {/iterate}
+ </select><br />
+ Action<a href="{$platal->pl_self()}#action_desc">*</a> :
+ <select name="mk_action[{$login}]" onchange="showEmail(this.value, '{$login}');">
+ <option value="none">Aucune</option>
+ <option value="marketu">Envoyer un mail en ton nom</option>
+ <option value="markets">Envoyer un mail au nom de Polytechnique.org</option>
+ <option value="sub">Lui proposer l'inscription</option>
+ </select><br />
+ <span id="mk_s_mail[{$login}]" style="display: none">
+ Email : <input type="text" name="mk_email[{$login}]" value="" />
+ </span>
+ </td>
+ </tr>
+ {/foreach}
+ </table>
+ <p class="center">
+ <input type="submit" name="send_mark" value="Envoyer les marketings !" />
+ </p>
+</form>
+
+<p class="smaller">
+ *: La dernière action ajoute simplement la liste de diffusion aux abonnements qui seront proposés au camarade
+ lors de son inscription à Polytechnique.org sans pour autant lui enovyer de mail de marketing. Cette action est
+ automatique si tu choisis l'envoi de mail.
+</p>
+
+{/if}
+
<h1>
modérateurs de la liste
</h1>
</tr>
<tr class="pair">
<td align="right"><strong>From:</strong></td>
- {if $rel_from_staff neq $rel_from_user}
- <td><select name="from">
- <option value="staff">{$rel_from_staff}</option>
- <option value="user" selected="selected">{$rel_from_user}</option>
- </select></td>
- {else}
- {$rel_from_staff}<input type="hidden" name="from" value="staff" />
- {/if}
+ <td>
+ {if $rel_from_staff neq $rel_from_user}
+ <select name="from">
+ <option value="staff">{$rel_from_staff}</option>
+ <option value="user" selected="selected">{$rel_from_user}</option>
+ </select>
+ {else}
+ {$rel_from_staff}<input type="hidden" name="from" value="staff" />
+ {/if}
+ </td>
</tr>
<tr class="pair">
<td align="right"><strong>To:</strong></td>
</dd>
</dl>
+ {if $lists|@count neq 0}
+ <p>
+ Des camarades souhaitent que tu t'inscrives aux listes suivantes :
+ </p>
+
+ <dl>
+ {foreach from=$lists key=list item=details}
+ <dt><input type='checkbox' value='1' checked="checked" name="sub_ml[{$list}]" /> {$list}* : {$details.desc}</dt>
+ {if $details.info}
+ <dd>
+ {$details.info|nl2br}
+ </dd>
+ {/if}
+ {/foreach}
+ </dl>
+ {/if}
+
<p class="smaller">* décoche les cases si tu ne souhaites pas être inscrit à la liste de diffusion correspondante</p>
<div class="center">
document.getElementById('xprenom').style.display = state;
document.getElementById('xpromo').style.display = state;
document.getElementById('xsearch').style.display = state;
+ Ajax.update_html('search_result',
+ '{/literal}{$platal->ns}{literal}member/new/ajax?login=' + document.getElementById('email').value);
}
var nom;
<table class="tinybicol">
<tr>
<td class="center" colspan="2">
- <input type="text" name="email" size="40" value="{$platal->argv[1]}" />
+ <input type="text" id="email" name="email" size="40" value="{$platal->argv[1]}" />
<input type='submit' value='Ajouter'
onclick='this.form.action += this.form.email.value' />
</td>
</tr>
<tr>
<td colspan="2">
- <input type="checkbox" name="x" onchange="xStateChange(this);" />
- Coche cette case si il s'agit d'un X non inscrit à Polytechnique.org
+ <input type="checkbox" id="x" name="x" onchange="xStateChange(this);" />
+ <label for="x">Coche cette case si il s'agit d'un X non inscrit à Polytechnique.org</label>
</td>
</tr>
<tr id="xnom" style="display: none">