From f51c3d89d5118e45914a1de7f6bdb03dd559e32e Mon Sep 17 00:00:00 2001 From: Antonio Gallo Date: Wed, 26 Jan 2011 03:05:35 +0000 Subject: added mail notifications for talk messages --- h-source/Application/Controllers/MyController.php | 2 +- h-source/Application/Include/myFunctions.php | 20 ++++++++ h-source/Application/Include/params.php | 27 +++++++++++ h-source/Application/Models/HardwareModel.php | 5 +- h-source/Application/Models/NorepeatModel.php | 35 -------------- h-source/Application/Models/ProfileModel.php | 8 +++- h-source/Application/Models/TalkModel.php | 57 ++++++++++++++++++++++- h-source/tables.sql | 3 +- 8 files changed, 115 insertions(+), 42 deletions(-) delete mode 100644 h-source/Application/Models/NorepeatModel.php diff --git a/h-source/Application/Controllers/MyController.php b/h-source/Application/Controllers/MyController.php index c2b715f..d1e346c 100644 --- a/h-source/Application/Controllers/MyController.php +++ b/h-source/Application/Controllers/MyController.php @@ -158,7 +158,7 @@ class MyController extends BaseController if (!$this->s['registered']->checkCsrf($this->viewArgs['token'])) $this->redirect($this->controller.'/home/'.$this->lang,2,'wrong token..'); - $this->m['ProfileModel']->setFields('real_name,website,where_you_are,birth_date,fav_distro,projects,publish_mail,description','sanitizeAll'); + $this->m['ProfileModel']->setFields('real_name,website,where_you_are,birth_date,fav_distro,projects,publish_mail,send_notification,description','sanitizeAll'); $clean['id_user'] = (int)$this->s['registered']->status['id_user']; diff --git a/h-source/Application/Include/myFunctions.php b/h-source/Application/Include/myFunctions.php index 7e509cd..5c64317 100644 --- a/h-source/Application/Include/myFunctions.php +++ b/h-source/Application/Include/myFunctions.php @@ -392,3 +392,23 @@ function goToModeratedItem( $row = array() ) } return 'http://'.DOMAIN_NAME.'/'.$url; } + +function getUrlsFromIdHard($id_hard) +{ + $clean['id_hard'] = (int)$id_hard; + + $urlView = "http://".DOMAIN_NAME; + $urlTalk = "http://".DOMAIN_NAME; + + $hard = new HardwareModel(); + $res = $hard->select('type,model')->where(array('id_hard'=>$clean['id_hard']))->send(); + if (count($res) > 0) + { + $urlView = "http://".DOMAIN_NAME."/".MyStrings::$reverse[$res[0]['hardware']['type']]."/view/".Lang::$current."/".$clean['id_hard']."/".encodeUrl($res[0]['hardware']['model']); + + $urlTalk = "http://".DOMAIN_NAME."/".MyStrings::$reverse[$res[0]['hardware']['type']]."/talk/".Lang::$current."/".$clean['id_hard']; + } + + return array('urlView'=>$urlView,'urlTalk'=>$urlTalk); + +} \ No newline at end of file diff --git a/h-source/Application/Include/params.php b/h-source/Application/Include/params.php index 7547643..1d3533b 100644 --- a/h-source/Application/Include/params.php +++ b/h-source/Application/Include/params.php @@ -141,5 +141,32 @@ class Account } } + + static public function sendTalkNotice($who,$e_mails,$id_hard) + { + require_once (ROOT.'/External/swiftmailer/lib/swift_required.php'); + + $who = sanitizeAll($who); + $id_hard = (int)$id_hard; + + $siteName = Website::$generalName; + $siteMail = Website::$generalMail; + + $urls = getUrlsFromIdHard($id_hard); + + $mess = "$who has added a message to the talk page of a device you have contributed to maintain at $siteName\n\nThe whole conversation is here:\n\n".$urls['urlTalk']."\n\nThe device page is here:\n\n".$urls['urlView']."\n\nBest regards\nthe ".Website::$projectName." team\n\nP.S: you can disable the mail notifications in the profile page of your control panel"; + + $message = Swift_Message::newInstance()->setSubject("$who sent a notice to your attention")->setFrom(array($siteMail => $siteName))->setTo($e_mails)->setBody($mess); + + //Create the Transport + $transport = Swift_SmtpTransport::newInstance(Website::$mailServer, 25)->setUsername(Website::$generalMail)->setPassword(Website::$mailPassword); + + //Create the Mailer using your created Transport + $mailer = Swift_Mailer::newInstance($transport); + + //Send the message + $result = $mailer->batchSend($message); + + } } \ No newline at end of file diff --git a/h-source/Application/Models/HardwareModel.php b/h-source/Application/Models/HardwareModel.php index fb41fa3..d4c9a47 100644 --- a/h-source/Application/Models/HardwareModel.php +++ b/h-source/Application/Models/HardwareModel.php @@ -39,8 +39,9 @@ class HardwareModel extends Model_Map { $this->_tables='hardware,regusers,hardware_users'; $this->_idFields='id_hard,id_user'; $this->_where=array( - 'type' => 'hardware', - 'username' => 'regusers', + 'type' => 'hardware', + 'username' => 'regusers', + 'id_user' => 'regusers', 'has_confirmed' => 'regusers', 'deleted' => 'regusers', '-deleted' => 'hardware' diff --git a/h-source/Application/Models/NorepeatModel.php b/h-source/Application/Models/NorepeatModel.php deleted file mode 100644 index 39938b6..0000000 --- a/h-source/Application/Models/NorepeatModel.php +++ /dev/null @@ -1,35 +0,0 @@ -. - -if (!defined('EG')) die('Direct access not allowed!'); - -class NorepeatModel extends Model_Tree { - - public function insert() - { - parent::insert(); - if ($this->queryResult) - { - header('Refresh: 0;url=http://'.DOMAIN_NAME.$_SERVER['REQUEST_URI']); - exit; - } - } - -} \ No newline at end of file diff --git a/h-source/Application/Models/ProfileModel.php b/h-source/Application/Models/ProfileModel.php index 6c0071f..c8818b4 100644 --- a/h-source/Application/Models/ProfileModel.php +++ b/h-source/Application/Models/ProfileModel.php @@ -35,7 +35,8 @@ class ProfileModel extends Model_Tree { $this->softConditions['update'] = array( "checkLength|90" => "real_name,where_you_are,fav_distro,birth_date,website|the fields 'real name', 'where_you_are', 'favorite distro', 'website' and 'birthdate' don't have to have more than 90 characters", "checkLength|1000" => "projects,description|the fields 'projects' and 'description' don't have to have more than 1000 characters", - "checkIsStrings|no,yes" => "publish_mail" + "checkIsStrings|no,yes" => "publish_mail", + "+checkIsStrings|no,yes" => "send_notification" ); parent::__construct(); @@ -58,6 +59,11 @@ class ProfileModel extends Model_Tree { 'options' => 'no,yes', 'labelString'=> 'Would you like to publish your e-mail address?' ), + 'send_notification' => array( + 'type' => 'Select', + 'options' => 'yes,no', + 'labelString'=> 'Would you like to receive mail notifications?' + ), 'description' => array( 'type' => 'Textarea', 'labelString'=> 'Your description' diff --git a/h-source/Application/Models/TalkModel.php b/h-source/Application/Models/TalkModel.php index d6d935b..e29e073 100644 --- a/h-source/Application/Models/TalkModel.php +++ b/h-source/Application/Models/TalkModel.php @@ -20,14 +20,16 @@ if (!defined('EG')) die('Direct access not allowed!'); -class TalkModel extends NorepeatModel { +class TalkModel extends Model_Tree { public function __construct() { $this->_tables = 'talk'; $this->_idFields = 'id_talk'; $this->_where=array( - 'id_hard' => 'talk' + 'id_hard' => 'talk', + 'has_confirmed' => 'regusers', + '-deleted' => 'regusers', ); $this->orderBy = 'talk.id_talk desc'; @@ -41,6 +43,57 @@ class TalkModel extends NorepeatModel { parent::__construct(); } + public function insert() + { + if (parent::insert()) + { + if (strcmp($this->values['id_hard'],0) !== 0) + { + $clean['id_hard'] = (int)$this->values['id_hard']; + $clean['created_by'] = (int)$this->values['created_by']; + + $hard = new HardwareModel(); + $users = $hard->select('username,e_mail') + ->where(array('id_hard'=>$clean['id_hard'],'has_confirmed'=>0,'deleted'=>'no')) + ->toList('regusers.username','regusers.e_mail') + ->send('Boxes'); + + $talkUsers = $this->select('username,e_mail') + ->from('talk inner join regusers') + ->on('talk.created_by = regusers.id_user') + ->where(array('id_hard'=>$clean['id_hard'],'has_confirmed'=>0,'-deleted'=>'no')) + ->toList('regusers.username','regusers.e_mail') + ->send(); + + $allUsers = array_merge($users,$talkUsers); + + $userObj = new UsersModel(); + $myName = $userObj->getUser($clean['created_by']); + + $arrayE = new ArrayExt(); + $fusers = $arrayE->subsetComplementary($allUsers,$myName); + + //remove users that do not want the email notification + $inString = "'".implode("','",array_keys($fusers))."'"; + $profile = new ProfileModel(); + $ffusers = $profile->select('username,e_mail') + ->from('regusers inner join profile') + ->on('regusers.id_user = profile.created_by') + ->where(array('send_notification'=>'yes','username'=>"in($inString)")) + ->toList('regusers.username','regusers.e_mail') + ->send(); + + $ffusers = array_flip($ffusers); + + //send the notice + Account::sendTalkNotice($myName,$ffusers,$clean['id_hard']); + + header('Refresh: 0;url=http://'.DOMAIN_NAME.$_SERVER['REQUEST_URI']); + exit; + } + } + } + public $formStruct = array( 'entries' => array( 'title' => array(), diff --git a/h-source/tables.sql b/h-source/tables.sql index 8d38e81..a447d71 100644 --- a/h-source/tables.sql +++ b/h-source/tables.sql @@ -159,7 +159,8 @@ create table profile ( projects text CHARACTER SET utf8 not null , publish_mail char(4) not null default 'no', description text CHARACTER SET utf8 not null, - website varchar(100) CHARACTER SET utf8 not null + website varchar(100) CHARACTER SET utf8 not null, + send_notification char(4) not null default 'yes' )engine=innodb; create table issues ( -- cgit v1.2.3