When a user creates a new entry, it should send a mail to all other users that new entry has created. It is sending the mail but it is sending all
the user mails. for example i am having 5 users each user is suppose to get one mail, but they are getting 5 mails which i don't want.
I checked the code but i am unable to trace the bug.
// Disallow direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* LyftenBloggie Framework Settings class
*
* @static
* @package LyftenBloggie
* @since 1.1.0
**/
class BloggieEmail extends JObject
{
var $_template;
var $_db;
var $_file;
var $_values = array();
var $_emails = array();
/**
* Constructor
*/
function BloggieEmail()
{
parent::__construct();
$this->_db = & JFactory::getDBO();
}
/**
* Returns a reference to a global Settings object, only creating it
* if it doesn't already exist.
*
* This method must be invoked as:
* $emailer = & BloggieEmail::getInstance();
*
* @access public
* @return BloggieEmail object.
*/
function &getInstance($sig = 'default')
{
static $instance;
if (!isset($instance)) {
$instance = array();
}
if (!isset($instance[$sig]))
{
$instance[$sig] = new BloggieEmail();
}
return $instance[$sig];
}
/**
* Template file name
*
* @param string $file
* @return void
**/
public function setTemplate($file)
{
$file = str_replace('.tpl', '', $file);
$this->_file = $file;
}
/**
* Method to determine to whom the email goes
*
* @return object
*/
function emailWho($entry_id = null)
{
//Emails from permissions
$query = 'SELECT r.group'
. ' FROM #__bloggies_groups AS r'
. ' WHERE r.email_all = \'1\''
. ' GROUP BY r.group';
$this->_db->setQuery( $query );
$groups = $this->_db->loadResultArray();
$groups = implode( ',', $groups );
$query = 'SELECT u.name, u.email, u.gid'
. ' FROM #__users AS u'
. ' WHERE u.gid IN ('. $groups .')';
$this->_db->setQuery( $query );
$emails = $this->_db->loadObjectList();
//Email from entry
if($entry_id)
{
//Set entry to template
$this->setEntry($entry_id);
//Lookup author email
$query = 'SELECT u.name, u.email, u.gid'
. ' FROM #__bloggies_entries AS e'
. ' LEFT JOIN #__users AS u ON u.id = e.created_by'
. ' WHERE e.id = \''.$entry_id.'\'';
$this->_db->setQuery( $query );
$users = $this->_db->loadObjectList();
$emails = array_merge((array)$emails, (array)$users);
}
//Set them to the Object
if(!empty($emails))
{
foreach($emails as $email)
{
//Get access group
$accessGroups = BloggieAccess::getInstance($email->gid);
//Ensure the user can get the email
// if($accessGroups->get('emails.'.$this->_file) || $accessGroups->get('emails.receive_all'))
if($accessGroups->get('emails.'.$this->_file) || $accessGroups->get('emails.receive_all'))
{
$this->_emails[$email->email] = $email->name;
}
}
}
unset($emails);
return !empty($this->_emails);
}
/**
* Method to set entry to the template
*
* @return object
*/
function setEntry($entry_id = null)
{
if(!$entry_id) return;
$query = 'SELECT e.title,'
. ' CASE WHEN CHAR_LENGTH(e.alias) THEN CONCAT_WS(":", e.id, e.alias) ELSE e.id END as slug,'
. ' CASE WHEN CHAR_LENGTH(c.slug) THEN c.slug ELSE 0 END as catslug'
. ' FROM #__bloggies_entries AS e'
. ' LEFT JOIN #__bloggies_categories AS c ON c.id = e.catid'
. ' WHERE e.id = '.$entry_id
;
$this->_db->setQuery($query);
$entry = $this->_db->loadAssoc();
$entry['url'] = JRoute::_(JURI::base().'index.php?option=com_lyftenbloggie&view=entry&category='.$entry['catslug'].'&id='. $entry['slug']);
unset($entry['slug']);
unset($entry['catslug']);
//assign entry to template
$this->assign('entry', $entry);
}
/**
* Method to create a Joomla Mailer
*
* @return object
*/
function createMailObj($subject)
{
global $mainframe;
/**
* Method to send email
*
* @return boolean
*/
function sendMail($subject)
{
//Create Mailer
$mailer = $this->createMailObj($subject);
// Check if mail address is valid.
$regexp = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$";
//Send each email separately
foreach ($this->_emails as $email=>$user)
{
if(!empty($email) && eregi($regexp, $email))
{
$mailer->AddAddress($email);
$this->assign('receiver.name', $user);
//set body and send
if($body = $this->output())
{
$mailer->setBody($body);
$mailer->Send();
}
}
}
return true;
}
/**
* Get output from template
*
* @return string
**/
public function output()
{
if (!file_exists(BLOGGIE_ADMIN_PATH.DS.'framework'.DS.'emails'.DS.$this->_file.'.tpl')) return;
Did you made this yourself or did you get/copy it from somewhere. I have to admit, that PHP isn't my strongest point but I find this quite a sript for just seding an email. I noticed the use of array's in your script as well what I find very unusual. A wild guess is that you keep looping, until the last message is sent which is the reason why everyone receives multiple nails
Bookmarks