diff --git a/deployed/acym/administrator/components/com_acym/acym.php b/deployed/acym/administrator/components/com_acym/acym.php new file mode 100644 index 00000000..f26fdeee --- /dev/null +++ b/deployed/acym/administrator/components/com_acym/acym.php @@ -0,0 +1,89 @@ +This version of AcyMailing requires at least PHP 5.4.0, it is time to update the PHP version of your server!

'; + exit; +} + +if (!include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acym'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php')) { + echo "Could not load Acy helper file"; + + return; +} + +if (acym_isDebug()) { + acym_displayErrors(); +} + +$ctrl = acym_getVar('cmd', 'ctrl', 'dashboard'); +$task = acym_getVar('cmd', 'task'); + +$config = acym_config(); + +if ((($config->get('migration') == 0 && acym_existsAcyMailing59() && acym_getVar('string', 'task') != 'migrationDone') || $config->get('walk_through') == 1) && !acym_isNoTemplate()) { + $ctrl = 'dashboard'; +} + + +if (!include_once(ACYM_CONTROLLER.$ctrl.'.php')) { + acym_redirect(acym_completeLink('dashboard')); + + return; +} + +$className = ucfirst($ctrl).'Controller'; +$controller = new $className(); + +if (empty($task)) { + $task = acym_getVar('cmd', 'defaulttask', $controller->defaulttask); + acym_setVar('task', $task); +} + +if (file_exists(ACYM_BACK.'extensions')) { + $updateHelper = acym_get('helper.update'); + $updateHelper->installExtensions(); +} + +acym_addScript( + true, + 'var TOGGLE_URL_ACYM = "index.php?option='.ACYM_COMPONENT.'&'.acym_noTemplate().'&ctrl=toggle&'.acym_getFormToken().'"; + var AJAX_URL_ACYM = "index.php?option='.ACYM_COMPONENT.'&'.acym_noTemplate().'&'.acym_getFormToken().'"; + var AJAX_URL_ACYBA = "'.ACYM_ACYWEBSITE.'"; + var MEDIA_URL_ACYM = "'.ACYM_MEDIA_URL.'"; + var CMS_ACYM = "'.ACYM_CMS.'"; + var FOUNDATION_FOR_EMAIL = "'.ACYM_CSS.'libraries/foundation_email.min.css?v='.filemtime(ACYM_MEDIA.'css'.DS.'libraries'.DS.'foundation_email.min.css').'"; + var ACYM_FIXES_FOR_EMAIL = "'.ACYM_CSS.'email.min.css?v='.filemtime(ACYM_MEDIA.'css'.DS.'email.min.css').'"; + var ACYM_REGEX_EMAIL = /^'.acym_getEmailRegex(true).'$/i; + var ACYM_JS_TXT = '.acym_getJSMessages().'; + var ACYM_JOOMLA_MEDIA_IMAGE = "'.ACYM_LIVE.'";' +); + +JHtml::_('jquery.framework'); +acym_addScript(false, 'https://code.jquery.com/ui/1.11.4/jquery-ui.min.js'); + +acym_addScript(false, ACYM_JS.'libraries/foundation.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'libraries'.DS.'foundation.min.js')); +acym_addScript(false, ACYM_JS.'libraries/select2.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'libraries'.DS.'select2.min.js')); + +acym_addStyle(false, 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css'); + +acym_addStyle(false, ACYM_CSS.'libraries/introjs.min.css?v='.filemtime(ACYM_MEDIA.'css'.DS.'libraries'.DS.'introjs.min.css')); +acym_addScript(false, ACYM_JS.'libraries/intro.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'libraries'.DS.'intro.min.js')); + +acym_addScript(false, ACYM_JS.'global.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'global.min.js')); +acym_addScript(false, ACYM_JS.'back_global.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'back_global.min.js')); +acym_addStyle(false, ACYM_CSS.'back_global.min.css?v='.filemtime(ACYM_MEDIA.'css'.DS.'back_global.min.css')); +if (file_exists(ACYM_MEDIA.'js'.DS.'back'.DS.$ctrl.'.min.js')) { + acym_addScript(false, ACYM_JS.'back/'.$ctrl.'.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'back'.DS.$ctrl.'.min.js')); +} + +$controller->loadScripts($task); +$controller->$task(); diff --git a/deployed/acym/administrator/components/com_acym/acym.xml b/deployed/acym/administrator/components/com_acym/acym.xml new file mode 100644 index 00000000..55e57a73 --- /dev/null +++ b/deployed/acym/administrator/components/com_acym/acym.xml @@ -0,0 +1,69 @@ + + + Acym + August 2019 + 6.2.0 + starter + Acyba + dev@acyba.com + https://www.acyba.com + Copyright (C) 2009-2019 ACYBA SAS - All rights reserved. + Manage your Mailing lists and e-mail marketing campaigns + GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html + + en-GB.com_acym.ini + en-US.com_acym.ini + + + + tables.sql + + + install.joomla.php + + controllers + inc + views + params + acym.php + index.html + router.php + + + css + images + js + index.html + + + + classes + controllers + dynamics + extensions + helpers + library + types + views + templates + acym.php + config.xml + index.html + tables.sql + + COM_ACYM + + ACYM_USERS + ACYM_CUSTOM_FIELDS + ACYM_LISTS + ACYM_CAMPAIGNS + ACYM_TEMPLATES + ACYM_AUTOMATION + ACYM_QUEUE + ACYM_STATISTICS + ACYM_BOUNCE_HANDLING + ACYM_CONFIGURATION + + + + diff --git a/deployed/acym/administrator/components/com_acym/classes/action.php b/deployed/acym/administrator/components/com_acym/classes/action.php new file mode 100644 index 00000000..44d3ad01 --- /dev/null +++ b/deployed/acym/administrator/components/com_acym/classes/action.php @@ -0,0 +1,36 @@ + $value) { + if (empty($value)) { + continue; + } + + if (is_array($value)) { + $value = json_encode($value); + } + + $automation->$oneAttribute = strip_tags($value); + } + + return parent::save($automation); + } + + public function delete($elements) + { + if (!is_array($elements)) { + $elements = [$elements]; + } + acym_arrayToInteger($elements); + + if (empty($elements)) { + return 0; + } + + $steps = acym_loadResultArray('SELECT id FROM #__acym_step WHERE automation_id IN ('.implode(',', $elements).')'); + $stepClass = acym_get('class.step'); + $stepsDeleted = $stepClass->delete($steps); + + return parent::delete($elements); + } + + public function trigger($trigger, $data = []) + { + if (!acym_level(2)) return; + + $stepClass = acym_get('class.step'); + $actionClass = acym_get('class.action'); + $conditionClass = acym_get('class.condition'); + $steps = $stepClass->getActiveStepByTrigger($trigger); + + $data['time'] = time(); + foreach ($steps as $step) { + $execute = false; + + if (!empty($step->next_execution) && $step->next_execution <= $data['time']) { + $execute = true; + } + + acym_trigger('onAcymExecuteTrigger', [&$step, &$execute, $data]); + + $data['automation'] = $this->getOneById($step->automation_id); + + if ($execute) { + $step->last_execution = $data['time']; + $conditions = $conditionClass->getConditionsByStepId($step->id); + if (!empty($conditions)) { + foreach ($conditions as $condition) { + if (!$this->_verifyCondition($condition->conditions, $data)) continue; + + $actions = $actionClass->getActionsByStepId($step->id); + if (empty($actions)) continue; + + foreach ($actions as $action) { + $this->execute($action, $data); + } + } + } + } + + $stepClass->save($step); + } + } + + public function execute($action, $data = []) + { + $userTriggeringAction = empty($data['userId']) ? 0 : $data['userId']; + $action->actions = json_decode($action->actions, true); + if (empty($action->actions)) return false; + + $isMassAction = false; + static $massAction = 0; + if (empty($action->id)) { + $action->id = $massAction--; + $isMassAction = true; + } + + $action->filters = json_decode($action->filters, true); + if (empty($action->filters)) return false; + + + $query = acym_get('class.query'); + + $initialWhere = ['1 = 1']; + $query->removeFlag($action->id); + + if (!empty($action->filters['type_filter']) && $action->filters['type_filter'] == 'user') { + $initialWhere = ['user.id = '.intval($userTriggeringAction)]; + } + + $typeFilter = $action->filters['type_filter']; + + unset($action->filters['type_filter']); + if (empty($action->filters)) { + $query->where = $initialWhere; + } + + foreach ($action->filters as $or => $orValue) { + if (empty($orValue)) { + continue; + } + $num = 0; + $query->where = $initialWhere; + foreach ($orValue as $and => $andValue) { + $num++; + foreach ($andValue as $filterName => $filterOptions) { + acym_trigger('onAcymProcessFilter_'.$filterName, [&$query, &$filterOptions, &$num]); + } + } + + $query->addFlag($action->id); + } + + $this->didAnAction = $this->didAnAction || $query->count() > 0; + foreach ($action->actions as $and => $andValue) { + foreach ($andValue as $actionName => $actionOptions) { + $this->report = array_merge( + $this->report, + acym_trigger( + 'onAcymProcessAction_'.$actionName, + [&$query, &$actionOptions, ['automationAdmin' => !empty($data['automation']->admin), 'user_id' => $userTriggeringAction]] + ) + ); + $action->actions[$and][$actionName] = $actionOptions; + } + } + + if (!$isMassAction) { + $action->filters['type_filter'] = $typeFilter; + $action->filters = json_encode($action->filters); + $action->actions = json_encode($action->actions); + $actionClass = acym_get('class.action'); + $actionClass->save($action); + } + + $query->removeFlag($action->id); + + return $this->didAnAction; + } + + private function _verifyCondition($conditions, $data = []) + { + if (empty($conditions)) return true; + $userTriggeringAction = empty($data['userId']) ? 0 : $data['userId']; + + $conditions = json_decode($conditions, true); + $query = acym_get('class.query'); + $initialWhere = ['1 = 1']; + if (!empty($conditions['type_condition']) && $conditions['type_condition'] == 'user') { + $initialWhere = ['user.id = '.intval($userTriggeringAction)]; + } + unset($conditions['type_condition']); + + if (empty($conditions)) return true; + + foreach ($conditions as $or => $orValue) { + if (empty($orValue)) continue; + + $conditionNotValid = 0; + $num = 0; + foreach ($orValue as $and => $andValue) { + $num++; + $query->where = $initialWhere; + foreach ($andValue as $filterName => $filterOptions) { + acym_trigger('onAcymProcessCondition_'.$filterName, [&$query, &$filterOptions, &$num, &$conditionNotValid]); + } + } + + if ($conditionNotValid == 0) return true; + } + + return false; + } + + public function getAutomationsAdmin($ids = []) + { + acym_arrayToInteger($ids); + + $query = 'SELECT * FROM #__acym_automation WHERE `admin` = 1'; + if (!empty($ids)) $query .= ' AND `id` IN ('.implode(', ', $ids).')'; + + return acym_loadObjectList($query, 'name'); + } +} + diff --git a/deployed/acym/administrator/components/com_acym/classes/bounce.php b/deployed/acym/administrator/components/com_acym/classes/bounce.php new file mode 100644 index 00000000..3d26f84c --- /dev/null +++ b/deployed/acym/administrator/components/com_acym/classes/bounce.php @@ -0,0 +1,37 @@ +decode(acym_loadObjectList($query, '', $settings['offset'], $settings['campaignsPerPage'])); + + foreach ($results['campaigns'] as $oneCampaign) { + array_push($mailIds, $oneCampaign->mail_id); + $oneCampaign->tags = ''; + } + + $tags = $tagClass->getAllTagsByTypeAndElementIds('mail', $mailIds); + $lists = $mailClass->getAllListsWithCountSubscribersByMailIds($mailIds); + $totalStats = $statClass->getAllFromMailIds($mailIds); + + foreach ($results['campaigns'] as $i => $oneCampaign) { + $results['campaigns'][$i]->tags = []; + $results['campaigns'][$i]->lists = []; + $results['campaigns'][$i]->automation_id = null; + + foreach ($tags as $tag) { + if ($oneCampaign->id == $tag->id_element) { + $results['campaigns'][$i]->tags[] = $tag; + } + } + + foreach ($lists as $list) { + if ($oneCampaign->mail_id == $list->mail_id) { + array_push($results['campaigns'][$i]->lists, $list); + } + } + + if (isset($totalStats[$oneCampaign->mail_id])) { + $oneCampaignStats = $totalStats[$oneCampaign->mail_id]; + $results['campaigns'][$i]->subscribers = $oneCampaignStats->total_subscribers; + $results['campaigns'][$i]->open = 0; + if (!empty($oneCampaignStats->total_subscribers)) { + $results['campaigns'][$i]->open = intval($oneCampaignStats->open_unique / $oneCampaignStats->total_subscribers * 100); + } + } + } + + $results['total'] = acym_loadResult($queryCount); + + return $results; + } + + public function getOneById($id) + { + $query = 'SELECT campaign.* FROM #__acym_campaign AS campaign WHERE campaign.id = '.intval($id); + + return acym_loadObject($query); + } + + public function getOneByIdWithMail($id) + { + $mailClass = acym_get('class.mail'); + + $query = 'SELECT campaign.*, mail.name, mail.subject, mail.body, mail.from_name, mail.from_email, mail.reply_to_name, mail.reply_to_email, mail.bcc + FROM #__acym_campaign AS campaign + JOIN #__acym_mail AS mail ON campaign.mail_id = mail.id + WHERE campaign.id = '.intval($id); + + return $mailClass->decode(acym_loadObject($query)); + } + + public function get($identifier, $column = 'id') + { + return acym_loadObject('SELECT campaign.* FROM #__acym_campaign AS campaign WHERE campaign.'.acym_secureDBColumn($column).' = '.acym_escapeDB($identifier)); + } + + public function getAllCampaignsNameMailId() + { + $mailClass = acym_get('class.mail'); + + $query = 'SELECT m.id, m.name + FROM #__acym_campaign as c + LEFT JOIN #__acym_mail as m ON c.mail_id = m.id'; + + return $mailClass->decode(acym_loadObjectList($query)); + } + + public function getOneCampaignByMailId($mailId) + { + $query = 'SELECT * FROM #__acym_campaign WHERE mail_id = '.intval($mailId); + + return acym_loadObject($query); + } + + public function manageListsToCampaign($listsIds, $mailId) + { + acym_query('DELETE FROM #__acym_mail_has_list WHERE mail_id = '.intval($mailId)); + + acym_arrayToInteger($listsIds); + if (empty($listsIds)) return; + + $values = []; + $listsIds = array_unique($listsIds); + foreach ($listsIds as $id) { + array_push($values, '('.intval($mailId).', '.intval($id).')'); + } + + if (!empty($values)) { + acym_query('INSERT INTO #__acym_mail_has_list (`mail_id`, `list_id`) VALUES '.implode(',', $values)); + } + } + + public function save($campaign) + { + if (isset($campaign->tags)) { + $tags = $campaign->tags; + unset($campaign->tags); + } + + foreach ($campaign as $oneAttribute => $value) { + if (empty($value)) { + continue; + } + + $campaign->$oneAttribute = strip_tags($value); + } + + $campaignID = parent::save($campaign); + + if (!empty($campaignID) && isset($tags)) { + $tagClass = acym_get('class.tag'); + $tagClass->setTags('mail', $campaign->mail_id, $tags); + } + + return $campaignID; + } + + public function delete($elements) + { + if (!is_array($elements)) { + $elements = [$elements]; + } + + if (empty($elements)) { + return 0; + } + + $mailsToDelete = []; + foreach ($elements as $id) { + $mailsToDelete[] = acym_loadResult('SELECT mail_id FROM #__acym_campaign WHERE id = '.intval($id)); + acym_query('UPDATE #__acym_campaign SET mail_id = NULL WHERE id = '.intval($id)); + } + + $mailClass = acym_get('class.mail'); + $mailClass->delete($mailsToDelete); + + return parent::delete($elements); + } + + public function send($campaignID, $result = 0) + { + $date = acym_date('now', 'Y-m-d H:i:s', false); + $campaign = $this->getOneById($campaignID); + + if ($campaign->scheduled == 0) { + $campaign->sending_date = $date; + $campaign->draft = 0; + $this->save($campaign); + } + + if (empty($campaign->mail_id)) { + $this->errors[] = 'Mail not found'; + + return false; + } + + $lists = acym_loadResultArray('SELECT list_id FROM #__acym_mail_has_list WHERE mail_id = '.intval($campaign->mail_id)); + + if (empty($lists)) { + $this->errors[] = acym_translation('ACYM_NO_LIST_SELECTED'); + + return false; + } + + acym_arrayToInteger($lists); + + $config = acym_config(); + $confirmed = $config->get('require_confirmation', 1) == 1 ? ' AND user.confirmed = 1 ' : ''; + if (empty($result)) { + $result = acym_query( + 'INSERT IGNORE INTO #__acym_queue (`mail_id`, `user_id`, `sending_date`) + SELECT '.intval($campaign->mail_id).', ul.user_id, '.acym_escapeDB($date).' + FROM #__acym_user_has_list AS ul + JOIN #__acym_user AS user ON user.id = ul.user_id + WHERE user.active = 1 AND ul.status = 1 AND ul.list_id IN ('.implode(',', $lists).')'.$confirmed + ); + } + + $mailStat = []; + $mailStat['mail_id'] = intval($campaign->mail_id); + $mailStat['total_subscribers'] = intval($result); + $mailStat['send_date'] = acym_date("now", "Y-m-d H:i:s"); + + $mailStatClass = acym_get('class.mailstat'); + $mailStatClass->save($mailStat); + + if ($result === 0) { + $this->errors[] = acym_translation('ACYM_CAMPAIGN_ALREADY_QUEUED'); + } else { + acym_query('UPDATE #__acym_campaign SET sent = 1, active = 1 WHERE mail_id = '.intval($campaign->mail_id)); + } + + return $result; + } + + public function getCampaignForDashboard() + { + $mailClass = acym_get('class.mail'); + + $query = 'SELECT campaign.*, mail.name as name FROM #__acym_campaign as campaign LEFT JOIN #__acym_mail as mail ON campaign.mail_id = mail.id WHERE `active` = 1 AND `scheduled` = 1 AND `sent` = 0 LIMIT 3'; + + return $mailClass->decode(acym_loadObjectList($query)); + } + + public function getOpenRateOneCampaign($mail_id) + { + $query = 'SELECT sent, open_unique FROM #__acym_mail_stat + WHERE mail_id = '.intval($mail_id).' LIMIT 1'; + + return acym_loadObject($query); + } + + public function getOpenRateAllCampaign() + { + $query = 'SELECT SUM(sent) as sent, SUM(open_unique) as open_unique FROM #__acym_mail_stat'; + + return acym_loadObject($query); + } + + public function getBounceRateAllCampaign() + { + $query = 'SELECT SUM(sent) as sent, SUM(bounce_unique) as bounce_unique FROM #__acym_mail_stat'; + + return acym_loadObject($query); + } + + + public function getBounceRateOneCampaign($mail_id) + { + $query = 'SELECT sent, bounce_unique FROM #__acym_mail_stat + WHERE mail_id = '.intval($mail_id).' LIMIT 1'; + + return acym_loadObject($query); + } + + public function getOpenByMonth($mail_id = '', $start = '', $end = '') + { + $query = 'SELECT COUNT(user_id) as open, DATE_FORMAT(open_date, \'%Y-%m\') as open_date FROM #__acym_user_stat WHERE open > 0'; + $query .= empty($mail_id) ? '' : ' AND `mail_id`='.intval($mail_id); + $query .= empty($start) ? '' : ' AND `open_date` >= '.acym_escapeDB($start); + $query .= empty($start) ? '' : ' AND `open_date` <= '.acym_escapeDB($end); + $query .= ' GROUP BY MONTH(open_date), YEAR(open_date) ORDER BY open_date'; + + return acym_loadObjectList($query); + } + + public function getOpenByWeek($mail_id = '', $start = '', $end = '') + { + $query = 'SELECT COUNT(user_id) as open, DATE_FORMAT(open_date, \'%Y-%m-%d\') as open_date FROM #__acym_user_stat WHERE open > 0'; + $query .= empty($mail_id) ? '' : ' AND `mail_id`='.intval($mail_id); + $query .= empty($start) ? '' : ' AND `open_date` >= '.acym_escapeDB($start); + $query .= empty($start) ? '' : ' AND `open_date` <= '.acym_escapeDB($end); + $query .= ' GROUP BY WEEK(open_date), YEAR(open_date) ORDER BY open_date'; + + return acym_loadObjectList($query); + } + + public function getOpenByDay($mail_id = '', $start = '', $end = '') + { + $query = 'SELECT COUNT(user_id) as open, DATE_FORMAT(open_date, \'%Y-%m-%d\') as open_date FROM #__acym_user_stat WHERE open > 0'; + $query .= empty($mail_id) ? '' : ' AND `mail_id`='.intval($mail_id); + $query .= empty($start) ? '' : ' AND `open_date` >= '.acym_escapeDB($start); + $query .= empty($start) ? '' : ' AND `open_date` <= '.acym_escapeDB($end); + $query .= ' GROUP BY DAYOFYEAR(open_date), YEAR(open_date) ORDER BY open_date'; + + return acym_loadObjectList($query); + } + + public function getOpenByHour($mail_id = '', $start = '', $end = '') + { + $query = 'SELECT COUNT(user_id) as open, DATE_FORMAT(open_date, \'%Y-%m-%d %H:00:00\') as open_date FROM #__acym_user_stat WHERE open > 0'; + $query .= empty($mail_id) ? '' : ' AND `mail_id`='.intval($mail_id); + $query .= empty($start) ? '' : ' AND `open_date` >= '.acym_escapeDB($start); + $query .= empty($start) ? '' : ' AND `open_date` <= '.acym_escapeDB($end); + $query .= ' GROUP BY HOUR(open_date), DAYOFYEAR(open_date), YEAR(open_date) ORDER BY open_date'; + + return acym_loadObjectList($query); + } + + public function getLastNewsletters($params) + { + $query = 'SELECT m.name, m.id, m.body, m.subject, c.sending_date FROM #__acym_campaign as c + INNER JOIN #__acym_mail as m ON c.mail_id = m.id + WHERE c.active = 1 AND c.sent = 1'; + + $queryCount = 'SELECT COUNT(*) FROM (SELECT m.id FROM #__acym_campaign as c INNER JOIN #__acym_mail as m ON c.mail_id = m.id WHERE c.active = 1 AND c.sent = 1'; + + if (isset($params['userId'])) { + $query .= ' AND m.id IN (SELECT ml.mail_id FROM #__acym_mail_has_list ml + INNER JOIN #__acym_user_has_list ul ON ml.list_id = ul.list_id + WHERE ul.user_id = '.intval($params['userId']).')'; + $queryCount .= ' AND m.id IN (SELECT ml.mail_id FROM #__acym_mail_has_list ml + INNER JOIN #__acym_user_has_list ul ON ml.list_id = ul.list_id + WHERE ul.user_id = '.intval($params['userId']).')'; + } + + $query .= ' ORDER BY c.sending_date DESC'; + + $page = isset($params['page']) ? $params['page'] : 0; + $numberPerPage = isset($params['numberPerPage']) ? $params['numberPerPage'] : 0; + $lastNewsletters = isset($params['limit']) ? $params['limit'] : 0; + + $queryCount .= empty($lastNewsletters) ? '' : ' LIMIT '.intval($lastNewsletters); + + if (!empty($page) && !empty($numberPerPage)) { + if (!empty($lastNewsletters)) { + $limit = ((($page * $numberPerPage) > $lastNewsletters) ? fmod($lastNewsletters, $numberPerPage) : $numberPerPage); + } else { + $limit = $numberPerPage; + } + + $offset = ($params['page'] - 1) * $numberPerPage; + $query .= ' LIMIT '.intval($offset).', '.intval($limit); + } elseif (!empty($lastNewsletters)) { + $limit = $lastNewsletters; + + $query .= ' LIMIT '.intval($limit); + } + + $queryCount .= ') AS r'; + + + $return = []; + + $mailClass = acym_get('class.mail'); + $return['matchingNewsletters'] = $mailClass->decode(acym_loadObjectList($query)); + + $userClass = acym_get('class.user'); + $userEmail = acym_currentUserEmail(); + $user = $userClass->getOneByEmail($userEmail); + + foreach ($return['matchingNewsletters'] as $i => $oneNewsletter) { + acym_trigger('replaceContent', [&$oneNewsletter]); + acym_trigger('replaceUserInformation', [&$oneNewsletter, &$user, false]); + + $return['matchingNewsletters'][$i] = $oneNewsletter; + } + + $return['count'] = acym_loadResult($queryCount); + + return $return; + } + + public function getListsForCampaign($mailId) + { + $query = 'SELECT list_id FROM #__acym_mail_has_list WHERE mail_id = '.intval($mailId); + + return acym_loadResultArray($query); + } +} + diff --git a/deployed/acym/administrator/components/com_acym/classes/condition.php b/deployed/acym/administrator/components/com_acym/classes/condition.php new file mode 100644 index 00000000..8c80b0e5 --- /dev/null +++ b/deployed/acym/administrator/components/com_acym/classes/condition.php @@ -0,0 +1,70 @@ + $value) { + if (empty($value)) { + continue; + } + + if (is_array($value)) { + $value = json_encode($value); + } + if ($oneAttribute != 'conditions') $condition->$oneAttribute = strip_tags($value); + } + + return parent::save($condition); + } + + + public function getConditionsByStepId($id) + { + $query = 'SELECT acycondition.* FROM #__acym_condition as acycondition LEFT JOIN #__acym_step AS step ON step.id = acycondition.step_id WHERE step.id = '.intval($id); + + return acym_loadObjectList($query); + } + + public function getAll() + { + return acym_loadObjectList('SELECT * FROM #__acym_condition'); + } +} + diff --git a/deployed/acym/administrator/components/com_acym/classes/configuration.php b/deployed/acym/administrator/components/com_acym/classes/configuration.php new file mode 100644 index 00000000..0e27c20b --- /dev/null +++ b/deployed/acym/administrator/components/com_acym/classes/configuration.php @@ -0,0 +1,73 @@ +values = acym_loadObjectList('SELECT * FROM #__acym_configuration', 'name'); + } + + function get($namekey, $default = '') + { + if (isset($this->values[$namekey])) { + return $this->values[$namekey]->value; + } + + return $default; + } + + function save($newConfig) + { + $query = 'REPLACE INTO #__acym_configuration (`name`, `value`) VALUES '; + + $params = []; + foreach ($newConfig as $name => $value) { + if (strpos($name, 'password') !== false && !empty($value) && trim($value, '*') == '') { + continue; + } + + if (is_array($value)) { + $value = implode(',', $value); + } + + if (empty($this->values[$name])) { + $this->values[$name] = new stdClass(); + } + $this->values[$name]->value = $value; + + $params[] = '('.acym_escapeDB(strip_tags($name)).','.acym_escapeDB(strip_tags($value)).')'; + } + + if (empty($params)) { + return true; + } + + $query .= implode(',', $params); + + try { + $status = acym_query($query); + } catch (Exception $e) { + $status = false; + } + if ($status === false) { + acym_display(isset($e) ? $e->getMessage() : substr(strip_tags(acym_getDBError()), 0, 200).'...', 'error'); + } + + return $status; + } +} + diff --git a/deployed/acym/administrator/components/com_acym/classes/field.php b/deployed/acym/administrator/components/com_acym/classes/field.php new file mode 100644 index 00000000..93ba8976 --- /dev/null +++ b/deployed/acym/administrator/components/com_acym/classes/field.php @@ -0,0 +1,370 @@ +value).' AS value, '.acym_secureDBColumn($fieldDB->title).' AS title + FROM '.acym_secureDBColumn($fieldDB->database).'.'.acym_secureDBColumn($fieldDB->table); + $query .= empty($fieldDB->where_value) ? '' : ' WHERE `'.acym_secureDBColumn($fieldDB->where).'` '.$fieldDB->where_sign.' '.acym_escapeDB($fieldDB->where_value); + if (!empty($fieldDB->order_by)) $query .= ' ORDER BY '.acym_secureDBColumn($fieldDB->order_by).' '.acym_secureDBColumn($fieldDB->sort_order); + + return acym_loadObjectList($query); + } + + public function store($fields, $userID) + { + if (!empty($_FILES['customField'])) { + $uploadFolder = trim(acym_cleanPath(html_entity_decode(acym_getFilesFolder())), DS.' ').DS; + $uploadPath = acym_cleanPath(ACYM_ROOT.$uploadFolder.'userfiles'.DS); + foreach ($_FILES['customField']['tmp_name'] as $key => $value) { + if (empty($value)) { + continue; + } + $error = acym_uploadFile($value, $uploadPath.$_FILES['customField']['name'][$key]); + if (!$error) { + acym_enqueueNotification(acym_translation('ACYM_ERROR_SAVING'), 'error', 5000); + + return; + } + $fields[$key] = $_FILES['customField']['name'][$key]; + } + } + + foreach ($fields as $id => $field) { + $query = 'INSERT INTO #__acym_user_has_field (`user_id`, `field_id`, `value`) VALUES '; + if (is_array($field)) { + $fullField = $this->getOneFieldByID($id); + if (in_array($fullField->type, ['multiple_dropdown', 'radio', 'phone'])) { + $field = implode(',', $field); + } elseif ($fullField->type == 'checkbox') { + $field = implode(',', array_keys($field)); + } elseif ($fullField->type == 'date') { + $field = implode('/', $field); + } else { + $field = json_encode($field); + } + } + $query .= '('.intval($userID).', '.intval($id).', '.acym_escapeDB($field).')'; + $query .= ' ON DUPLICATE KEY UPDATE `value`= VALUES(`value`)'; + acym_query($query); + } + } + + public function getAllfieldBackEndListingByUserIds($ids, $fields, $forBackEnd = false) + { + $query = 'SELECT field.type as type, field.name as field_name, user_field.user_id as user_id, user_field.field_id as field_id, user_field.value as field_value + FROM #__acym_user_has_field AS user_field + LEFT JOIN #__acym_field AS field ON user_field.field_id = field.id'; + + $conditions = []; + + if ($forBackEnd) $conditions[] = 'field.backend_listing = 1'; + + if (!is_array($ids)) $ids = [$ids]; + acym_arrayToInteger($ids); + if (empty($ids)) $ids[] = 0; + + if (!is_array($fields)) $fields = [$fields]; + acym_arrayToInteger($fields); + if (empty($fields)) $fields[] = 0; + + $conditions[] = 'user_field.user_id IN ('.implode(',', $ids).')'; + $conditions[] = 'user_field.field_id IN ('.implode(',', $fields).')'; + + $query .= !empty($conditions) ? ' WHERE ('.implode(') AND (', $conditions).')' : ''; + + $fieldValues = []; + foreach (acym_loadObjectList($query) as $one) { + $fieldValues[$one->field_id.$one->user_id] = is_array(json_decode($one->field_value)) ? implode(', ', json_decode($one->field_value)) : $one->field_value; + } + + return $fieldValues; + } + + public function getAllFieldsBackendListing() + { + $query = 'SELECT id, name FROM #__acym_field WHERE backend_listing = 1 AND id NOT IN (1, 2)'; + + $return = [ + 'names' => [], + 'ids' => [], + ]; + + foreach (acym_loadObjectList($query) as $one) { + $return['names'][] = $one->name; + $return['ids'][] = $one->id; + } + + return $return; + } + + public function delete($elements) + { + if (!is_array($elements)) { + $elements = [$elements]; + } + acym_arrayToInteger($elements); + + if (empty($elements)) { + return 0; + } + + acym_query('DELETE FROM #__acym_user_has_field WHERE field_id IN ('.implode(',', $elements).')'); + + return parent::delete($elements); + } + + public function displayField($field, $defaultValue, $size, $valuesArray, $displayOutside = true, $displayFront = false, $user = null, $display = 1, $displayIf = '') + { + if ($display == 0) return ''; + + $cmsUser = false; + if ($displayFront && !empty($user->id)) { + $cmsUser = !empty($user->cms_id) ? true : false; + if ($field->id == 1) { + $defaultValue = $user->name; + } elseif ($field->id == 2) { + $defaultValue = $user->email; + } else { + $allValues = []; + $defaultUserValue = $this->getFieldsValueByUserId($user->id); + if (!empty($defaultUserValue)) { + foreach ($defaultUserValue as $one) { + $allValues[$one->field_id] = $one->value; + } + } + + if (isset($allValues[$field->id])) { + $defaultValue = is_null(json_decode($allValues[$field->id])) ? $allValues[$field->id] : json_decode($allValues[$field->id]); + } + } + } + + if (in_array($field->type, ['radio', 'checkbox'])) { + $valuesArrayTmp = []; + foreach ($valuesArray as $oneValue) { + if (!is_object($oneValue)) { + $valuesArrayTmp = $valuesArray; + break; + } + + if (!empty($oneValue->disable)) continue; + $valuesArrayTmp[$oneValue->value] = $oneValue->text; + } + $valuesArray = $valuesArrayTmp; + } + + if (is_array($valuesArray)) { + foreach ($valuesArray as $key => $oneValue) { + if (is_object($oneValue) && !empty($valuesArray[$key]->text)) { + $valuesArray[$key]->text = acym_translation($valuesArray[$key]->text); + } elseif (is_string($oneValue)) { + $valuesArray[$key] = acym_translation($valuesArray[$key]); + } + } + } + + $return = ''; + + $field->name = acym_translation($field->name); + + $style = empty($size) ? '' : ' style="'.$size.'"'; + $messageRequired = empty($field->option->error_message) ? acym_translation_sprintf('ACYM_DEFAULT_REQUIRED_MESSAGE', $field->name) : acym_translation($field->option->error_message); + $requiredJson = json_encode(['type' => $field->type, 'message' => $messageRequired]); + $required = $field->required ? ' data-required="'.acym_escape($requiredJson).'"' : ''; + $placeholder = ''; + if (!$displayOutside) $placeholder = ' placeholder="'.acym_escape($field->name).'"'; + + $name = 'customField['.intval($field->id).']'; + $nameAttribute = ' name="'.$name.'"'; + $value = ' value="'.acym_escape($defaultValue).'"'; + + + if ($field->type == 'date' || ($displayOutside && (in_array($field->id, [1, 2]) || in_array($field->type, ['text', 'textarea', 'single_dropdown', 'multiple_dropdown', 'custom_text'])))) { + $return .= '