%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);
}
}