%PDF- %PDF-
Direktori : /home/lightco1/www/administrator/components/com_joomailermailchimpintegration/controllers/ |
Current File : /home/lightco1/www/administrator/components/com_joomailermailchimpintegration/controllers/send.php |
<?php /** * Copyright (C) 2015 freakedout (www.freakedout.de) * This program 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. * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. **/ // no direct access defined('_JEXEC') or die('Restricted Access'); class joomailermailchimpintegrationControllerSend extends joomailermailchimpintegrationController { public function __construct() { parent::__construct(); } public function cancel() { $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=archive'); } public function send() { $db = JFactory::getDBO(); $params = JComponentHelper::getParams('com_joomailermailchimpintegration'); $archiveDir = $params->get('params.archiveDir', '/administrator/components/com_joomailermailchimpintegration/archive'); $clientDetails = $this->getModel('send')->getClientDetails(); $listId = JRequest::getVar('listId', '', 'post', 'string'); $time = JRequest::getVar('time', 0, '', 'string'); $test = JRequest::getVar('test', 0, 'post', 'int'); $trackOpens = (bool)JRequest::getBool('trackOpens', false, 'post'); $trackHTML = (bool)JRequest::getBool('trackHTML', false, 'post'); $trackText = (bool)JRequest::getBool('trackText', false, 'post'); $ecomm360 = (bool)JRequest::getBool('ecomm360', false, 'post'); $campaignType = JRequest::getVar('campaignType', 0, 'post'); $offsetTime = JRequest::getVar('offset-time', 0, 'post'); $offsetUnits = JRequest::getVar('offset-units', 0, 'post'); $offsetDir = JRequest::getVar('offset-dir', 0, 'post'); $event = JRequest::getVar('event', 0, 'post'); $mergefield = JRequest::getVar('mergefield', 0, 'post'); $emails = JRequest::getVar('email', array(), '', 'array'); $emails = array_unique(array_values(array_filter($emails))); $timewarp = JRequest::getVar('timewarp', 0, '', 'int'); $schedule = JRequest::getVar('schedule', 0, '', 'int'); if ($schedule) { $deliveryDate = JRequest::getVar('deliveryDate', 'Immediately', '', 'string'); $deliveryTime = JRequest::getVar('deliveryTime', '', '', 'string'); if ($deliveryDate != 'Immediately') { $delivery = $deliveryDate . ' ' . $deliveryTime . ':00'; // convert time to GMT setlocale(LC_TIME, 'en_GB'); $delivery = gmstrftime("%Y-%m-%d %H:%M:%S", strtotime($delivery)); } else { $delivery = 'Immediately'; } } $useSegments = JRequest::getVar('useSegments', 0, '', 'int'); if ($useSegments) { $type = $condition = $conditionDetailValue = array(); for ($i = 1; $i < 11; $i++) { $type[] = JRequest::getVar('segmenttype' . $i, ''); $condition[] = JRequest::getVar('segmentTypeCondition_' . $i, ''); $conditionDetailValue[] = JRequest::getVar('segmentTypeConditionDetailValue_' . $i, ''); } // remove empty values $type = array_values(array_filter($type)); $condition = array_values(array_filter($condition)); $conditionDetailValue = array_values(array_filter($conditionDetailValue)); $conditions = array(); for ($i = 0; $i < count($type); $i++) { if (is_numeric($type[$i])) { $type[$i] = 'interests-' . $type[$i]; } $conditions[] = array( 'field' => $type[$i], 'op' => $condition[$i], 'value' => $conditionDetailValue[$i] ); } $segment_opts = array( 'match' => JRequest::getVar('match', 'any', 'post', 'string'), 'conditions' => $conditions ); } else { $segment_opts = ''; } $query = $db->getQuery(true) ->select('*') ->from('#__joomailermailchimpintegration_campaigns') ->where($db->qn('creation_date') . ' = ' . $db->q($time)); $db->setQuery($query); $cDetails = $db->loadObject(); $cData = json_decode($cDetails->cdata); $campaign_name_ent = JApplication::stringURLSafe($cDetails->name); if (isset($cData->text_only) && $cData->text_only) { $filename = JPATH_SITE . $archiveDir . '/' . $campaign_name_ent . '.txt'; $content = JFile::read($filename); $content = array('text' => $content); } else { if (isset($_SERVER['LOCALSYSTEM'])) { $html_file = 'https://www.freakedout.de/tmp/' . $campaign_name_ent . '.html'; } else { $html_file = JURI::root() . (substr($archiveDir, 1)) . '/' . $campaign_name_ent . '.html'; } //$html_file = JURI::root() . (substr($archiveDir, 1)) . '/' . $campaign_name_ent . '.html'; $content = array('url' => $html_file); // remove cache-preventing meta tags from campaign to avoid rendering issues in email clients $metaData = array("<meta http-Equiv=\"Cache-Control\" Content=\"no-cache\">\n", "<meta http-Equiv=\"Pragma\" Content=\"no-cache\">\n", "<meta http-Equiv=\"Expires\" Content=\"0\">\n"); $filename = JPATH_SITE . $archiveDir . '/' . $campaign_name_ent . '.html'; $template = JFile::read($filename); $template = str_replace($metaData, '', $template); $handle = JFile::write($filename, $template); } $lists = $this->getModel('send')->getMcObject()->lists(); $memberCount = false; foreach($lists as $list){ if ($list['id'] == $listId){ $memberCount = $list['member_count']; break; } } // break if listId is invalid if ($memberCount === false) { $this->app->enqueueMessage(JText::_('JM_PLEASE_SELECT_A_LIST'), 'error'); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=send&campaign=' . $time); } if (!$test && $clientDetails['plan_type'] == 'free' && $memberCount > 2000) { $this->app->enqueueMessage(JText::_('JM_TO_MANY_RECIPIENTS'), 'error'); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=send&campaign=' . $time); } // submit to MC $type = ($cData->text_only) ? 'plaintext' : 'regular'; $opts['list_id'] = $listId; $opts['title'] = $cDetails->name; $opts['subject'] = $cDetails->subject; if (!$test && $schedule && $timewarp) { $opts['timewarp'] = true; } $opts['from_email'] = $cDetails->from_email; $opts['from_name'] = $cDetails->from_name; $opts['tracking']= array( 'opens' => $trackOpens, 'html_clicks' => $trackHTML, 'text_clicks' => $trackText ); $opts['ecomm360'] = $ecomm360; $opts['authenticate'] = true; // $opts['analytics'] = array('google'=>'my_google_analytics_key'); $opts['inline_css'] = true; $opts['generate_text'] = true; $opts['auto_footer'] = false; $opts['folder_id'] = $cDetails->folder_id; //Check for auto_tweet if (JRequest::getVar('useTwitter', false)) { $opts['auto_tweet'] = true; } //Check for autoresponder $type_opts = array(); if ($campaignType == 1) { $type = 'auto'; $type_opts['offset-units'] = $offsetUnits; $type_opts['offset-time'] = $offsetTime; $type_opts['offset-dir'] = $offsetDir; $type_opts['event'] = $event; $type_opts['event-datemerge'] = $mergefield; // TODO: implement autoresponder folders unset($opts['folder_id']); } $camapignId = $this->getModel('send')->getMcObject()->campaignCreate($type, $opts, $content, $segment_opts, $type_opts); if (!$this->getModel('send')->getMcObject()->errorCode) { if ($test) { $this->getModel('send')->getMcObject()->campaignSendTest($camapignId, $emails); if ($this->getModel('send')->getMcObject()->errorCode) { $msg = MCerrorHandler::getErrorMsg($this->getModel('send')->getMcObject()); $this->app->enqueueMessage($msg , 'error'); } else { $this->app->enqueueMessage(JText::_('JM_TEST_CAMPAIGN_SENT')); } // wait 5 seconds for the TEST campaign to be sent before we delete it from MC sleep(5); $this->getModel('send')->getMcObject()->campaignDelete($camapignId); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=send&campaign=' . $time); } else { if ($schedule) { $this->getModel('send')->getMcObject()->campaignSchedule($camapignId, $delivery); } else { $this->getModel('send')->getMcObject()->campaignSendNow($camapignId); } } } if ($this->getModel('send')->getMcObject()->errorCode) { $msg = MCerrorHandler::getErrorMsg($this->getModel('send')->getMcObject()); $this->app->enqueueMessage($msg, 'error'); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=send&campaign=' . $time); } else { // clear reports cache $this->getModel('main')->cache('joomlamailerReports')->clean('joomlamailerReports'); if ($schedule) { $query = $db->getQuery(true) ->update('#__joomailermailchimpintegration_campaigns') ->set($db->qn('sent') . ' = ' . $db->q(1)) ->set($db->qn('cid') . ' = ' . $db->q($camapignId)) ->where($db->qn('creation_date') . ' = ' . $db->q($time)); $db->setQuery($query); $db->execute(); $this->app->enqueueMessage(JText::_('JM_CAMPAIGN_SCHEDULED')); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=main'); } else { $query = $db->getQuery(true) ->update('#__joomailermailchimpintegration_campaigns') ->set($db->qn('sent') . ' = ' . $db->q(2)) ->set($db->qn('cid') . ' = ' . $db->q($camapignId)) ->where($db->qn('creation_date') . ' = ' . $db->q($time)); $db->setQuery($query); $db->execute(); if ($campaignType == 1) { $msg = JText::_('JM_AUTORESPONDER_CREATED'); } else { $msg = JText::_('JM_CAMPAIGN_SENT'); } $this->app->enqueueMessage($msg); $this->app->redirect('index.php?option=com_joomailermailchimpintegration&view=campaigns'); } } } public function getSegmentFields() { JHTML::_('behavior.calendar'); $dc = $this->getmodel('main')->getMailChimpDataCenter(); $listId = JRequest::getVar('listId', '', 'post', 'string'); $type = JRequest::getVar('type', '', 'post', 'string'); $condition = JRequest::getVar('condition', '', 'post', 'string'); $condition = JRequest::getVar('condition', '', 'post', 'string'); $conditionDetail = JRequest::getVar('conditionDetail', '', 'post', 'string'); $num = JRequest::getVar('num', '', 'post', 'string'); $interests = $this->getModel('send')->getInterestGroupings($listId); if ($interests){ foreach($interests as $int){ $ints[] = $int['name']; $intIds[] = $int['id']; foreach($int['groups'] as $group){ $intVals[$int['id']][] = $group['name']; } } } $mergevars = $this->getModel('send')->getMergeVars($listId); $mvTags = array(); if ($mergevars){ foreach($mergevars as $mv){ if (!in_array($mv['tag'], array('EMAIL', 'FNAME', 'LNAME'))) { $mvs[] = $mv['name']; $mvTags[] = $mv['tag']; $mvTypes[$mv['tag']] = $mv['field_type']; if (isset($mv['choices'])) { foreach ($mv['choices'] as $group) { $mvVals[$mv['tag']][] = $group; } } } } } if ($type == 'date') { $campaigns = $this->getModel('send')->getSentCampaigns(); if (isset($campaigns[0])) { $disabled = ''; $campaignDate = $campaigns[0]['send_time']; $noCampain = ''; } else { $disabled = 'disabled="disabled"'; $campaignDate = '(' . JText::_('JM_NO_CAMPAIGN_SENT') . ')'; $noCampain = ' - (' . JText::_('JM_NO_CAMPAIGN_SENT') . ')'; $conditionDetail = 'date'; } $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="gt" '.(($condition=='gt')?'selected="selected"':'').'>'.JText::_('JM_IS_AFTER').'</option> <option value="lt" '.(($condition=='lt')?'selected="selected"':'').'>'.JText::_('JM_IS_BEFORE').'</option> <option value="eq" '.(($condition=='eq')?'selected="selected"':'').'>'.JText::_('JM_IS').'</option> </select> <select name="segmentTypeConditionDetail_'.$num.'" id="segmentTypeConditionDetail_'.$num.'" onchange="getSegmentFields(\'#segmentTypeConditionDiv_'.$num.'\', '.$num.');"> <option value="last" '.$disabled.'>'.JText::_('JM_THE_LAST_CAMPAIGN_WAS_SENT').' - '.substr($campaignDate,0, -9).'</option> <option value="campaign" '.$disabled; if ($conditionDetail=='campaign') { $response['html'] .= ' selected="selected"'; } $response['html'] .= '>'.JText::_('JM_A_SPECIFIC_CAMPAIGN_WAS_SENT').$noCampain.'</option>' . '<option value="date"'; if ($conditionDetail=='date') $response['html'] .= ' selected="selected"'; $response['html'] .= '>'.JText::_('JM_A_SPECIFIC_DATE').'</option> </select>'; if ($conditionDetail == 'campaign') { $response['html'] .= '<div id="segmentTypeConditionDiv_'.$num.'" class="segmentTypeConditionDetailDiv" style="top:0;">' .'<select name="segmentTypeConditionDetailValue_'.$num.'" id="segmentTypeConditionDetailValue_'.$num.'">'; foreach($campaigns as $campaign){ if (strlen($campaign['title'])>16){ $campaign['title'] = substr($campaign['title'],0,13).'...'; } $response['html'] .= '<option value="'.$campaign['send_time'].'">'.$campaign['title'].' ('.substr($campaign['send_time'],0, -9).')</option>'; } $response['html'] .= '</select>'; } else if ($conditionDetail=='date'){ $response['html'] .= '<div id="segmentTypeConditionDiv_'.$num.'" class="segmentTypeConditionDetailDiv">'; $response['html'] .= JHTML::calendar(date('Y-m-d'), 'segmentTypeConditionDetailValue_'.$num.'', 'segmentTypeConditionDetailValue_'.$num.'', '%Y-%m-%d', array('size'=>'12', 'maxlength'=>'10' )); $response['html'] .= '</div>'; $response['js'] = 'Calendar.setup({inputField : "segmentTypeConditionDetailValue_'.$num.'", ifFormat : "%Y-%m-%d", button : "segmentTypeConditionDetailValue_'.$num.'_img", align : "Tl", singleClick : true });'; } else { $response['html'] .= '<input type="hidden" value="'.$campaigns[0]['send_time'].'" name="segmentTypeConditionDetailValue_'.$num.'" id="segmentTypeConditionDetailValue_'.$num.'" /></div>'; } } else if ($type=='email' || $type=='fname' || $type=='lname') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="eq">'.JText::_('JM_IS').'</option> <option value="ne">'.JText::_('JM_IS_NOT').'</option> <option value="like">'.JText::_('JM_CONTAINS').'</option> <option value="nlike">'.JText::_('JM_DOES_NOT_CONTAIN').'</option> <option value="starts">'.JText::_('JM_STARTS_WITH').'</option> <option value="ends">'.JText::_('JM_ENDS_WITH').'</option> <option value="gt">'.JText::_('JM_IS_GREATER_THAN').'</option> <option value="lt">'.JText::_('JM_IS_LESS_THAN').'</option> </select> <div id="segmentTypeConditionDiv_'.$num.'" class="segmentTypeConditionDetailDiv"> <input type="text" value="" id="segmentTypeConditionDetailValue_'.$num.'" name="segmentTypeConditionDetailValue_'.$num.'"/> </div>'; } else if ($interests && in_array($type, $intIds)) { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="one">'.JText::_('JM_ONE_OF').'</option> <option value="all">'.JText::_('JM_ALL_OF').'</option> <option value="none">'.JText::_('JM_NONE_OF').'</option> </select> <div id="segmentTypeConditionDiv_'.$num.'" class="segmentTypeConditionDetailDiv"> <select multiple="multiple" size="3" id="segmentTypeConditionDetailValue_'.$num.'" name="segmentTypeConditionDetailValue_'.$num.'">'; foreach($intVals[$type] as $val) { $response['html'] .= '<option value="'.$val.'">'.$val.'</option>'; } $response['html'] .= '</select></div>'; } else if ($mergevars && in_array($type, $mvTags)) { if ($mvTypes[$type] == 'radio' || $mvTypes[$type] == 'dropdown') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="eq">'.JText::_('JM_IS').'</option> <option value="ne">'.JText::_('JM_IS_NOT').'</option> </select> <div id="segmentTypeConditionDiv_'.$num.'" class="segmentTypeConditionDetailDiv"> <select multiple="multiple" size="3" id="segmentTypeConditionDetailValue_'.$num.'" name="segmentTypeConditionDetailValue_'.$num.'">'; foreach($mvVals[$type] as $val){ $response['html'] .= '<option value="'.$val.'">'.$val.'</option>'; } $response['html'] .= '</select></div>'; } else if ($mvTypes[$type] == 'date') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="gt">'.JText::_('JM_IS_AFTER').'</option> <option value="lt">'.JText::_('JM_IS_BEFORE').'</option> <option value="eq">'.JText::_('JM_IS').'</option> <option value="ne">'.JText::_('JM_IS_NOT').'</option> </select>'; $response['html'] .= '<div id="segmentTypeConditionDiv_'.$num.'" class="segmentTypeConditionDetailDiv">'; $response['html'] .= JHTML::calendar(date('Y-m-d'), 'segmentTypeConditionDetailValue_'.$num.'', 'segmentTypeConditionDetailValue_'.$num.'', '%Y-%m-%d', array('size'=>'12', 'maxlength'=>'10' )); $response['html'] .= '</div>'; $response['js'] = 'Calendar.setup({inputField : "segmentTypeConditionDetailValue_'.$num.'", ifFormat : "%Y-%m-%d", button : "segmentTypeConditionDetailValue_'.$num.'_img", align : "Tl", singleClick : true });'; } else { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="eq">'.JText::_('JM_IS').'</option> <option value="ne">'.JText::_('JM_IS_NOT').'</option> <option value="like">'.JText::_('JM_CONTAINS').'</option> <option value="nlike">'.JText::_('JM_DOES_NOT_CONTAIN').'</option> <option value="starts">'.JText::_('JM_STARTS_WITH').'</option> <option value="ends">'.JText::_('JM_ENDS_WITH').'</option> <option value="gt">'.JText::_('JM_IS_GREATER_THAN').'</option> <option value="lt">'.JText::_('JM_IS_LESS_THAN').'</option> </select> <div id="segmentTypeConditionDiv_'.$num.'" class="segmentTypeConditionDetailDiv"> <input type="text" value="" id="segmentTypeConditionDetailValue_'.$num.'" name="segmentTypeConditionDetailValue_'.$num.'"/> </div>'; } } else if ($type == 'rating') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="eq">'.JText::_('JM_IS').'</option> <option value="ne">'.JText::_('JM_IS_NOT').'</option> <option value="gt">'.JText::_('JM_IS_GREATER_THAN').'</option> <option value="lt">'.JText::_('JM_IS_LESS_THAN').'</option> </select> <ul class="memberRating" data-num="' . $num . '">'; for ($i = 1; $i < 6; $i++) { $response['html'] .= '<li class="rating_' . $i . '" value="' . $i . '"></li>'; } $response['html'] .= '</ul> <input type="hidden" value="0" name="segmentTypeConditionDetailValue_' . $num . '" id="segmentTypeConditionDetailValue_' . $num . '" />'; } else if ($type == 'aim') { $campaigns = $this->getModel('send')->getSentCampaigns(); $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="open">'.JText::_('JM_OPENED_').'</option> <option value="noopen">'.JText::_('JM_NOT_OPENED_').'</option> <option value="click">'.JText::_('JM_CLICKED').'</option> <option value="noclick">'.JText::_('JM_NOT_CLICKED').'</option> </select> <select name="segmentTypeConditionDetailValue_'.$num.'" id="segmentTypeConditionDetailValue_'.$num.'"> <option value="any">'.JText::_('JM_ANY_CAMPAIGN').'</option>'; foreach($campaigns as $campaign){ $response['html'] .= '<option value="'.$campaign['id'].'">'.$campaign['title'].' ('.$campaign['send_time'].')</option>'; } $response['html'] .= '</select>'; } else if ($type == 'social_network') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="member">'.JText::_('JM_IS_A_MEMBER_OF').'</option> <option value="notmember">'.JText::_('JM_IS_NOT_A_MEMBER_OF').'</option> </select> <select name="segmentTypeConditionDetailValue_'.$num.'" id="segmentTypeConditionDetailValue_'.$num.'"> <option value="twitter">Twitter</option> <option value="facebook">Facebook</option> <option value="myspace">MySpace</option> <option value="linkedin">LinkedIn</option> <option value="flickr">Flickr</option>'; $response['html'] .= '</select>'; } else if ($type == 'social_influence') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="eq">'.JText::_('JM_IS').'</option> <option value="ne">'.JText::_('JM_IS_NOT').'</option> <option value="gt">'.JText::_('JM_IS_GREATER_THAN').'</option> <option value="lt">'.JText::_('JM_IS_LESS_THAN').'</option> </select> <div style="margin-bottom:11px;"> <ul class="memberRating" onmouseout="restoreRating('.$num.');"> <li class="rating_1" value="1" onclick="rating('.$num.',this.value,1);" onmouseover="rating('.$num.',this.value,0);"></li> <li class="rating_2" value="2" onclick="rating('.$num.',this.value,1);" onmouseover="rating('.$num.',this.value,0);"></li> <li class="rating_3" value="3" onclick="rating('.$num.',this.value,1);" onmouseover="rating('.$num.',this.value,0);"></li> <li class="rating_4" value="4" onclick="rating('.$num.',this.value,1);" onmouseover="rating('.$num.',this.value,0);"></li> <li class="rating_5" value="5" onclick="rating('.$num.',this.value,1);" onmouseover="rating('.$num.',this.value,0);"></li> </ul> <input type="hidden" value="0" name="segmentTypeConditionDetailValue_'.$num.'" id="segmentTypeConditionDetailValue_'.$num.'" /> </div>'; } else if ($type == 'social_gender') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="eq">'.JText::_('JM_IS').'</option> <option value="ne">'.JText::_('JM_IS_NOT').'</option> </select> <select name="segmentTypeConditionDetailValue_'.$num.'" id="segmentTypeConditionDetailValue_'.$num.'"> <option value="female">'.JText::_('JM_FEMALE').'</option> <option value="male">'.JText::_('JM_MALE').'</option> </select>'; } else if ($type == 'social_age') { $response['html'] = '<select name="segmentTypeCondition_'.$num.'" id="segmentTypeCondition_'.$num.'"> <option value="gt">'.JText::_('JM_IS_GREATER_THAN').'</option> <option value="lt">'.JText::_('JM_IS_LESS_THAN').'</option> </select> <input type="range" name="segmentTypeConditionDetailValue_'.$num.'" id="segmentTypeConditionDetailValue_'.$num.'" value="1" step="1" min="1" max="99" style="margin:0 5px;" /> <span id="segmentTypeConditionDetailValueOutput_'.$num.'">0</span>'; $response['js'] = '$("#segmentTypeConditionDetailValue_'.$num.'").change(function(){ $("#segmentTypeConditionDetailValueOutput_'.$num.'").html(this.value); });'; } else { $response['html'] = ''; } echo json_encode($response); } public function testSegments() { $listId = JRequest::getVar('listId', '', 'post', 'string'); $condCount = JRequest::getVar('condCount', '', 'post', 'string'); $type = array_filter(explode('|*|', JRequest::getVar('type', '', 'post', 'string'))); $condition = array_filter(explode('|*|', JRequest::getVar('condition', '', 'post', 'string'))); $conditionDetailValue = array_filter(explode('|*|', JRequest::getVar('conditionDetailValue', '', 'post', 'string'))); $match = JRequest::getVar('match', '', 'post', 'string'); $conditions = array(); for ($i = 0; $i < count($type); $i++) { if (is_numeric($type[$i])) { $type[$i] = 'interests-' . $type[$i]; } $conditionDetailValue[$i] = array_filter(array_unique(explode('|*|', $conditionDetailValue[$i]))); $conditionDetailValue[$i] = implode(',', $conditionDetailValue[$i]); $conditions[] = array( 'field' => $type[$i], 'op' => $condition[$i], 'value' => $conditionDetailValue[$i] ); } $opts = array( 'match' => $match, 'conditions' => $conditions ); $result = $this->getModel('send')->getMcObject()->campaignSegmentTest($listId, $opts); $response = array(); if ($this->getModel('send')->getMcObject()->errorCode) { $MCerrorHandler = new MCerrorHandler(); $response['error'] = 1; $response['msg'] = $MCerrorHandler->getErrorMsg($this->getModel('send')->getMcObject()); } else if ($result) { $response['msg'] = JText::sprintf('JM_X_RECIPIENTS_IN_THIS_SEGMENT', $result); $response['creditCount'] = $result; } else { $response['msg'] = JText::sprintf('JM_X_RECIPIENTS_IN_THIS_SEGMENT', 0); $response['creditCount'] = 0; } echo json_encode($response); } public function addCondition() { $listId = JRequest::getVar('listId', '', 'post', 'string'); $conditionCount = JRequest::getVar('conditionCount', '', 'post', 'string'); $interests = $this->getModel('send')->getInterestGroupings($listId); $mergevars = $this->getModel('send')->getMergeVars($listId); $campaigns = $this->getModel('send')->getSentCampaigns(); $x = $conditionCount + 1; $response['js'] = false; $content = '<select name="segmenttype' . $x . '" id="segmenttype' . $x . '" class="segmentType"> <option value="date">' . JText::_('JM_DATE_ADDED') . '</option> <option value="email">' . JText::_('JM_EMAIL_ADDRESS') . '</option> <option value="fname">' . JText::_('JM_FIRSTNAME') . '</option> <option value="lname">' . JText::_('JM_LASTNAME') . '</option> <option value="rating">' . JText::_('JM_MEMBER_RATING') . '</option> <option value="aim">' . JText::_('JM_SUBSCRIBER_ACTIVITY') . '</option> <option value="social_network">' . JText::_('JM_SOCIAL_NETWORK') . '</option> <option value="social_influence">' . JText::_('JM_SOCIAL_INFLUENCE') . '</option> <option value="social_gender">' . JText::_('JM_SOCIAL_GENDER') . '</option> <option value="social_age">' . JText::_('JM_SOCIAL_AGE') . '</option>'; if ($interests) { foreach ($interests as $interest){ $content .= '<option value="' . $interest['id'] . '">' . ((strlen($interest['name']) > 25) ? substr($interest['name'], 0, 22) . '...' : $interest['name']) . '</option>'; } } if ($mergevars){ foreach ($mergevars as $mv) { if (!in_array($mv['tag'], array('EMAIL', 'FNAME', 'LNAME'))) { $content .= '<option value="' . $mv['tag'] . '">' . ((strlen($mv['name']) > 25) ? substr($mv['name'], 0, 22) . '...' : $mv['name']) . '</option>'; } } } $content .= '</select> <div id="segmentTypeConditionDiv_' . $x . '" class="segmentConditionDiv"> <select name="segmentTypeCondition_' . $x . '" id="segmentTypeCondition_' . $x . '"> <option value="gt">' . JText::_('JM_IS_AFTER') . '</option> <option value="lt">' . JText::_('JM_IS_BEFORE') . '</option> <option value="eq">' . JText::_('JM_IS') . '</option> </select> <select name="segmentTypeConditionDetail_' . $x . '" id="segmentTypeConditionDetail_' . $x . '">'; if (!isset($campaigns[0])) { $disabled = 'disabled="disabled"'; $campaignDate = '(' . JText::_('JM_NO_CAMPAIGN_SENT') . ')'; $noCampain = ' - (' . JText::_('JM_NO_CAMPAIGN_SENT') . ')'; } else { $disabled = ''; $campaignDate = $campaigns[0]['send_time']; $noCampain = ''; } $content .= '<option value="last" ' . $disabled . '>' . JText::_('JM_THE_LAST_CAMPAIGN_WAS_SENT') . ' - ' . $campaignDate . '</option> <option value="campaign" ' . $disabled . '>' . JText::_('JM_A_SPECIFIC_CAMPAIGN_WAS_SENT') . '' . $noCampain . '</option> <option value="date">' . JText::_('JM_A_SPECIFIC_DATE') . '</option> </select> <div id="segmentTypeConditionDetailDiv_' . $x . '" class="segmentTypeConditionDetailDiv">'; if (isset($campaigns[0])) { $content .= '<input type="hidden" value="' . $campaigns[0]['send_time'] . '" name="segmentTypeConditionDetailValue_' . $x . '" id="segmentTypeConditionDetailValue_' . $x . '" />'; } else { $content .= JHTML::calendar(date('Y-m-d'), 'segmentTypeConditionDetailValue_' . $x . '', 'segmentTypeConditionDetailValue_' . $x . '', '%Y-%m-%d', array( 'size'=>'12', 'maxlength'=>'10' )); $response['js'] .= 'Calendar.setup({inputField: "segmentTypeConditionDetailValue_' . $x . '", ifFormat : "%Y-%m-%d", button : "segmentTypeConditionDetailValue_' . $x . '_img", align : "Tl", singleClick : true });'; } $content .= '</div></div>'; $response['html'] = $content . '</div>' . '<div class="removeCondition"><a href="javascript:void(0);joomlamailerJS.send.removeCondition(' . $x . ');" title="' . JText::_('JM_REMOVE') . '">' . '<img src="' . JURI::root() . 'media/com_joomailermailchimpintegration/backend/images/deselect.png" alt="' . JText::_('JM_REMOVE') . '" style="padding:3px 5px;"/></a>' . '</div><div style="clear: both;"></div>'; $response['js'] .= '$(\'#segmenttype' . $x . '\').change(function() { joomlamailerJS.send.getSegmentFields(\'#segmentTypeConditionDiv_' . $x . '\', ' . $x . '); }); $(\'#segmentTypeConditionDetail_' . $x . '\').change(function() { joomlamailerJS.send.getSegmentFields(\'#segmentTypeConditionDiv_' . $x . '\', ' . $x . '); });'; echo json_encode($response); } public function addInterests() { $listId = JRequest::getVar('listId', '', 'post', 'string'); $interests = $this->getModel('send')->getInterestGroupings($listId); $mergevars = $this->getModel('send')->getMergeVars($listId); $res = array(); if ($interests) { foreach ($interests as $int) { $res[] = array( 'id' => $int['id'], 'name' => (strlen($int['name']) > 25) ? substr($int['name'], 0, 22).'...' : $int['name'] ); } } if ($mergevars) { foreach ($mergevars as $mv) { if (!in_array($mv['tag'], array('EMAIL', 'FNAME', 'LNAME'))) { $res[] = array( 'id' => $mv['tag'], 'name' => (strlen($mv['name']) > 25) ? substr($mv['name'], 0, 22).'...' : $mv['name'] ); } } } echo json_encode($res); } public function getMerges() { $response = array(); $listId = JRequest::getVar('listId', '', 'post', 'string'); $mergeVars = $this->getModel('send')->getMcObject()->listMergeVars($listId); if ($mergeVars) { foreach($mergeVars as $index => $var) { if ($var['field_type'] != 'date') { unset($mergeVars[$index]); } } } if (is_array($mergeVars) && count($mergeVars)) { $first= new stdClass(); $first->tag = -1; $first->name = '-- ' . JText::_('JM_SELECT_A_MERGE_FIELD') . ' --'; $merges = array_merge(array($first), $mergeVars); $response['html'] = JHTML::_('select.genericlist', $merges, 'mergefield', 'style="width:auto;"', 'tag', 'name' , ''); } else { $response['html'] = '<a href="index.php?option=com_joomailermailchimpintegration&view=fields&listid=' . $listId . '" class="inputInfo">' . JText::_('JM_CREATE_MERGE_FIELDS') . '</a>'; } echo json_encode($response); } public function ajax_sync_hotness() { $listId = JRequest::getVar('listId', '', 'post', 'string'); $total = JRequest::getVar('total', '', 'post', 'string'); $step = JRequest::getVar('step', '', 'post', 'string'); $done = JRequest::getVar('done', '', 'post', 'string'); $errors = JRequest::getVar('errors', '', 'post', 'string'); $errorMsg = JRequest::getVar('errorMsg', '', 'post', 'string'); $addedUsers = JRequest::getVar('addedUsers', '', 'post', 'string'); $failed = JRequest::getVar('failed', array(), 'post', 'string'); $offset = JRequest::getVar('offset', '', 'post', 'string'); if ($done == 0) { $_SESSION['abortAJAX'] = 0; unset($_SESSION['addedUsers']); unset($_SESSION['HotnessExists']); } if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); $response['addedUsers'] = ''; $response['finished'] = 1; $response['abortAJAX'] = 1; echo json_encode($response); return; } $db = JFactory::getDBO(); $MCerrorHandler = new MCerrorHandler(); // retrieve hotness rating require_once(JPATH_COMPONENT_ADMINISTRATOR . DS . '/libraries/joomailer/hotActivityComposite.php'); $composite = new hotActivityComposite(); $hotnessRating = $composite->getAllUserHotnessValue($listId); $exclude = (isset($_SESSION['addedUsers'])) ? $_SESSION['addedUsers'] : array(); if (count($exclude)) { $failed = array_merge($exclude, $failed); $exclude = 'AND j.userid NOT IN ("' . implode('","', $failed) . '") '; } else { $exclude = ''; } $data = $this->getModel('send')->getMcObject()->listMembers($listId, '', '', $offset, $step); if (count($data) > 0) { // determine if the interest group Hotness already exists, if not: create it if (!isset($_SESSION['HotnessExists'])) { $query = $db->getQuery(true) ->select($db->qn('value')) ->from('#__joomailermailchimpintegration_misc') ->where($db->qn('type') . ' = ' . $db->q('hotness')) ->where($db->qn('listid') . ' = ' . $db->q($listId)); $db->setQuery($query); $hotnessId = $db->loadResult(); if ($hotnessId == NULL) { $result = $this->getModel('send')->getMcObject()->listInterestGroupingAdd($listId, JText::_('JM_HOTNESS_RATING'), 'hidden', array(1,2,3,4,5)); if (is_int($result)) { $query = $db->getQuery(true) ->insert('#__joomailermailchimpintegration_misc') ->set($db->qn('type') . ' = ' . $db->q('hotness')) ->set($db->qn('listid') . ' = ' . $db->q($listId)) ->set($db->qn('value') . ' = ' . $db->q($result)); $db->setQuery($query); $db->execute(); $_SESSION['HotnessExists'] = $result; } } else { $_SESSION['HotnessExists'] = $hotnessId; } } $successCount = 0; for ($x = 0; $x < count($data); $x += $step) { if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); break; } $k = 0; $batch = array(); for ($y = $x; $y < ($x + $step); $y++) { if ($_SESSION['abortAJAX'] == 1) { unset($_SESSION['addedUsers']); break; } $dat = (isset($data[$y])) ? $data[$y] : false; if ($dat) { $addedUsers[] = $dat['email']; $batch[$k]['EMAIL'] = $dat['email']; if (!isset($hotnessRating[$dat['email']])){ $hotnessRating[$dat['email']] = 2; } $batch[$k]['GROUPINGS'][] = array( 'id' => $_SESSION['HotnessExists'], 'groups' => $hotnessRating[$dat['email']] ); $k++; } else { break; } } if ($batch) { $optin = false; //yes, send optin emails $up_exist = true; // yes, update currently subscribed users $replace_int = true; // false = add interest, don't replace $result = $this->getModel('send')->getMcObject()->listBatchSubscribe($listId, $batch, $optin, $up_exist, $replace_int); $successCount += $result['success_count']; if ($result['error_count']) { foreach($result['errors'] as $e) { $tmp = new stdClass(); $tmp->errorCode = $e['code']; $tmp->errorMessage = $e['message']; $errorMsg .= '"' . $MCerrorHandler->getErrorMsg($tmp) . ' => ' . $e['row']['EMAIL'] . '", '; } } } } $addedUsers = array_unique($addedUsers); if (!count($data)) { $done = $total; unset($_SESSION['addedUsers']); $percent = 100; } else { $done = count($addedUsers); $_SESSION['addedUsers'] = $addedUsers; $percent = ($done / $total) * 100; } $response['msg'] = '<div id="bg"></div>' .'<div style="background:#FFFFFF none repeat scroll 0 0;border:10px solid #000000;height:100px;left:37%;position:relative;text-align:center;top:37%;width:300px; ">' .'<div style="margin: 35px auto 3px; width: 300px; text-align: center;">'.JText::_('adding users').' ('.$done.'/'.$total.' '.JText::_('done').')</div>' .'<div style="margin: auto; background: transparent url('.JURI::root().'media/com_joomailermailchimpintegration/backend/images/progress_bar_grey.gif) repeat scroll 0% 0%; width: 190px; height: 14px; display: block;">' .'<div style="width: '.$percent.'%; overflow: hidden;">' .'<img src="'.JURI::root().'media/com_joomailermailchimpintegration/backend/images/progress_bar.gif" style="margin: 0 5px 0 0;"/>' .'</div>' .'<div style="width: 190px; text-align: center; position: relative;top:-13px; font-weight:bold;">'.round($percent,0).' %</div>' .'</div>' .'<a id="sbox-btn-close" style="text-indent:-5000px;right:-20px;top:-18px;outline:none;" href="javascript:void(0);joomlamailerJS.sync.abortAJAX(true);">abort</a>' .'</div>'; $response['done'] = $done; $response['errors'] = count($failed); $response['errorMsg'] = $errorMsg; $response['addedUsers'] = array_values(array_unique($addedUsers)); if (($done + count($failed) + $errors) >= $total) { $response['finished'] = 1; $msg = $done . ' ' . JText::_('JM_USERS_SYNCHRONIZED') . '.'; if ($errorMsg) { $errorMsg = substr($errorMsg,0,-2); $msg .= ' (' . count($failed) . ' ' . JText::_('Errors') . ': ' . $errorMsg . ')'; } $response['finalMessage'] = $msg; } else { $response['finished'] = 0; $response['finalMessage'] = ''; } $response['abortAJAX'] = $_SESSION['abortAJAX']; } else { unset($_SESSION['addedUsers']); $response['addedUsers'] = ''; $response['finalMessage'] = JText::_('JM_NO_USERS_FOUND'); $response['finished'] = 1; $response['abortAJAX'] = $_SESSION['abortAJAX']; } echo json_encode($response); } }