]> git.agnieray.net Git - galette.git/commitdiff
Use events to send member administrative emails
authorJohan Cwiklinski <johan@x-tnd.be>
Wed, 15 Jul 2020 05:08:25 +0000 (07:08 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Sat, 22 Aug 2020 08:42:02 +0000 (10:42 +0200)
Factorize
Cleanup old code

refs #1355

galette/includes/dependencies.php
galette/lib/Galette/Controllers/Crud/MembersController.php
galette/lib/Galette/Entity/Adherent.php
galette/lib/Galette/Events/MemberListener.php [new file with mode: 0644]

index 6d84371e4732af32f153831077cf18e5bc5f9749..31a64b9a752a3e8c8a22fb622a454f372c24eac0 100644 (file)
@@ -630,6 +630,18 @@ $container['translator'] = function ($c) {
 // Add Event manager to dependency.
 $container['event_manager'] = function ($c) {
     $emitter = new SlimEventManager();
+
+    $emitter->useListenerProvider(
+        new Galette\Events\MemberListener(
+            $c->get('preferences'),
+            $c->get('router'),
+            $c->get('history'),
+            $c->get('flash'),
+            $c->get('login'),
+            $c->get('zdb')
+        )
+    );
+
     return $emitter;
 };
 
index b1b2510d366dd35eeb9d999b5ef4a97538625ac0..d06c587b69094875b3951076b3585b1cda9e0d8b 100644 (file)
@@ -1606,6 +1606,12 @@ class MembersController extends CrudController
                 if ($member->id == '') {
                     $new = true;
                 }
+
+                // send email to member
+                if (isset($args['self']) || isset($post['mail_confirm']) && $post['mail_confirm'] == '1') {
+                    $member->setSendmail(); //flag to send creation email
+                }
+
                 $store = $member->store();
                 if ($store === true) {
                     //member has been stored :)
@@ -1621,233 +1627,10 @@ class MembersController extends CrudController
                         } else {
                             $success_detected[] = _T("New member has been successfully added.");
                         }
-                        //Send email to admin if preference checked
-                        if (
-                            $this->preferences->pref_mail_method > GaletteMail::METHOD_DISABLED
-                            && $this->preferences->pref_bool_mailadh
-                        ) {
-                            $texts = new Texts(
-                                $this->preferences,
-                                $this->router,
-                                array(
-                                    'name_adh'      => custom_html_entity_decode(
-                                        $member->sname
-                                    ),
-                                    'firstname_adh' => custom_html_entity_decode(
-                                        $member->surname
-                                    ),
-                                    'lastname_adh'  => custom_html_entity_decode(
-                                        $member->name
-                                    ),
-                                    'mail_adh'      => custom_html_entity_decode(
-                                        $member->email
-                                    ),
-                                    'login_adh'     => custom_html_entity_decode(
-                                        $member->login
-                                    )
-                                )
-                            );
-                            $mtxt = $texts->getTexts(
-                                (isset($args['self']) ? 'newselfadh' : 'newadh'),
-                                $this->preferences->pref_lang
-                            );
-
-                            $mail = new GaletteMail($this->preferences);
-                            $mail->setSubject($texts->getSubject());
-                            $recipients = [];
-                            foreach ($this->preferences->vpref_email_newadh as $pref_email) {
-                                $recipients[$pref_email] = $pref_email;
-                            }
-                            $mail->setRecipients($recipients);
-                            $mail->setMessage($texts->getBody());
-                            $sent = $mail->send();
-
-                            if ($sent == GaletteMail::MAIL_SENT) {
-                                $this->history->add(
-                                    str_replace(
-                                        '%s',
-                                        $member->sname . ' (' . $member->email . ')',
-                                        _T("New account email sent to admin for '%s'.")
-                                    )
-                                );
-                            } else {
-                                $str = str_replace(
-                                    '%s',
-                                    $member->sname . ' (' . $member->email . ')',
-                                    _T("A problem happened while sending email to admin for account '%s'.")
-                                );
-                                $this->history->add($str);
-                                $warning_detected[] = $str;
-                            }
-                            unset($texts);
-                        }
                     } else {
                         $success_detected[] = _T("Member account has been modified.");
                     }
 
-                    // send email to member
-                    if (isset($args['self']) || isset($post['mail_confirm']) && $post['mail_confirm'] == '1') {
-                        if ($this->preferences->pref_mail_method > GaletteMail::METHOD_DISABLED) {
-                            if ($member->getEmail() == '' && !isset($args['self'])) {
-                                $error_detected[] = _T("- You can't send a confirmation by email if the member hasn't got an address!");
-                            } else {
-                                $mreplaces = [
-                                    'name_adh'      => custom_html_entity_decode(
-                                        $member->sname
-                                    ),
-                                    'firstname_adh' => custom_html_entity_decode(
-                                        $member->surname
-                                    ),
-                                    'lastname_adh'  => custom_html_entity_decode(
-                                        $member->name
-                                    ),
-                                    'mail_adh'      => custom_html_entity_decode(
-                                        $member->getEmail()
-                                    ),
-                                    'login_adh'     => custom_html_entity_decode(
-                                        $member->login
-                                    )
-                                ];
-                                if ($new) {
-                                    $password = new Password($this->zdb);
-                                    $res = $password->generateNewPassword($member->id);
-                                    if ($res == true) {
-                                        $link_validity = new \DateTime();
-                                        $link_validity->add(new \DateInterval('PT24H'));
-                                        $mreplaces['change_pass_uri'] = $this->preferences->getURL() .
-                                            $this->router->pathFor(
-                                                'password-recovery',
-                                                ['hash' => base64_encode($password->getHash())]
-                                            );
-                                        $mreplaces['link_validity'] = $link_validity->format(_T("Y-m-d H:i:s"));
-                                    } else {
-                                        $str = str_replace(
-                                            '%s',
-                                            $member->sfullname,
-                                            _T("An error occurred storing temporary password for %s. Please inform an admin.")
-                                        );
-                                        $this->history->add($str);
-                                        $this->flash->addMessage(
-                                            'error_detected',
-                                            $str
-                                        );
-                                    }
-                                }
-
-                                //send email to member
-                                // Get email text in database
-                                $texts = new Texts(
-                                    $this->preferences,
-                                    $this->router,
-                                    $mreplaces
-                                );
-                                $mlang = $this->preferences->pref_lang;
-                                if (isset($post['pref_lang'])) {
-                                    $mlang = $post['pref_lang'];
-                                }
-                                $mtxt = $texts->getTexts(
-                                    (($new) ? 'sub' : 'accountedited'),
-                                    $mlang
-                                );
-
-                                $mail = new GaletteMail($this->preferences);
-                                $mail->setSubject($texts->getSubject());
-                                $mail->setRecipients(
-                                    array(
-                                        $member->getEmail() => $member->sname
-                                    )
-                                );
-                                $mail->setMessage($texts->getBody());
-                                $sent = $mail->send();
-
-                                if ($sent == GaletteMail::MAIL_SENT) {
-                                    $msg = str_replace(
-                                        '%s',
-                                        $member->sname . ' (' . $member->getEmail() . ')',
-                                        ($new) ?
-                                        _T("New account email sent to '%s'.") : _T("Account modification email sent to '%s'.")
-                                    );
-                                    $this->history->add($msg);
-                                    $success_detected[] = $msg;
-                                } else {
-                                    $str = str_replace(
-                                        '%s',
-                                        $member->sname . ' (' . $member->getEmail() . ')',
-                                        _T("A problem happened while sending account email to '%s'")
-                                    );
-                                    $this->history->add($str);
-                                    $error_detected[] = $str;
-                                }
-                            }
-                        } elseif ($this->preferences->pref_mail_method == GaletteMail::METHOD_DISABLED) {
-                            //if email has been disabled in the preferences, we should not be here ;
-                            //we do not throw an error, just a simple warning that will be show later
-                            $msg = _T("You asked Galette to send a confirmation email to the member, but email has been disabled in the preferences.");
-                            $warning_detected[] = $msg;
-                        }
-                    }
-
-                    // send email to admin
-                    if (
-                        $this->preferences->pref_mail_method > GaletteMail::METHOD_DISABLED
-                        && $this->preferences->pref_bool_mailadh
-                        && !$new
-                        && $member->id == $this->login->id
-                    ) {
-                        $mreplaces = [
-                            'name_adh'      => custom_html_entity_decode(
-                                $member->sname
-                            ),
-                            'firstname_adh' => custom_html_entity_decode(
-                                $member->surname
-                            ),
-                            'lastname_adh'  => custom_html_entity_decode(
-                                $member->name
-                            ),
-                            'mail_adh'      => custom_html_entity_decode(
-                                $member->getEmail()
-                            ),
-                            'login_adh'     => custom_html_entity_decode(
-                                $member->login
-                            )
-                        ];
-
-                        //send email to member
-                        // Get email text in database
-                        $texts = new Texts(
-                            $this->preferences,
-                            $this->router,
-                            $mreplaces
-                        );
-                        $mlang = $this->preferences->pref_lang;
-
-                        $mtxt = $texts->getTexts(
-                            'admaccountedited',
-                            $mlang
-                        );
-
-                        $mail = new GaletteMail($this->preferences);
-                        $mail->setSubject($texts->getSubject());
-                        $recipients = [];
-                        foreach ($this->preferences->vpref_email_newadh as $pref_email) {
-                            $recipients[$pref_email] = $pref_email;
-                        }
-                        $mail->setRecipients($recipients);
-
-                        $mail->setMessage($texts->getBody());
-                        $sent = $mail->send();
-
-                        if ($sent == GaletteMail::MAIL_SENT) {
-                            $msg = _T("Account modification email sent to admin.");
-                            $this->history->add($msg);
-                            $success_detected[] = $msg;
-                        } else {
-                            $str = _T("A problem happened while sending account email to admin");
-                            $this->history->add($str);
-                            $warning_detected[] = $str;
-                        }
-                    }
-
                     //store requested groups
                     $add_groups = null;
                     $groups_adh = null;
index ac80591b94e9f590a75c37ea8d8b3d2755b2fadb..86a0600d7fda5bf8dde6fba74cb6cbffa96ad2b0 100644 (file)
@@ -126,9 +126,9 @@ class Adherent
     private $_parent;
     private $_children;
     private $_duplicate = false;
-    //
+
     private $_row_classes;
-    //fields list and their translation
+
     private $_self_adh = false;
     private $_deps = array(
         'picture'   => true,
@@ -154,6 +154,8 @@ class Adherent
 
     private $errors = [];
 
+    private $sendmail = false;
+
     /**
      * Default constructor
      *
@@ -1984,4 +1986,27 @@ class Adherent
     {
         return $this->_duplicate;
     }
+
+    /**
+     * Flag creation mail sending
+     *
+     * @param boolean $send True (default) to send creation email
+     *
+     * @return Adherent
+     */
+    public function setSendmail($send = true)
+    {
+        $this->sendmail = $send;
+        return $this;
+    }
+
+    /**
+     * Shoudl we send administrative emails to member?
+     *
+     * @return boolean
+     */
+    public function sendEMail()
+    {
+        return $this->sendmail;
+    }
 }
diff --git a/galette/lib/Galette/Events/MemberListener.php b/galette/lib/Galette/Events/MemberListener.php
new file mode 100644 (file)
index 0000000..9296228
--- /dev/null
@@ -0,0 +1,380 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Event listener for members
+ *
+ * PHP version 5
+ *
+ * Copyright © 2020 The Galette Team
+ *
+ * This file is part of Galette (http://galette.tuxfamily.org).
+ *
+ * Galette 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Galette 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 Galette. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Events
+ * @package   Galette
+ *
+ * @author    Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2020 The Galette Team
+ * @license   http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
+ * @link      http://galette.tuxfamily.org
+ * @since     Available since 2020-07-14
+ */
+
+namespace Galette\Events;
+
+use Galette\Core\Db;
+use Galette\Core\GaletteMail;
+use Galette\Core\History;
+use Galette\Core\Login;
+use Galette\Core\Password;
+use Galette\Core\Preferences;
+use Galette\Entity\Adherent;
+use Galette\Entity\Texts;
+use Analog\Analog;
+use League\Event\Event;
+use League\Event\ListenerAcceptorInterface;
+use League\Event\ListenerProviderInterface;
+use Slim\Flash\Messages;
+use Slim\Router;
+
+/**
+ * Event listener for members
+ *
+ * @category  Events
+ * @name      MemberListener
+ * @package   Galette
+ * @author    Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2020 The Galette Team
+ * @license   http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
+ * @link      https://galette.eu
+ * @since     Available since 2020-07-14
+ */
+class MemberListener implements ListenerProviderInterface
+{
+    /** @var Preferences */
+    private $preferences;
+    /** @var Router */
+    private $router;
+    /** @var History */
+    private $history;
+    /** @var Messages */
+    private $flash;
+    /** @var Login */
+    private $login;
+    /** @var Db */
+    private $zdb;
+
+    /**
+     * Constructor
+     *
+     * @param Preferences $preferences Preferences instance
+     * @param Router      $router      Router instance
+     * @param History     $history     History instance
+     * @param Messages    $flash       Messages instance
+     * @param Login       $login       Login instance
+     * @param Db          $zdb         Db instance
+     */
+    public function __construct(
+        Preferences $preferences,
+        Router $router,
+        History $history,
+        Messages $flash,
+        Login $login,
+        Db $zdb
+    ) {
+        $this->preferences = $preferences;
+        $this->router = $router;
+        $this->history = $history;
+        $this->flash = $flash;
+        $this->login = $login;
+        $this->zdb = $zdb;
+    }
+
+    /**
+     * Set up member listeners
+     *
+     * @param ListenerAcceptorInterface $acceptor Listener
+     *
+     * @return void
+     */
+    public function provideListeners(ListenerAcceptorInterface $acceptor)
+    {
+        $acceptor->addListener(
+            'member.add',
+            function ($event, $member) {
+                $this->memberAdded($event, $member);
+            }
+        );
+
+        $acceptor->addListener(
+            'member.edit',
+            function ($event, $member) {
+                $this->memberEdited($event, $member);
+            }
+        );
+    }
+
+    /**
+     * Memebr added listener
+     *
+     * @param Event    $event  Raised event
+     * @param Adherent $member Added member
+     *
+     * @return void
+     */
+    public function memberAdded(Event $event, Adherent $member)
+    {
+        Analog::log(
+            '[' . get_class($this) . '] Event member.add emitted for ' . $member->sfullname,
+            Analog::DEBUG
+        );
+
+        if ($member->sendEMail()) {
+            $this->sendMemberEmail($member, true);
+        }
+
+        $this->sendAdminEmail($member, true);
+    }
+
+    /**
+     * Memebr edited listener
+     *
+     * @param Event    $event  Raised event
+     * @param Adherent $member Added member
+     *
+     * @return void
+     */
+    public function memberEdited(Event $event, Adherent $member)
+    {
+        Analog::log(
+            '[' . get_class($this) . '] Event member.edit emitted for ' . $member->sfullname,
+            Analog::DEBUG
+        );
+
+        if ($member->sendEMail()) {
+            $this->sendMemberEmail($member, false);
+        }
+
+        $this->sendAdminEmail($member, false);
+    }
+
+    /**
+     * Get texts replacements array for member
+     *
+     * @param Adherent $member Member instance
+     *
+     * @return array
+     */
+    private function getReplacements(Adherent $member): array
+    {
+        $mreplaces = [
+            'name_adh'      => custom_html_entity_decode(
+                $member->sname
+            ),
+            'firstname_adh' => custom_html_entity_decode(
+                $member->surname
+            ),
+            'lastname_adh'  => custom_html_entity_decode(
+                $member->name
+            ),
+            'mail_adh'      => custom_html_entity_decode(
+                $member->getEmail()
+            ),
+            'login_adh'     => custom_html_entity_decode(
+                $member->login
+            )
+        ];
+        return $mreplaces;
+    }
+
+    /**
+     * Send account email to member
+     *
+     * @param Adherent $member Member
+     * @param boolean  $new    New member or editing existing one
+     *
+     * @return void
+     */
+    private function sendMemberEmail(Adherent $member, $new)
+    {
+        if ($this->preferences->pref_mail_method == GaletteMail::METHOD_DISABLED) {
+            //if email has been disabled in the preferences, we should not be here ;
+            //we do not throw an error, just a simple warning that will be show later
+            $msg = _T("You asked Galette to send a confirmation email to the member, but email has been disabled in the preferences.");
+            $this->flash->addMessage(
+                'warning_detected',
+                $msg
+            );
+            return;
+        }
+
+        if ($member->getEmail() == '' && !$member->self_adh) {
+            $this->flash->addMessage(
+                'error_detected',
+                _T("- You can't send a confirmation by email if the member hasn't got an address!")
+            );
+            return;
+        }
+
+        $mreplaces = $this->getReplacements($member);
+        if ($new) {
+            $password = new Password($this->zdb);
+            $res = $password->generateNewPassword($member->id);
+            if ($res == true) {
+                $link_validity = new \DateTime();
+                $link_validity->add(new \DateInterval('PT24H'));
+                $mreplaces['change_pass_uri'] = $this->preferences->getURL() .
+                    $this->router->pathFor(
+                        'password-recovery',
+                        ['hash' => base64_encode($password->getHash())]
+                    );
+                $mreplaces['link_validity'] = $link_validity->format(_T("Y-m-d H:i:s"));
+            } else {
+                $str = str_replace(
+                    '%s',
+                    $member->sfullname,
+                    _T("An error occurred storing temporary password for %s. Please inform an admin.")
+                );
+                $this->history->add($str);
+                $this->flash->addMessage(
+                    'error_detected',
+                    $str
+                );
+            }
+        }
+
+        // Get email text in database
+        $texts = new Texts(
+            $this->preferences,
+            $this->router,
+            $mreplaces
+        );
+
+        $mlang = $member->language;
+        $mtxt = $texts->getTexts(
+            (($new) ? 'sub' : 'accountedited'),
+            $mlang
+        );
+
+        $mail = new GaletteMail($this->preferences);
+        $mail->setSubject($texts->getSubject());
+        $mail->setRecipients(
+            array(
+                $member->getEmail() => $member->sname
+            )
+        );
+        $mail->setMessage($texts->getBody());
+        $sent = $mail->send();
+
+        if ($sent == GaletteMail::MAIL_SENT) {
+            $msg = str_replace(
+                '%s',
+                $member->sname . ' (' . $member->getEmail() . ')',
+                ($new) ?
+                _T("New account email sent to '%s'.") : _T("Account modification email sent to '%s'.")
+            );
+            $this->history->add($msg);
+            $success_detected[] = $msg;
+        } else {
+            $str = str_replace(
+                '%s',
+                $member->sname . ' (' . $member->getEmail() . ')',
+                _T("A problem happened while sending account email to '%s'")
+            );
+            $this->history->add($str);
+            $error_detected[] = $str;
+        }
+    }
+
+    /**
+     * Send account email to admin
+     *
+     * @param Adherent $member Member
+     * @param boolean  $new    New member or editing existing one
+     *
+     * @return void
+     */
+    private function sendAdminEmail(Adherent $member, $new)
+    {
+        if (
+            $this->preferences->pref_mail_method == GaletteMail::METHOD_DISABLED
+            || !$this->preferences->pref_bool_mailadh
+            || (!$new && $member->id != $this->login->id)
+        ) {
+            return;
+        }
+
+
+        $mreplaces = $this->getReplacements($member);
+        $texts = new Texts(
+            $this->preferences,
+            $this->router,
+            $mreplaces
+        );
+
+        $txt_id = null;
+        if ($new) {
+            $txt_id = ($member->self_adh ? 'newselfadh' : 'newadh');
+        } else {
+            $txt_id = 'admaccountedited';
+        }
+
+        $mlang = $this->preferences->pref_lang;
+        $mtxt = $texts->getTexts(
+            $txt_id,
+            $mlang
+        );
+
+        $mail = new GaletteMail($this->preferences);
+        $mail->setSubject($texts->getSubject());
+        $recipients = [];
+        foreach ($this->preferences->vpref_email_newadh as $pref_email) {
+            $recipients[$pref_email] = $pref_email;
+        }
+        $mail->setRecipients($recipients);
+        $mail->setMessage($texts->getBody());
+        $sent = $mail->send();
+
+        if ($sent == GaletteMail::MAIL_SENT) {
+            $msg = $new ?
+                str_replace(
+                    '%s',
+                    $member->sname . ' (' . $member->email . ')',
+                    _T("New account email sent to admin for '%s'.")
+                ) : _T("Account modification email sent to admin.");
+
+            $this->history->add($msg);
+            $this->flash->addMessage(
+                'success_detected',
+                $msg
+            );
+        } else {
+            $msg = $new ?
+                str_replace(
+                    '%s',
+                    $member->sname . ' (' . $member->email . ')',
+                    _T("A problem happened while sending email to admin for account '%s'.")
+                ) : _T("A problem happened while sending account email to admin");
+
+            $this->history->add($msg);
+            $this->flash->addMessage(
+                'warning_detected',
+                $msg
+            );
+        }
+    }
+}