| Current Path : /var/www/html/components/com_jdonation/helper/ |
| Current File : /var/www/html/components/com_jdonation/helper/helper.php |
<?php
/**
* @version 5.9.5
* @package Joomla
* @subpackage Joom Donation
* @author Dang Thuc Dam
* @copyright Copyright (C) 2009 - 2023 Ossolution Team
* @license GNU/GPL, see LICENSE.php
*/
defined('_JEXEC') or die();
use Joomla\CMS\Object\CMSObject;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Form\FormHelper;
use Joomla\String\StringHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Http\HttpFactory;
use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\Registry\Registry;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Language\Multilanguage;
class DonationHelper
{
/**
* Display copy right information
*
*/
public static function displayCopyRight()
{
echo '<div class="clearfix"></div><div class="copyright" style="text-align:center;margin-top: 5px;"><a href="http://joomdonation.com/components/joom-donation.html" target="_blank"><strong>Joom Donation</strong></a> version <strong>' . self::getInstalledVersion() . '</strong>, Copyright (C) 2010 - ' .
date('Y') . ' <a href="http://joomdonation.com" target="_blank"><strong>Ossolution Team</strong></a></div>';
}
/**
* Return the current installed version
*
* @return string
*/
public static function getInstalledVersion()
{
return '5.10.0';
}
/**
* Gets a list of the actions that can be performed.
*
* @return JObject
*/
public static function getActions()
{
$user = Factory::getUser();
$result = new CMSObject();
$actions = array('core.admin', 'core.manage', 'core.create', 'core.edit', 'core.edit.own', 'core.edit.state', 'core.delete');
foreach ($actions as $action)
{
$result->set($action, $user->authorise($action, 'com_jdonation'));
}
return $result;
}
/**
* Get configuration data and store in config object
*
* @return object
*/
public static function getConfig($nl2br = false)
{
static $config;
if (!$config)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$config = new stdClass();
$query->select('*')
->from('#__jd_configs');
$db->setQuery($query);
$rows = $db->loadObjectList();
for ($i = 0, $n = count($rows); $i < $n; $i++)
{
$row = $rows[$i];
$key = $row->config_key;
$value = stripslashes($row->config_value);
if ($nl2br)
{
$value = nl2br($value);
}
$config->$key = $value;
}
}
return $config;
}
public static function addSideBarmenus($vName = ''){
if (version_compare(JVERSION, '3.0', 'ge')) {
JHtmlSidebar::addEntry(
Text::_('JD_DASHBOARD'),
'index.php?option=com_jdonation&view=dashboard',
$vName == 'dashboard'
);
JHtmlSidebar::addEntry(
Text::_('JD_CAMPAIGNS'),
'index.php?option=com_jdonation&view=campaigns',
$vName == 'campaigns' || $vName == 'campaign'
);
JHtmlSidebar::addEntry(
Text::_('JD_CUSTOM_FIELDS'),
'index.php?option=com_jdonation&view=fields',
$vName == 'fields' || $vName == 'field'
);
JHtmlSidebar::addEntry(
Text::_('JD_DONORS'),
'index.php?option=com_jdonation&view=donors',
$vName == 'donors' || $vName == 'donor'
);
JHtmlSidebar::addEntry(
Text::_('JD_PAYMENT_PLUGINS'),
'index.php?option=com_jdonation&view=plugins',
$vName == 'plugins'
);
JHtmlSidebar::addEntry(
Text::_('JD_EXPORT_DONORS'),
'index.php?option=com_jdonation&task=donor.export',
$vName == 'donor.export'
);
JHtmlSidebar::addEntry(
Text::_('JD_IMPORT_DONORS'),
'index.php?option=com_jdonation&view=import',
$vName == 'import'
);
JHtmlSidebar::addEntry(
Text::_('JD_CONFIGURATION'),
'index.php?option=com_jdonation&view=configuration',
$vName == 'configuration'
);
JHtmlSidebar::addEntry(
Text::_('JD_TRANSLATION'),
'index.php?option=com_jdonation&view=language',
$vName == 'language'
);
}
}
/**
* Get specify config value
*
* @param string $key
*/
public static function getConfigValue($key)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('config_value')
->from('#__jd_configs')
->where('config_key = ' . $db->quote($key));
$db->setQuery($query);
return $db->loadResult();
}
/**
*
* Apply some fixes for request data
*
* @return void
*/
public static function prepareRequestData()
{
//Remove cookie vars from request data
$cookieVars = array_keys($_COOKIE);
if (count($cookieVars))
{
foreach ($cookieVars as $key)
{
if (!isset($_POST[$key]) && !isset($_GET[$key]))
{
unset($_REQUEST[$key]);
}
}
}
if (isset($_REQUEST['start']) && !isset($_REQUEST['limitstart']))
{
$_REQUEST['limitstart'] = $_REQUEST['start'];
}
if (!isset($_REQUEST['limitstart']))
{
$_REQUEST['limitstart'] = 0;
}
// Fix PayPal IPN sending to wrong URL
if (!empty($_POST['txn_type']) && empty($_REQUEST['task']) && empty($_REQUEST['view']))
{
$_REQUEST['payment_method'] = 'os_paypal';
if (!empty($_POST['subscr_id']) || strpos($_POST['txn_type'], 'subscr_'))
{
$_REQUEST['task'] = 'recurring_payment_confirm';
}
else
{
$_REQUEST['task'] = 'payment_confirm';
}
}
}
/**
* Get URL of the site, using for Ajax request
*/
public static function getSiteUrl()
{
$uri = Uri::getInstance();
$base = $uri->toString(array('scheme', 'host', 'port'));
if (strpos(php_sapi_name(), 'cgi') !== false && !ini_get('cgi.fix_pathinfo') && !empty($_SERVER['REQUEST_URI']))
{
$script_name = $_SERVER['PHP_SELF'];
}
else
{
$script_name = $_SERVER['SCRIPT_NAME'];
}
$path = rtrim(dirname($script_name), '/\\');
if ($path)
{
return $base . $path . '/';
}
else
{
return $base . '/';
}
}
/**
* Convert payment amount to USD currency in case the currency is not supported by the payment gateway
*
* @param $amount
* @param $currency
*
* @return float
*/
public static function convertAmountToUSD($amount, $currency)
{
static $rate = null;
if ($rate === null)
{
$rate = self::get_conversion($currency,'USD');
}
if ($rate > 0)
{
$amount = $amount * $rate;
}
return round($amount, 2);
}
/**
* This function is used to convert amount to default currency
* @param $amount
* @param $currency
*/
public static function convertAmountToDefaultCurrency($amount, $currency){
$config = self::getConfig();
$rate = self::get_conversion($currency,$config->currency);
if ($rate > 0)
{
$amount = $amount * $rate;
}
return round($amount, 2);
}
/**
* Get list of form fields using on donation form
*
* @param null $activeLanguage
*
* @return mixed
*/
public static function getFormFields($activeLanguage = null, $isEmail = false)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$fieldSuffix = DonationHelper::getFieldSuffix($activeLanguage);
$query->select('*')
->from('#__jd_fields')
->where('published = 1');
if($isEmail == true)
{
$query->where('`fieldtype` <> "Message"');
}
$query->order('ordering');
if ($fieldSuffix)
{
self::getMultilingualFields($query, array('title', 'description', 'values', 'default_values','place_holder'), $fieldSuffix);
}
$db->setQuery($query);
return $db->loadObjectList();
}
/**
*
* Get data from donation record
*
* @param $row
*
* @return array
*/
public static function getDonationData($row, $rowFields, $includeFileUpload = true, $donationForm = true)
{
$config = self::getConfig();
$data = array();
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('a.name, a.fieldtype, b.field_value')
->from('#__jd_fields AS a')
->innerJoin('#__jd_field_value AS b ON a.id = b.field_id ')
->where('donor_id=' . (int) $row->id);
$db->setQuery($query);
$fieldValues = $db->loadObjectList('name');
foreach ($rowFields as $rowField)
{
if (!$includeFileUpload && $rowField->fieldtype == 'File')
{
continue;
}
//do not show custom field: Message in Email and Invoice
if($rowField->fieldtype == 'Message' && ! $donationForm)
{
continue;
}
if ($rowField->is_core)
{
$data[$rowField->name] = $row->{$rowField->name};
if(!$config->populate_from_previous_donation && $donationForm)
{
unset($data[$rowField->name]);
}
}
else
{
if (isset($fieldValues[$rowField->name]))
{
$data[$rowField->name] = $fieldValues[$rowField->name]->field_value;
}
if(!$config->populate_from_previous_donation && $donationForm)
{
unset($data[$rowField->name]);
}
}
}
return $data;
}
/**
* Get form data to used on donation form
*
* @param $rowFields
* @param $userId
* @param $config
*
* @return array
*/
public static function getFormData($rowFields, $userId, $config, $includeFileUpload = true, $donationForm = false)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$data = array();
if ($userId)
{
if ($config->cb_integration == 1)
{
$syncronizer = new OSFSynchronizerCommunitybuilder();
$mappings = array();
foreach ($rowFields as $rowField)
{
if ($rowField->field_mapping)
{
$mappings[$rowField->name] = $rowField->field_mapping;
}
}
$data = $syncronizer->getData($userId, $mappings);
}
elseif ($config->cb_integration == 2)
{
$syncronizer = new OSFSynchronizerJomsocial();
$mappings = array();
foreach ($rowFields as $rowField)
{
if ($rowField->field_mapping)
{
$mappings[$rowField->name] = $rowField->field_mapping;
}
}
$data = $syncronizer->getData($userId, $mappings);
}
elseif ($config->cb_integration == 3)
{
$syncronizer = new OSFSynchronizerJoomla();
$mappings = array();
foreach ($rowFields as $rowField)
{
if ($rowField->field_mapping)
{
$mappings[$rowField->name] = $rowField->field_mapping;
}
}
$data = $syncronizer->getData($userId, $mappings);
}
elseif ($config->cb_integration == 4) //easy social
{
$syncronizer = new OSFSynchronizerEasysocial();
$mappings = array();
foreach ($rowFields as $rowField)
{
if ($rowField->field_mapping)
{
$mappings[$rowField->name] = $rowField->field_mapping;
}
}
$data = $syncronizer->getData($userId, $mappings);
}
elseif ($config->cb_integration == 5) //easy social
{
$syncronizer = new OSFSynchronizerEasyprofile();
$mappings = array();
foreach ($rowFields as $rowField)
{
if ($rowField->field_mapping)
{
$mappings[$rowField->name] = $rowField->field_mapping;
}
}
$data = $syncronizer->getData($userId, $mappings);
}
else
{
$query->select('*')
->from('#__jd_donors')
->where('user_id=' . (int) $userId)
->order('id DESC');
$db->setQuery($query, 0, 1);
$rowDonor = $db->loadObject();
if ($rowDonor)
{
$data = self::getDonationData($rowDonor, $rowFields, $includeFileUpload, $donationForm);
}
}
}
return $data;
}
/**
* Store custom fields data
*
* @param $donorId
*
* @param $data
*/
public static function storeFormData($donorId, $data)
{
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
$db = Factory::getDbo();
$query = $db->getQuery(true);
$rowFieldValue = Table::getInstance('Fieldvalue', 'DonationTable');
$query->delete('#__jd_field_value')->where('donor_id=' . (int) $donorId);
$db->setQuery($query);
$db->execute();
$config = self::getConfig();
$uploadFolder = 'media/com_jdonation/files';
$pathUpload = JPATH_ROOT . '/' . $uploadFolder;
if (!Folder::exists($pathUpload))
{
Folder::create($pathUpload);
}
$allowedExtensions = $config->allowed_extensions;
if (!$allowedExtensions)
{
$allowedExtensions = 'doc, docx, ppt, pptx, pdf, zip, rar, jpg, jpeg, png, zipx, mp4';
}
$allowedExtensions = explode(',', $allowedExtensions);
$allowedExtensions = array_map('trim', $allowedExtensions);
$rowFields = self::getFormFields();
foreach ($rowFields as $rowField)
{
if ($rowField->is_core)
{
continue;
}
if ($rowField->fieldtype == 'File')
{
$name = $rowField->name;
// If there are field, we need to upload the file to server and save it !
if (is_uploaded_file($_FILES[$name]['tmp_name']))
{
if ($_FILES[$name]['name'] != '')
{
$fileName = $_FILES[$name]['name'];
$fileExt = File::getExt($fileName);
if (in_array(strtolower($fileExt), $allowedExtensions))
{
$fileName = File::makeSafe($fileName);
if (File::exists($pathUpload . '/' . $fileName))
{
$targetFileName = time() . '_' . $fileName;
}
else
{
$targetFileName = $fileName;
}
if (version_compare(JVERSION, '3.4.4', 'ge'))
{
File::upload($_FILES[$name]['tmp_name'], $pathUpload . '/' . $targetFileName, false, true);
}
else
{
File::upload($_FILES[$name]['tmp_name'], $pathUpload . '/' . $targetFileName);
}
$data[$name] = $targetFileName;
}
}
}
else
{
if($data['current_'.$name] != "")
{
$data[$name] = $data['current_'.$name];
}
}
}
if (isset($data[$rowField->name]))
{
$fieldValue = $data[$rowField->name];
$rowFieldValue->id = 0;
$rowFieldValue->field_id = $rowField->id;
$rowFieldValue->donor_id = $donorId;
if (is_array($fieldValue))
{
$fieldValue = json_encode($fieldValue);
}
$rowFieldValue->field_value = $fieldValue;
$rowFieldValue->store();
}
}
}
/**
*
*
* @return string
*/
public static function validateEngine()
{
$dateNow = HTMLHelper::_('date', Factory::getDate(), 'Y/m/d');
$validClass = array(
"",
"validate[custom[integer]]",
"validate[custom[number]]",
"validate[custom[email]]",
"validate[custom[url]]",
"validate[custom[phone]]",
"validate[custom[date],past[$dateNow]]",
"validate[custom[ipv4]]",
"validate[minSize[6]]",
"validate[maxSize[12]]",
"validate[custom[integer],min[-5]]",
"validate[custom[integer],max[50]]");
return json_encode($validClass);
}
public static function getUserInput($userId, $fieldName = 'user_id')
{
if (version_compare(JVERSION, '3.5', 'le')){
// Initialize variables.
$html = array();
$link = 'index.php?option=com_users&view=users&layout=modal&tmpl=component&field=user_id';
// Initialize some field attributes.
$attr = ' class="inputbox"';
// Load the modal behavior script.
HTMLHelper::_('behavior.modal', 'a.modal_user_id');
// Build the script.
$script = array();
$script[] = ' function jSelectUser_user_id(id, title) {';
$script[] = ' var old_id = document.getElementById("user_id").value;';
$script[] = ' if (old_id != id) {';
$script[] = ' document.getElementById("' . $fieldName . '").value = id;';
$script[] = ' document.getElementById("user_id_name").value = title;';
$script[] = ' populateUserData();';
$script[] = ' }';
$script[] = ' SqueezeBox.close();';
$script[] = ' }';
// Add the script to the document head.
Factory::getDocument()->addScriptDeclaration(implode("\n", $script));
// Load the current username if available.
$table = Table::getInstance('user');
if ($userId)
{
$table->load($userId);
}
else
{
$table->name = '';
}
// Create a dummy text field with the user name.
$html[] = '<div class="fltlft">';
$html[] = ' <input type="text" id="user_id_name"' . ' value="' . htmlspecialchars($table->name, ENT_COMPAT, 'UTF-8') . '"' .
' disabled="disabled"' . $attr . ' />';
$html[] = '</div>';
// Create the user select button.
$html[] = '<div class="button2-left">';
$html[] = '<div class="blank">';
$html[] = '<a class="modal_user_id" title="' . Text::_('JLIB_FORM_CHANGE_USER') . '"' . ' href="' . $link . '"' .
' rel="{handler: \'iframe\', size: {x: 800, y: 500}}">';
$html[] = ' ' . Text::_('JLIB_FORM_CHANGE_USER') . '</a>';
$html[] = '</div>';
$html[] = '</div>';
// Create the real field, hidden, that stored the user id.
$html[] = '<input type="hidden" id="' . $fieldName . '" name="' . $fieldName . '" value="' . $userId . '" />';
return implode("\n", $html);
}
else
{
$field = FormHelper::loadFieldType('User');
$element = new SimpleXMLElement('<field />');
$element->addAttribute('name', 'user_id');
$element->addAttribute('class', 'readonly');
$element->addAttribute('onchange', 'populateUserData();');
$field->setup($element, $userId);
return $field->input;
}
}
/**
* Build the tags replacement array which will be used to replace tags in messages
*
* @param $row The donation record
* @param $config The configuration data
*
* @return array An array contains replacement tags in key => value format
*/
public static function buildReplaceTags($row, $config, $loadCss = false, $toAdmin = false)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$fieldSuffix = DonationHelper::getFieldSuffix($row->language);
$replaces = array();
$query->select('title' . $fieldSuffix)
->from('#__jd_campaigns')
->where('id=' . (int) $row->campaign_id);
$db->setQuery($query);
$replaces['campaign'] = $db->loadResult();
if($row->currency_code == "")
{
$show_symbol = 1;
}
elseif($row->curreny_code == $config->currency)
{
$show_symbol = 1;
}
else
{
$show_symbol = 0;
}
if($show_symbol == 1)
{
$replaces['amount'] = DonationHelperHtml::formatAmount($config, $row->amount);
}
else
{
$replaces['amount'] = DonationHelperHtml::formatAmount($config, $row->amount , $row->currency_code, 0);
}
$donationDetail = self::getEmailContent($config, $row, $loadCss, $toAdmin);
$replaces['donation_detail'] = self::convertImgTags($donationDetail);
if ($row->donation_type == 'R')
{
$replaces['donation_type'] = Text::_('JD_RECURRING');
}
else
{
$replaces['donation_type'] = Text::_('JD_ONETIME');
}
$replaces['date'] = date($config->date_format);
$replaces['donation_date'] = HTMLHelper::_('date', $row->created_date, $config->date_format);
$replaces['id'] = $row->id;
$replaces['transaction_id'] = $row->transaction_id;
$replaces['dedicate_type'] = self::getDedicateType($row->dedicate_type);
$replaces['honoree_name'] = $row->dedicate_name;
if($row->hide_me == 1)
{
$replaces['anonymous_donation'] = Text::_('JD_YES');
}
else
{
$replaces['anonymous_donation'] = Text::_('JD_NO');
}
$replaces['user_ip'] = self::get_ip_address();
$replaces['user'] = $row->first_name." ".$row->last_name;
if($row->published == 1)
{
$replaces['paid'] = Text::_('JD_PAID');
}
else
{
$replaces['paid'] = Text::_('JD_UNPAID');
}
$method = os_payments::getPaymentMethod($row->payment_method);
if ($method)
{
$replaces['payment_method'] = Text::_($method->getTitle());
}
else
{
$replaces['payment_method'] = "";
}
//Get custom fields
$rowFields = self::getFormFields($row->language, true);
$fields = array();
for ($i = 0, $n = count($rowFields); $i < $n; $i++)
{
$rowField = $rowFields[$i];
if ($rowField->is_core)
{
$replaces[strtoupper($rowField->name)] = $row->{$rowField->name};
}
else
{
$fields[$rowField->id] = $rowField->name;
}
}
$query->clear();
$query->select('field_id, field_value')
->from('#__jd_field_value')
->where('donor_id=' . (int) $row->id);
$db->setQuery($query);
$rowValues = $db->loadObjectList();
$values = array();
for ($i = 0, $n = count($rowValues); $i < $n; $i++)
{
$rowValue = $rowValues[$i];
$values[$rowValue->field_id] = $rowValue->field_value;
}
if (count($values))
{
foreach ($values as $key => $value)
{
$replaces[strtoupper($fields[$key])] = $value;
}
}
return $replaces;
}
/**
* Create a user account
*
* @param array $data
*
* @return int Id of created user
*/
public static function saveRegistration($data)
{
//Need to load com_users language file
$lang = Factory::getLanguage();
$tag = $lang->getTag();
if (!$tag)
{
$tag = 'en-GB';
}
$lang->load('com_users', JPATH_ROOT, $tag);
$data['name'] = $data['first_name'] . ' ' . $data['last_name'];
$data['password'] = $data['password2'] = $data['password1'];
$data['email1'] = $data['email2'] = $data['email'];
//require_once JPATH_ROOT . '/components/com_users/models/registration.php';
//$model = new UsersModelRegistration();
//$model->register($data);
if (self::isJoomla4())
{
Form::addFormPath(JPATH_ROOT . '/components/com_users/forms');
/* @var \Joomla\Component\Users\Site\Model\RegistrationModel $model */
$model = Factory::getApplication()->bootComponent('com_users')
->getMVCFactory()->createModel('Registration', 'Site', ['ignore_request' => true]);
$model->register($data);
}
else
{
require_once JPATH_ROOT . '/components/com_users/models/registration.php';
if (Multilanguage::isEnabled())
{
Form::addFormPath(JPATH_ROOT . '/components/com_users/models/forms');
Form::addFieldPath(JPATH_ROOT . '/components/com_users/models/fields');
}
$model = new UsersModelRegistration();
$model->register($data);
}
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('id')
->from('#__users')
->where('username=' . $db->quote($data['username']));
$db->setQuery($query);
return (int) $db->loadResult();
}
/**
* Check if the payment method is enabled or not
*
* @param $paymentMethod string Name of payment method
*
* @return bool True if the payment method is enabled, otherwise false
*/
public static function isPaymentMethodEnabled($paymentMethod)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('COUNT(*)')
->from('#__jd_payment_plugins')
->where('published = 1')
->where('name=' . $db->quote($paymentMethod));
$db->setQuery($query);
$total = (int) $db->loadResult();
if ($total)
{
return true;
}
else
{
return false;
}
}
/**
* Load jquery used in the extension
*
*/
public static function loadJQuery()
{
HTMLHelper::_('jquery.framework');
}
/**
* Load twitter bootstrap framework
*
* @param bool $loadJs
*/
public static function loadBootstrap($loadJs = true)
{
$document = Factory::getDocument();
if ($loadJs)
{
HTMLHelper::_('jquery.framework');
//$document->addScript(JUri::root(true) . '/media/com_jdonation/assets/bootstrap/js/jquery.min.js');
//$document->addScript(JUri::root(true) . '/media/com_jdonation/assets/bootstrap/js/jquery-noconflict.js');
$document->addScript(Uri::root(true) . '/media/com_jdonation/assets/bootstrap/js/bootstrap.min.js');
}
if (self::isJoomla4())
{
HTMLHelper::_('bootstrap.loadCss');
}
else
{
$document->addStyleSheet(Uri::root(true) . '/media/com_jdonation/assets/bootstrap/css/bootstrap.css');
$document->addStyleSheet(Uri::root(true) . '/media/com_jdonation/assets/bootstrap/css/bootstrap.min.css');
$document->addStyleSheet(Uri::root(true) . '/media/com_jdonation/assets/bootstrap/css/bootstrap-responsive.min.css');
}
}
/**
* Get Itemid of Joom Donation
*
* @return int
*/
public static function getItemid()
{
$app = Factory::getApplication();
$menus = $app->getMenu('site');
$component = ComponentHelper::getComponent('com_jdonation');
$items = $menus->getItems('component_id', $component->id);
$views = array('campaigns', 'donation');
foreach ($views as $view)
{
$viewUrl = 'index.php?option=com_jdonation&view=' . $view;
foreach ($items as $item)
{
if (strpos($item->link, $viewUrl) !== false)
{
return $item->id;
}
}
}
return 0;
}
/**
* Load language from main component
*
*/
public static function loadLanguage()
{
static $loaded;
if (!$loaded)
{
$lang = Factory::getLanguage();
$tag = $lang->getTag();
if (!$tag)
{
$tag = 'en-GB';
}
$lang->load('com_jdonation', JPATH_ROOT, $tag);
$loaded = true;
}
}
/**
* Get country code
*
* @param string $countryName
*
* @return string
*/
public static function getCountryCode($countryName)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('country_2_code')
->from('#__jd_countries')
->where('LOWER(name) = ' . $db->quote(StringHelper::strtolower($countryName)));
$db->setQuery($query);
$countryCode = $db->loadResult();
if (!$countryCode)
{
$countryCode = 'US';
}
return $countryCode;
}
/**
* Get state_2_code
*
* @param string $country
* @param string $stateName
*
* @return string
*/
public static function getStateCode($country, $stateName)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
if (!$country)
{
$config = self::getConfig();
$country = $config->default_country;
}
$query->select('a.state_2_code')
->from('#__jd_states AS a')
->innerJoin('#__jd_countries AS b ON a.country_id = b.country_id')
->where('b.name = ' . $db->quote($country))
->where('a.state_name = ' . $db->quote($stateName));
$db->setQuery($query);
$state = $db->loadResult();
return $state ? $state : $stateName;
}
/**
* This email is used to send email to administrator when new campaign is added
* @param $id
*/
static function sendNewCampaign($id)
{
if($id > 0)
{
$db = Factory::getDbo();
$config = self::getConfig();
if ($config->from_email)
{
$fromEmail = $config->from_email;
}
else
{
$fromEmail = Factory::getConfig()->get('mailfrom');
}
$user = Factory::getUser();
$query = $db->getQuery(true);
$query->select('title')->from('#__jd_campaigns')->where('id = '.$id);
$db->setQuery($query);
$campaign_title = $db->loadResult();
$siteName = Factory::getConfig()->get('sitename');
$subject = $config->new_campaign_email_subject;
$body = $config->new_campaign_email_body;
$body = str_replace("[CAMPAIGN_TITLE]", $campaign_title, $body);
$body = str_replace("[OWNER]", $user->name, $body);
$url = Route::_("index.php?option=com_jdonation&task=campaign.id&id=".$id);
$url = Uri::getInstance()->toString(array('scheme', 'user', 'pass', 'host')).'administrator/'.$url;
$link = "<a href='".$url."'>".$url."</a>";
$body = str_replace("[CAMPAIGN_LINK]", $link, $body);
$mailer = Factory::getMailer();
if ($config->notification_emails == '')
{
$notificationEmails = $fromEmail;
}
else
{
$notificationEmails = $config->notification_emails;
}
$notificationEmails = str_replace(' ', '', $notificationEmails);
$emails = explode(',', $notificationEmails);
// Add attachment
for ($i = 0, $n = count($emails); $i < $n; $i++)
{
$email = $emails[$i];
$mailer->ClearAllRecipients();
try
{
$mailer->sendMail($fromEmail, $siteName, $email, $subject, $body, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
}
}
}
/**
* Send notification emails to administrators and confirmation email to donor
*
* @param object $row
* @param object $config
*/
public static function sendEmails($row, $config, $data = [])
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$mailer = Factory::getMailer();
$fieldSuffix = DonationHelper::getFieldSuffix($row->language);
if ($fieldSuffix)
{
$configFields = array(
'user_email_subject',
'user_email_body_offline',
'user_email_body_offline_received',
'user_email_body'
);
DonationHelper::getMultilingualConfigData($config, $fieldSuffix, $configFields);
}
$siteName = Factory::getConfig()->get('sitename');
$replaces = self::buildReplaceTags($row, $config, true);
// Override email message
if ($row->campaign_id)
{
$query->select('*')
->from('#__jd_campaigns')
->where('id = ' . (int) $row->campaign_id);
$db->setQuery($query);
if ($fieldSuffix)
{
$campaignFields = array(
'title',
'user_email_subject',
'user_email_body',
'user_email_body_offline',
'user_email_body_offline_received'
);
DonationHelper::getMultilingualFields($query, $campaignFields, $fieldSuffix);
}
$rowCampaign = $db->loadObject();
if ($rowCampaign->user_email_subject)
{
$config->user_email_subject = $rowCampaign->user_email_subject;
}
if ($rowCampaign->user_email_body)
{
$config->user_email_body = "<HTML>".$rowCampaign->user_email_body."</HTML>";
}
if ($rowCampaign->notification_emails)
{
$config->notification_emails = $rowCampaign->notification_emails;
}
if($rowCampaign->user_email_body_offline)
{
$config->user_email_body_offline = $rowCampaign->user_email_body_offline;
}
if($rowCampaign->user_email_body_offline_received)
{
$config->user_email_body_offline_received = $rowCampaign->user_email_body_offline_received;
}
}
if ($row->campaign_id && $rowCampaign->from_name != '')
{
$fromName = $rowCampaign->from_name;
}
elseif ($config->from_name)
{
$fromName = $config->from_name;
}
else
{
$fromName = Factory::getConfig()->get('fromname');
}
if ($row->campaign_id && $rowCampaign->from_email != '')
{
$fromEmail = $rowCampaign->from_email;
}
elseif ($config->from_email)
{
$fromEmail = $config->from_email;
}
else
{
$fromEmail = Factory::getConfig()->get('mailfrom');
}
//Notification email send to user
$subject = $config->user_email_subject;
if ($row->payment_method == 'os_offline')
{
if($row->published == 0)
{
$body = $config->user_email_body_offline;
}
elseif($row->published == 1)
{
$body = $config->user_email_body_offline_received;
}
}
else
{
$body = $config->user_email_body;
}
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
$body = self::convertImgTags($body);
$attachments = array();
if ($config->activate_donation_receipt_feature && $config->send_receipt_via_email && $row->published == 1)
{
if (!$row->invoice_number)
{
$row->invoice_number = self::getInvoiceNumber($row);
$row->store();
}
$invoiceNumber = self::formatInvoiceNumber($row->invoice_number, $config, $row);
self::generateInvoicePDF($row);
$attachments[] = JPATH_ROOT . '/media/com_jdonation/receipts/' .$invoiceNumber . '.pdf';
}
try
{
$replyArr = [];
if ($rowCampaign->reply_email)
{
$replyArr[] = $rowCampaign->reply_email;
}
elseif($config->reply_email != '')
{
$replyArr[] = $config->reply_email;
}
$mailer->sendMail($fromEmail, $fromName, $row->email, $subject, $body, 1, null, null, $attachments, $replyArr);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
//log Emails
static::logEmails(array($row->email), $subject, $body, 1, 'confirmation');
$mailer->ClearAttachments();
if ($row->receive_user_id)
{
//Send a CC email to administrator
$query->clear();
$query->select('*')
->from('#__users')
->where('id = ' . (int) $row->receive_user_id);
$db->setQuery($query);
$rowUser = $db->loadObject();
if ($rowUser)
{
$subject = $config->member_email_subject;
$body = $config->member_email_body;
$receiveEmail = $rowUser->email;
$name = $rowUser->name;
$body = str_replace('[NAME]', $name, $body);
$body = str_replace('[SITE_NAME]', $siteName, $body);
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
$mailer->ClearAllRecipients();
try
{
$replyArr = [];
if ($rowCampaign->reply_email)
{
$replyArr[] = $rowCampaign->reply_email;
}
elseif($config->reply_email != '')
{
$replyArr[] = $config->reply_email;
}
$mailer->sendMail($fromEmail, $fromName, $receiveEmail, $subject, $body, 1 , null, null, null, $replyArr);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
//log Emails
static::logEmails(array($receiveEmail), $subject, $body, 1, 'member_email');
}
}
//Send attachments to admin emails
if ($config->send_attachment_to_admin_email)
{
$query->clear();
$query->select('a.id, a.name, a.fieldtype')
->from('#__jd_fields AS a')
->where('a.published = 1')
->where('fieldtype = "File"');
$db->setQuery($query);
$rowFields = $db->loadObjectList();
$attachmentsPath = JPATH_ROOT . '/media/com_jdonation/files';
for ($i = 0, $n = count($rowFields); $i < $n; $i++)
{
$rowField = $rowFields[$i];
$fieldName = strtoupper($rowField->name);
if (isset($replaces[$fieldName]))
{
$fileName = $replaces[$fieldName];
if ($fileName && file_exists($attachmentsPath . '/' . $fileName))
{
$pos = strpos($fileName, '_');
if ($pos !== false)
{
$originalFilename = substr($fileName, $pos + 1);
}
else
{
$originalFilename = $fileName;
}
$mailer->addAttachment($attachmentsPath . '/' . $fileName, $originalFilename);
}
}
}
}
//send campaign owner notification email
if($config->use_campaign && $row->campaign_id > 0)
{
$user_id = self::getCampaignOwner($row->campaign_id);
if((int)$user_id > 0)
{
$owner = Factory::getUser($user_id);
$ownerEmail = $owner->email;
$campaignOwnerNotificationSbj = $config->campaign_owner_notification;
$campaignOwnerNotificationBody = $config->campaign_owner_notification_body;
if($campaignOwnerNotificationSbj != "" && $campaignOwnerNotificationBody != "")
{
$campaignOwnerNotificationBody = "<HTML>".$campaignOwnerNotificationBody."</HTML>";
$replaces = self::buildReplaceTags($row, $config, true, true);
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$campaignOwnerNotificationBody = str_replace("[$key]", $value, $campaignOwnerNotificationBody);
$campaignOwnerNotificationSbj = str_replace("[$key]", $value, $campaignOwnerNotificationSbj);
}
try
{
$mailer->sendMail($fromEmail, $fromName, $ownerEmail, $campaignOwnerNotificationSbj, $campaignOwnerNotificationBody, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
}
}
}
//Send emails to notification emails to admin
if ($config->notification_emails == '')
{
$notificationEmails = $fromEmail;
}
else
{
$notificationEmails = $config->notification_emails;
}
$notificationEmails = str_replace(' ', '', $notificationEmails);
$emails = explode(',', $notificationEmails);
$subject = $config->admin_email_subject;
$body = "<HTML>".$config->admin_email_body."</HTML>";
$replaces = self::buildReplaceTags($row, $config, true, true);
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
// Add attachment
if($config->use_campaign && $rowCampaign->user_id > 0 && ($campaignOwnerNotificationSbj == '' || $campaignOwnerNotificationBody == ''))
{
$agency = Factory::getUser($rowCampaign->user_id);
$emails[] = $agency->email;
}
for ($i = 0, $n = count($emails); $i < $n; $i++)
{
$email = $emails[$i];
$mailer->ClearAllRecipients();
if($config->send_receipt_to_admin && $config->activate_donation_receipt_feature && $row->published == 1)
{
if(count($attachments) == 0)
{
self::generateInvoicePDF($row);
if (!$row->invoice_number)
{
$row->invoice_number = self::getInvoiceNumber($row);
}
$invoiceNumber = self::formatInvoiceNumber($row->invoice_number, $config, $row);
$attachments[] = JPATH_ROOT . '/media/com_jdonation/receipts/' . $invoiceNumber .'.pdf';
}
try
{
$mailer->sendMail($fromEmail, $fromName, $email, $subject, $body, 1, null, null, $attachments);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
}
else
{
try
{
$mailer->sendMail($fromEmail, $fromName, $email, $subject, $body, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
}
}
//log Emails
static::logEmails($emails, $subject, $body, 2, 'admin_email');
//send email to honoree
$replaces = self::buildReplaceTags($row, $config, true, false);
if($row->show_dedicate == 1 && $row->dedicate_email != "" && $config->send_email_to_honoree){
$subject = $config->honoree_email_subject;
$body = $config->honoree_email_body;
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
$mailer->ClearAllRecipients();
try
{
$mailer->sendMail($fromEmail, $fromName, $row->dedicate_email, $subject, $body, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
//log Emails
static::logEmails(array( $row->dedicate_email), $subject, $body, 1, 'honoree_email');
}
}
static function getDedicateType($type)
{
switch ($type){
case "1":
return Text::_('JD_IN_HONOR_OF');
break;
case "2":
return Text::_('JD_IN_MEMORY_OF');
break;
case "3":
return Text::_('JD_IN_DEDICATE_TO');
break;
case "4":
return Text::_('JD_IN_REMEMBRANCE_OF');
break;
}
}
/**
* Get email content for sending to administrator
*
* @param object $config : containing configuration data
* $param Object $row : containing donation record detail
*/
public static function getEmailContent($config, $row, $loadCss = false, $toAdmin= false)
{
$last4Digits = '';
if($toAdmin && $row->payment_method == 'os_jd_offline_creditcard'){
$cardNumber = Factory::getApplication()->input->getString('x_card_num', '');
if ($cardNumber)
{
$last4Digits = substr($cardNumber, strlen($cardNumber) - 4);
}
}
$db = Factory::getDbo();
$fieldSuffix = DonationHelper::getFieldSuffix($row->language);
$sql = 'SELECT title' . $fieldSuffix . ' FROM #__jd_campaigns WHERE id=' . (int) $row->campaign_id;
$db->setQuery($sql);
$campaignTitle = $db->loadResult();
$data = array();
$data['config'] = $config;
$data['last4Digits'] = $last4Digits;
$data['row'] = $row;
$data['campaignTitle'] = $campaignTitle;
if ($loadCss)
{
$layout = 'common/email_donation_detail.php';
$data['css'] = file_get_contents(JPATH_ROOT . '/media/com_jdonation/assets/css/style.css');
}
else
{
$layout = 'common/donation_detail.php';
}
$rowFields = self::getFormFields($row->language, true);
$formData = self::getDonationData($row, $rowFields, true, false);
$form = new OSFForm($rowFields);
$form->bind($formData)->prepareFormField($row->campaign_id);
$data['form'] = $form;
return DonationHelperHtml::loadCommonLayout($layout, $data);
}
/**
* Send recurring email
*
* @param object $row
* @param object $config
*/
public static function sendRecurringEmail($row, $config)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$mailer = Factory::getMailer();
$fieldSuffix = DonationHelper::getFieldSuffix($row->language);
if ($fieldSuffix)
{
$configFields = array(
'recurring_email_subject',
'recurring_email_body'
);
DonationHelper::getMultilingualConfigData($config, $fieldSuffix, $configFields);
}
if ($config->from_name)
{
$fromName = $config->from_name;
}
else
{
$fromName = Factory::getConfig()->get('fromname');
}
if ($config->from_email)
{
$fromEmail = $config->from_email;
}
else
{
$fromEmail = Factory::getConfig()->get('mailfrom');
}
$siteName = Factory::getConfig()->get('sitename');
$replaces = self::buildReplaceTags($row, $config, true);
$amount = Factory::getApplication()->input->getFloat('receive_amount', '');
if ($amount == '')
{
$amount = $row->amount;
}
if ($row->campaign_id)
{
$query->select('*')
->from('#__jd_campaigns')
->where('id = ' . (int) $row->campaign_id);
$db->setQuery($query);
if ($fieldSuffix)
{
$campaignFields = array(
'recurring_email_subject',
'recurring_email_body'
);
DonationHelper::getMultilingualFields($query, $campaignFields, $fieldSuffix);
}
$rowCampaign = $db->loadObject();
if ($rowCampaign->recurring_email_subject)
{
$config->recurring_email_subject = $rowCampaign->recurring_email_subject;
}
if ($rowCampaign->recurring_email_body)
{
$config->recurring_email_body = $rowCampaign->recurring_email_body;
}
if ($rowCampaign->notification_emails)
{
$config->notification_emails = $rowCampaign->notification_emails;
}
}
//Notification email send to administrators
$subject = $config->recurring_email_subject;
$body = $config->recurring_email_body;
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
//Replace some information in the body
$body = str_replace('[DONATION_AMOUNT]', number_format($amount, 2), $body);
$detailLink = Uri::base() . '/administrator/index.php?option=com_jdonation&task=edit&cid[]=' . $row->id;
$body = str_replace('[DETAIL_LINK]', $detailLink, $body);
if ($config->notification_emails == '')
{
$notificationEmails = $fromEmail;
}
else
{
$notificationEmails = $config->notification_emails;
}
$notificationEmails = str_replace(' ', '', $notificationEmails);
$emails = explode(',', $notificationEmails);
for ($i = 0, $n = count($emails); $i < $n; $i++)
{
$email = $emails[$i];
$mailer->ClearAllRecipients();
try
{
$mailer->sendMail($fromEmail, $fromName, $email, $subject, $body, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
}
static::logEmails($emails, $subject, $body, 2, 'recurring_email');
if ($row->receive_user_id)
{
$query->clear();
$query->select('*')
->from('#__users')
->where('id=' . $row->receive_user_id);
$db->setQuery($query);
$rowUser = $db->loadObject();
if ($rowUser)
{
$name = $rowUser->name;
$receiveEmail = $rowUser->email;
$subject = $config->member_recurring_email_subject;
$body = $config->member_recurring_email_body;
$body = str_replace('[AMOUNT]', number_format($amount, 2), $body);
$body = str_replace('[SITE_NAME]', $siteName, $body);
$body = str_replace('[NAME]', $name, $body);
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
$mailer->ClearAllRecipients();
try
{
$mailer->sendMail($fromEmail, $fromName, $receiveEmail, $subject, $body, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
static::logEmails(array( $receiveEmail), $subject, $body, 1, 'member_recurring_email');
}
}
}
public static function sendRecurringDonationCancelEmail($row, $config)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$mailer = Factory::getMailer();
$fieldSuffix = DonationHelper::getFieldSuffix($row->language);
if ($fieldSuffix)
{
$configFields = array(
'cancel_recurring_admin_email_subject',
'cancel_recurring_admin_email_body'
);
DonationHelper::getMultilingualConfigData($config, $fieldSuffix, $configFields);
}
if ($config->from_name)
{
$fromName = $config->from_name;
}
else
{
$fromName = Factory::getConfig()->get('fromname');
}
if ($config->from_email)
{
$fromEmail = $config->from_email;
}
else
{
$fromEmail = Factory::getConfig()->get('mailfrom');
}
$siteName = Factory::getConfig()->get('sitename');
$replaces = self::buildReplaceTags($row, $config, true);
$amount = Factory::getApplication()->input->getFloat('receive_amount', '');
if ($amount == '')
{
$amount = $row->amount;
}
if ($row->campaign_id)
{
$query->select('*')
->from('#__jd_campaigns')
->where('id = ' . (int) $row->campaign_id);
$db->setQuery($query);
$rowCampaign = $db->loadObject();
if ($rowCampaign->notification_emails)
{
$config->notification_emails = $rowCampaign->notification_emails;
}
}
//Notification email send to administrators
$subject = $config->cancel_recurring_admin_email_subject;
$body = $config->cancel_recurring_admin_email_body;
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
//Replace some information in the body
$body = str_replace('[DONATION_AMOUNT]', number_format($amount, 2), $body);
if ($config->notification_emails == '')
{
$notificationEmails = $fromEmail;
}
else
{
$notificationEmails = $config->notification_emails;
}
$notificationEmails = str_replace(' ', '', $notificationEmails);
$emails = explode(',', $notificationEmails);
for ($i = 0, $n = count($emails); $i < $n; $i++)
{
$email = $emails[$i];
$mailer->ClearAllRecipients();
try
{
$mailer->sendMail($fromEmail, $fromName, $email, $subject, $body, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
}
static::logEmails($emails, $subject, $body, 2, 'cancel_recurring_admin_email');
if ($row->receive_user_id)
{
$query->clear();
$query->select('*')
->from('#__users')
->where('id=' . $row->receive_user_id);
$db->setQuery($query);
$rowUser = $db->loadObject();
if ($rowUser)
{
$name = $rowUser->name;
$receiveEmail = $rowUser->email;
$subject = $config->cancel_recurring_email_subject;
$body = $config->cancel_recurring_email_body;
$body = str_replace('[AMOUNT]', number_format($amount, 2), $body);
$body = str_replace('[SITE_NAME]', $siteName, $body);
$body = str_replace('[NAME]', $name, $body);
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$body = str_replace("[$key]", $value, $body);
$subject = str_replace("[$key]", $value, $subject);
}
$mailer->ClearAllRecipients();
try
{
$mailer->sendMail($fromEmail, $fromName, $receiveEmail, $subject, $body, 1);
}
catch (Exception $e)
{
Factory::getApplication()->enqueueMessage($e->getMessage(), 'warning');
}
static::logEmails(array( $receiveEmail), $subject, $body, 1, 'cancel_recurring_email');
}
}
}
/**
* Convert src of img tags to use absolute links instead of ralative link
*
* @param $html_content
*
* @return mixed
*/
public static function convertImgTags($html_content)
{
$patterns = array();
$replacements = array();
$i = 0;
$src_exp = "/src=\"(.*?)\"/";
$link_exp = "[^http:\/\/www\.|^www\.|^https:\/\/|^http:\/\/]";
$siteURL = Uri::root();
preg_match_all($src_exp, $html_content, $out, PREG_SET_ORDER);
foreach ($out as $val)
{
$links = preg_match($link_exp, $val[1], $match, PREG_OFFSET_CAPTURE);
if ($links == '0')
{
$patterns[$i] = $val[1];
$patterns[$i] = "\"$val[1]";
$replacements[$i] = $siteURL . $val[1];
$replacements[$i] = "\"$replacements[$i]";
}
$i++;
}
$mod_html_content = str_replace($patterns, $replacements, $html_content);
return $mod_html_content;
}
/**
* Process download a file
*
* @param string $file : Full path to the file which will be downloaded
*/
public static function processDownload($filePath, $filename)
{
jimport('joomla.filesystem.file');
$fsize = @filesize($filePath);
$mod_date = date('r', filemtime($filePath));
$cont_dis = 'attachment';
$ext = File::getExt($filename);
$mime = self::getMimeType($ext);
// required for IE, otherwise Content-disposition is ignored
if (ini_get('zlib.output_compression'))
{
ini_set('zlib.output_compression', 'Off');
}
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Expires: 0");
header("Content-Transfer-Encoding: binary");
header(
'Content-Disposition:' . $cont_dis . ';' . ' filename="' . $filename . '";' . ' modification-date="' . $mod_date . '";' . ' size=' . $fsize .
';'); //RFC2183
header("Content-Type: " . $mime); // MIME type
header("Content-Length: " . $fsize);
if (!ini_get('safe_mode'))
{ // set_time_limit doesn't work in safe mode
@set_time_limit(0);
}
self::readfile_chunked($filePath);
}
/**
* Get mimetype of a file
*
* @return string
*/
public static function getMimeType($ext)
{
require_once JPATH_ROOT . "/components/com_jdonation/helper/mime.mapping.php";
foreach ($mime_extension_map as $key => $value)
{
if ($key == $ext)
{
return $value;
}
}
return "";
}
/**
* Read file
*
* @param string $filename
* @param $retbytes
*
* @return unknown
*/
public static function readfile_chunked($filename, $retbytes = true)
{
$chunksize = 1 * (1024 * 1024); // how many bytes per chunk
$cnt = 0;
$handle = fopen($filename, 'rb');
if ($handle === false)
{
return false;
}
while (!feof($handle))
{
$buffer = fread($handle, $chunksize);
echo $buffer;
@ob_flush();
flush();
if ($retbytes)
{
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status)
{
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
/**
* Generate invoice PDF (receipt) for a donation record
*
* @param $row
*/
public static function generateInvoicePDF($row)
{
self::loadLanguage();
$app = Factory::getApplication();
$db = Factory::getDbo();
$config = self::getConfig();
$siteName = $app->get("sitename");
require_once JPATH_ROOT . "/components/com_jdonation/tcpdf/tcpdf.php";
if(file_exists(JPATH_ROOT . "/components/com_jdonation/tcpdf/config/lang/eng.php"))
{
require_once JPATH_ROOT . "/components/com_jdonation/tcpdf/config/lang/eng.php";
}
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor($siteName);
$pdf->SetTitle('Invoice');
$pdf->SetSubject('Invoice');
$pdf->SetKeywords('Invoice');
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetMargins(PDF_MARGIN_LEFT, 0, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
//set auto page breaks
$pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);
//set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
//$pdf->SetFont('times', '', 8);
$font = empty($config->pdf_font) ? 'times' : $config->pdf_font;
// True type font
if (substr($font, -4) == '.ttf')
{
$font = TCPDF_FONTS::addTTFfont(JPATH_ROOT . '/components/com_jdonation/tcpdf/fonts/' . $font, 'TrueTypeUnicode', '', 96);
}
$pdf->SetFont($font, '', 8);
$pdf->AddPage('P','A4');
//multiple languages
if(Multilanguage::isEnabled())
{
$language = $row->language;
if($language != "" && $language != "*")
{
$language = explode("-", $language);
$language = $language[0];
$invoiceOutput = $config->{'donation_receipt_layout_'.$language};
if($invoiceOutput == "")
{
$invoiceOutput = $config->donation_receipt_layout;
}
}
else
{
$invoiceOutput = $config->donation_receipt_layout;
}
}
else
{
$invoiceOutput = $config->donation_receipt_layout;
}
$replaces = self::buildReplaceTags($row, $config);
$replaces['name'] = $row->first_name . ' ' . $row->last_name;
$replaces['ITEM_QUANTITY'] = 1;
//$replaces['AMOUNT'] = $replaces['ITEM_AMOUNT'] = $replaces['ITEM_SUB_TOTAL'] = $replaces['TOTAL_AMOUNT'] = number_format($row->amount, 2);
$replaces['AMOUNT'] = $replaces['ITEM_AMOUNT'] = $replaces['ITEM_SUB_TOTAL'] = $replaces['TOTAL_AMOUNT'] =
DonationHelperHtml::formatAmount($config, $row->amount, $row->currency_code);
$replaces['PAYMENT_PROCESSING_FEE'] = DonationHelperHtml::formatAmount($config, $row->payment_fee, $row->currency_code);
$replaces['invoice_number'] = self::formatInvoiceNumber($row->invoice_number, $config, $row);
if ($row->campaign_id)
{
$sql = 'SELECT title FROM #__jd_campaigns WHERE id=' . $row->campaign_id;
$db->setQuery($sql);
$campaignTitle = $db->loadResult();
}
else
{
$campaignTitle = '';
}
$itemName = Text::_('JD_ONLINE_DONATION');
$itemName = str_replace('[CAMPAIGN_TITLE]', $campaignTitle, $itemName);
$data['item_name'] = $itemName;
$replaces['ITEM_NAME'] = $itemName;
foreach ($replaces as $key => $value)
{
$key = strtoupper($key);
$invoiceOutput = str_replace("[$key]", $value, $invoiceOutput);
}
//echo $invoiceOutput;die();
$pdf->writeHTML($invoiceOutput, true, false, false, false, '');
//Filename
$filePath = JPATH_ROOT . '/media/com_jdonation/receipts/' . $replaces['invoice_number'] . '.pdf';
$pdf->Output($filePath, 'F');
}
public static function formatInvoiceNumber($invoiceNumber, $config, $row = null)
{
if (!empty($row->invoice_year))
{
$year = $row->invoice_year;
}
elseif (!empty($row->created_date))
{
$date = Factory::getDate($row->created_date);
$year = $date->format('Y');
}
else
{
$year = 0;
}
$invoicePrefix = str_replace('[YEAR]', $year, $config->invoice_prefix);
return $invoicePrefix . str_pad($invoiceNumber, $config->invoice_number_length ?: 4, '0', STR_PAD_LEFT);
}
/**
* Generate and download the invoice for a donation record
*
* @param $id
*/
static function downloadInvoice($id)
{
$config = self::getConfig();
$row = Table::getInstance('Donor', 'DonationTable');
$row->load($id);
$invoiceStorePath = JPATH_ROOT . '/media/com_jdonation/receipts/';
if ($row)
{
if (!$row->invoice_number)
{
$row->invoice_number = self::getInvoiceNumber($row);
$row->store();
}
$invoiceNumber = self::formatInvoiceNumber($row->invoice_number, $config, $row);
if ($row->payment_method == 'os_offline' || !file_exists($invoiceStorePath . $invoiceNumber .
'.pdf')
)
{
self::generateInvoicePDF($row);
}
$invoicePath = $invoiceStorePath . $invoiceNumber . '.pdf';
$fileName = $invoiceNumber . '.pdf';
while (@ob_end_clean()) ;
self::processDownload($invoicePath, $fileName);
}
}
public static function getInvoiceNumber($row = null)
{
$config = self::getConfig();
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('MAX(invoice_number)')
->from('#__jd_donors');
if ($config->reset_invoice_number)
{
$currentYear = date('Y');
$query->where('invoice_year = ' . $currentYear);
$row->invoice_year = $currentYear;
}
$db->setQuery($query);
$invoiceNumber = (int) $db->loadResult();
if (!$invoiceNumber)
{
$invoiceNumber = (int) $config->invoice_start_number;
}
elseif($invoiceNumber < (int) $config->invoice_start_number )
{
$invoiceNumber += (int) $config->invoice_start_number;
}
else
{
$invoiceNumber++;
}
return $invoiceNumber;
}
/**
* Add sub-menus, use for Joomla 3
*
* @param $viewName
*/
public static function addSubMenus($viewName)
{
/*
if (version_compare(JVERSION, '3.0', 'lt') || $viewName != 'donors')
{
OSFHelper::addSubMenus('com_jdonation', $viewName);
}
*/
}
/**
* Get list of language uses on the site
*
* @return array
*/
public static function getLanguages()
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$default = self::getDefaultLanguage();
$query->select('lang_id, lang_code, title, `sef`')
->from('#__languages')
->where('published = 1')
->where('lang_code != "' . $default . '"')
->order('ordering');
$db->setQuery($query);
$languages = $db->loadObjectList();
return $languages;
}
/**
* Get front-end default language
*
* @return string
*/
public static function getDefaultLanguage()
{
$params = ComponentHelper::getParams('com_languages');
return $params->get('site', 'en-GB');
}
/**
* Get field suffix used in sql query
*
* @param null $activeLanguage
*
* @return string
*/
/**
* Get field suffix used in sql query
*
* @return string
*/
public static function getFieldSuffix($activeLanguage = null)
{
$prefix = '';
if (Multilanguage::isEnabled())
{
if (!$activeLanguage)
{
$activeLanguage = Factory::getLanguage()->getTag();
}
if ($activeLanguage != self::getDefaultLanguage())
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('`sef`')
->from('#__languages')
->where('lang_code = ' . $db->quote($activeLanguage));
$db->setQuery($query);
$sef = $db->loadResult();
if ($sef)
{
$prefix = '_' . $sef;
}
}
}
return $prefix;
}
/**
* Helper method to get fields from database table in case the site is multilingual
*
* @param JDatabaseQuery $query
* @param array $fields
* @param $fieldSuffix
*/
public static function getMultilingualFields(JDatabaseQuery $query, $fields = array(), $fieldSuffix = '')
{
foreach ($fields as $field)
{
$alias = $field;
$dotPos = strpos($field, '.');
if ($dotPos !== false)
{
$alias = substr($field, $dotPos + 1);
}
$query->select($query->quoteName($field . $fieldSuffix, $alias));
}
}
/**
* Get multilingual data for config
*
* @param $config
* @param array $fields
* @param $fieldSuffix
*/
public static function getMultilingualConfigData($config, $fieldSuffix, $fields = array())
{
if (!count($fields))
{
$fields = array(
'amounts_explanation',
'paypal_redirect_message',
'admin_email_subject',
'admin_email_body',
'user_email_subject',
'user_email_body',
'user_email_body_offline',
'user_email_body_offline_received',
'recurring_email_subject',
'recurring_email_body',
'donation_form_msg',
'thanks_message_offline',
'cancel_message',
'honoree_email_subject',
'honoree_email_body'
);
}
foreach ($fields as $field)
{
if (strlen(trim(strip_tags($config->{$field . $fieldSuffix}))))
{
$config->{$field} = $config->{$field . $fieldSuffix};
}
}
}
/**
* This function is used to check to see whether we need to update the database to support multilingual or not
*
* @return boolean
*/
public static function isSynchronized()
{
$db = Factory::getDbo();
$fields = array_keys($db->getTableColumns('#__jd_campaigns'));
$extraLanguages = self::getLanguages();
if (count($extraLanguages))
{
foreach ($extraLanguages as $extraLanguage)
{
$prefix = $extraLanguage->sef;
if (!in_array('tilte_' . $prefix, $fields))
{
return false;
}
if (!in_array('paypal_redirection_message_' . $prefix, $fields))
{
return false;
}
if (!in_array('user_email_body_offline_received_' . $prefix, $fields))
{
return false;
}
}
}
$fields = array_keys($db->getTableColumns('#__jd_fields'));
$extraLanguages = self::getLanguages();
if (count($extraLanguages))
{
foreach ($extraLanguages as $extraLanguage)
{
$prefix = $extraLanguage->sef;
if (!in_array('place_holder_' . $prefix, $fields))
{
return false;
}
}
}
return true;
}
/**
* Synchronize Joom Donation database to support multilingual
*/
public static function setupMultilingual()
{
$db = Factory::getDbo();
$languages = self::getLanguages();
if (count($languages))
{
$campaignTableFields = array_keys($db->getTableColumns('#__jd_campaigns'));
$fieldTableFields = array_keys($db->getTableColumns('#__jd_fields'));
foreach ($languages as $language)
{
$prefix = $language->sef;
$fieldName = 'title_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` VARCHAR( 255 );";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'alias_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` VARCHAR( 255 );";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'short_description_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'description_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'amounts_explanation_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'user_email_subject_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` VARCHAR( 255 );";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'user_email_body_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'user_email_body_offline_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'recurring_email_subject_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` VARCHAR( 255 );";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'recurring_email_body_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'donation_form_msg_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` VARCHAR( 255 );";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'thanks_message_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'paypal_redirection_message_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'user_email_body_offline_received_' . $prefix;
if (!in_array($fieldName, $campaignTableFields))
{
$sql = "ALTER TABLE `#__jd_campaigns` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'title_' . $prefix;
if (!in_array($fieldName, $fieldTableFields))
{
$sql = "ALTER TABLE `#__jd_fields` ADD `$fieldName` VARCHAR( 255 );";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'description_' . $prefix;
if (!in_array($fieldName, $fieldTableFields))
{
$sql = "ALTER TABLE `#__jd_fields` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'values_' . $prefix;
if (!in_array($fieldName, $fieldTableFields))
{
$sql = "ALTER TABLE `#__jd_fields` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'default_values_' . $prefix;
if (!in_array($fieldName, $fieldTableFields))
{
$sql = "ALTER TABLE `#__jd_fields` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
$fieldName = 'place_holder_' . $prefix;
if (!in_array($fieldName, $fieldTableFields))
{
$sql = "ALTER TABLE `#__jd_fields` ADD `$fieldName` TEXT NULL;";
$db->setQuery($sql);
$db->execute();
}
}
}
}
/*
static function get_conversion($cur_from,$cur_to){
$url = sprintf('https://www.google.com/search?q=1+%s+to+%s', $cur_from, $cur_to);
$headers = [
'Accept' => 'text/html',
'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0',
];
$http = JHttpFactory::getHttp();
$response = $http->get($url, $headers);
if (302 == $response->code && isset($response->headers['Location']))
{
$response = $http->get($response->headers['Location'], $headers);
}
$body = $response->body;
$exchangedRate = 1;
try
{
$exchangedRate = static::buildExchangeRate($body);
}
catch (Exception $e)
{
}
return $exchangedRate;
}
*/
static function get_conversion($cur_from,$cur_to){
$http = HttpFactory::getHttp();
$url = 'https://free.currencyconverterapi.com/api/v6/convert?q='.$cur_from.'_'.$cur_to.'&compact=ultra&apiKey=98bea5b83490f12e5be0';
$response = $http->get($url);
$converted = 1;
if ($response->code == 200)
{
$data = $response->body;
$returnArr = json_decode($data);
$converted = $returnArr->{$cur_from.'_'.$cur_to};
}
return $converted;
}
/**
* Builds an exchange rate from the response content.
*
* @param string $content
*
* @return float
*
* @throws \Exception
*/
protected static function buildExchangeRate($content)
{
$document = new \DOMDocument();
if (false === @$document->loadHTML('<?xml encoding="utf-8" ?>' . $content))
{
throw new Exception('The page content is not loadable');
}
$xpath = new \DOMXPath($document);
$nodes = $xpath->query('//span[@id="knowledge-currency__tgt-amount"]');
if (1 !== $nodes->length)
{
$nodes = $xpath->query('//div[@class="vk_ans vk_bk" or @class="dDoNo vk_bk"]');
}
if (1 !== $nodes->length)
{
throw new Exception('The currency is not supported or Google changed the response format');
}
$nodeContent = $nodes->item(0)->textContent;
// Beware of "3 417.36111 Colombian pesos", with a non breaking space
$bid = strtr($nodeContent, ["\xc2\xa0" => '']);
if (false !== strpos($bid, ' '))
{
$bid = strstr($bid, ' ', true);
}
// Does it have thousands separator?
if (strpos($bid, ',') && strpos($bid, '.'))
{
$bid = str_replace(',', '', $bid);
}
if (!is_numeric($bid))
{
throw new Exception('The currency is not supported or Google changed the response format');
}
return $bid;
}
public static function isMultipleCurrencies(){
$config = self::getConfig();
$active_currencies = $config->active_currencies;
$active_currencies_array = explode(",",$active_currencies);
if(count($active_currencies_array) > 1){
return true;
}else{
return false;
}
}
/**
* Get IP address of customers
*
* @return unknown
*/
public static function get_ip_address()
{
foreach (array(
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR') as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
if (filter_var($ip, FILTER_VALIDATE_IP) !== false) {
return $ip;
}
}
}
}
}
static function isDonorProcessed($transactionId){
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('published')
->from('#__jd_donors')
->where('transaction_id = ' . $db->quote($transactionId));
$db->setQuery($query);
$status = (int) $db->loadResult();
if ($status > 0)
{
return true;
}
return false;
}
/**
* Generate article selection box
*
* @param int $fieldValue
* @param string $fieldName
*
* @return string
*/
public static function getArticleInput($fieldValue, $fieldName = 'article_id')
{
HTMLHelper::_('jquery.framework');
FormHelper::addFieldPath(JPATH_ADMINISTRATOR . '/components/com_content/models/fields');
if (version_compare(JVERSION, '4.0.0-dev', 'ge'))
{
FormHelper::addFieldPrefix('Joomla\Component\Content\Administrator\Field');
}
$field = FormHelper::loadFieldType('Modal_Article');
if (version_compare(JVERSION, '4.2.0-dev', 'ge'))
{
$field->setDatabase(Factory::getDbo());
}
$element = new SimpleXMLElement('<field />');
$element->addAttribute('name', $fieldName);
$element->addAttribute('select', 'true');
$element->addAttribute('clear', 'true');
$field->setup($element, $fieldValue);
return $field->input;
}
/**
* This function is used to check to see whether if the Newsletter plugin is enabled or not
*/
static function isNewsletterPluginEnabled(){
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('count(extension_id)')->from('#__extensions')->where('`type`= "plugin"')->where('`element`= "acymailing" or `element`= "mailchimp"')->where('`folder`= "jdonation"')->where('enabled = "1"');
$db->setQuery($query);
$count = $db->loadResult();
if($count > 0){
return true;
}else{
return false;
}
}
/**
* This function is used to check to see if the Mailchimp plugin in enabled and the API key is entered
* @return bool
*/
static function isMailchimpPluginEnabled(){
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('count(extension_id)')->from('#__extensions')->where('`type`= "plugin"')->where('`element`= "mailchimp"')->where('`folder`= "jdonation"')->where('enabled = "1"');
$db->setQuery($query);
$count = $db->loadResult();
if($count > 0){
$query->clear();
$query->select('*')->from('#__extensions')->where('`type`= "plugin"')->where('`element`= "mailchimp"')->where('`folder`= "jdonation"')->where('enabled = "1"');
$db->setQuery($query);
$plugin = $db->loadObject();
$params = new Registry();
$params->loadString($plugin->params);
if($params->get('api_key','') == ''){
return false;
}else{
return true;
}
}else{
return false;
}
}
/**
* This function is used to calculate total donated amount
* @param $campaign_id
*/
static function getTotalDonatedAmount($campaign_id)
{
$db = Factory::getDbo();
$db->setQuery("Select sum(amount) from #__jd_donors where campaign_id ='$campaign_id' and published = '1'");
return $db->loadResult();
}
/**
* This function is used to return number donors of specific campaign
* @param $campaign_id
* @return mixed
*/
static function getTotalDonor($campaign_id)
{
$db = Factory::getDbo();
$db->setQuery("Select count(id) from #__jd_donors where campaign_id ='$campaign_id' and published = '1'");
return $db->loadResult();
}
/**
* This function is used to return days left of campaign
* @param $campaign_id
* @return mixed
*/
static function getLeftDates($campaign_id)
{
$db = Factory::getDbo();
$db->setQuery("Select DATEDIFF(end_date, CURDATE()) AS days_left from #__jd_campaigns where id ='$campaign_id' and published = '1'");
return $db->loadResult();
}
public static function getCampaignOwner($campaign_id)
{
$db = Factory::getDbo();
$db->setQuery("Select user_id from #__jd_campaigns where id = '$campaign_id'");
return $db->loadResult();
}
static function getUserCampaigns()
{
$db = Factory::getDbo();
$user = Factory::getUser();
$db->setQuery("Select id from #__jd_campaigns where user_id = '$user->id'");
$campaigns = $db->loadColumn(0);
return $campaigns;
}
static function canAccessDonation($id)
{
$db = Factory::getDbo();
$user = Factory::getUser();
if((int)$user->id == 0)
{
return false;
}
$db->setQuery("Select campaign_id from #__jd_donors where id = '$id'");
$campaign_id = (int)$db->loadResult();
if($campaign_id == 0)
{
return false;
}
if($user->id != self::getCampaignOwner($campaign_id))
{
return false;
}
return true;
}
static function isPaypalEnable()
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('count(id)')->from('#__jd_payment_plugins')->where('name="os_paypal" and published=1');
$db->setQuery($query);
$count = $db->loadResult();
if($count > 0)
{
return true;
}
else
{
return false;
}
}
static function isAuthorizeEnable()
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('count(id)')->from('#__jd_payment_plugins')->where('name="os_authnet" and published=1');
$db->setQuery($query);
$count = $db->loadResult();
if($count > 0)
{
return true;
}
else
{
return false;
}
}
static function getCurrencyName($code)
{
if($code != "")
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select("currency_name")->from("#__jd_currencies")->where("currency_code = '".$code."'");
$db->setQuery($query);
$currency_name = $db->loadResult();
if($currency_name != "")
{
return $currency_name;
}
else
{
return $code;
}
}
else
{
return "";
}
}
public static function cancelRecurringDonation($id)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
->from('#__jd_donors')
->where('id = ' . (int) $id);
$db->setQuery($query);
$row = $db->loadObject();
if ($row)
{
// The recurring subscription already cancelled before, no need to process it further
if ($row->recurring_donation_cancelled)
{
return;
}
$query->clear()
->update('#__jd_donors')
->set('recurring_donation_cancelled = 1')
->where('id = ' . $row->id);
$db->setQuery($query);
$db->execute();
$config = self::getConfig();
self::sendRecurringDonationCancelEmail($row, $config);
}
}
public static function canCancelRecurringDonation($row)
{
$user = Factory::getUser();
$userId = $user->id;
if ($row
&& (($row->user_id == $userId && $userId) || $user->authorise('core.admin', 'com_jdonation'))
&& !$row->recurring_donation_cancelled)
{
return true;
}
return false;
}
/**
* Load payment method object
*
* @param string $name
*
* @return MPFPayment
* @throws Exception
*/
public static function loadPaymentMethod($name)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('*')
->from('#__jd_payment_plugins')
->where('published = 1')
->where('name = ' . $db->quote($name));
$db->setQuery($query);
$row = $db->loadObject();
if ($row && file_exists(JPATH_ROOT . '/components/com_jdonation/payments/' . $row->name . '.php'))
{
require_once JPATH_ROOT . '/components/com_jdonation/payments/' . $name . '.php';
$params = new Registry($row->params);
/* @var MPFPayment $method */
$method = new $name($params);
$method->setTitle($row->title);
return $method;
}
throw new Exception(sprintf('Payment method %s not found', $name));
}
public static function logEmails($emails, $subject, $body, $sentTo = 0, $emailType = '')
{
$config = self::getConfig();
if(static::loggingEnabled($config))
{
$email = $emails[0];
$bccEmails = [];
if (count($emails) > 1)
{
unset($emails[0]);
$bccEmails = $emails;
}
require_once JPATH_ADMINISTRATOR . '/components/com_jdonation/table/email.php';
$row = Table::getInstance('Email', 'DonationTable');
$row->sent_at = Factory::getDate()->toSql();
$row->email = $email;
$row->subject = $subject;
$row->body = $body;
$row->sent_to = $sentTo;
$row->email_type = $emailType;
$row->store();
if (count($bccEmails))
{
foreach ($bccEmails as $email)
{
$row->id = 0;
$row->email = $email;
$row->store();
}
}
}
}
public static function loggingEnabled($config)
{
if ($config->log_emails)
{
return true;
}
return false;
}
public static function isTransactionProcessed($transactionId)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('COUNT(*)')
->from('#__jd_donors')
->where('transaction_id = ' . $db->quote($transactionId));
$db->setQuery($query);
$total = (int) $db->loadResult();
return $total > 0;
}
/**
* Method to accept privacy consent for a donation record
*
* @param Donor $row
*/
public static function acceptPrivacyConsent($row)
{
if (!$row->user_id)
{
return;
}
$db = Factory::getDbo();
$query = $db->getQuery(true)
->select('COUNT(*)')
->from('#__privacy_consents')
->where('user_id = ' . (int) $row->user_id)
->where('subject = ' . $db->quote('PLG_SYSTEM_PRIVACYCONSENT_SUBJECT'))
->where('state = 1');
$db->setQuery($query);
// User consented, do not process it further
if ($db->loadResult())
{
return;
}
Factory::getLanguage()->load('plg_system_privacyconsent', JPATH_ADMINISTRATOR, $row->language);
$params = new Registry($row->params);
// Create the user note
$privacyConsent = (object) [
'user_id' => $row->user_id,
'subject' => 'PLG_SYSTEM_PRIVACYCONSENT_SUBJECT',
'body' => Text::sprintf('PLG_SYSTEM_PRIVACYCONSENT_BODY', $params->get('user_ip'), $params->get('user_agent')),
'created' => Factory::getDate()->toSql(),
];
try
{
$db->insertObject('#__privacy_consents', $privacyConsent);
}
catch (Exception $e)
{
}
}
public static function isAvailablePayments()
{
$db = Factory::getDbo();
$db->setQuery("Select count(id) from #__jd_payment_plugins where published = '1'");
$count = $db->loadResult();
if($count > 1)
{
return true;
}
else
{
return false;
}
}
public static function loadMedia()
{
static $loaded;
if ($loaded == true)
{
return;
}
$document = Factory::getDocument();
$document->addStylesheet(Uri::base(true) . '/media/com_jdonation/assets/css/style.css');
$loaded = true;
}
public static function loadComponentCssForModules()
{
static $mloaded = false;
if ($mloaded == true)
{
return;
}
if (Factory::getApplication()->input->getCmd('option') === 'com_jdonation')
{
return;
}
$document = Factory::getDocument();
$document->addStylesheet(Uri::base(true) . '/media/com_jdonation/assets/css/style.css');
if (file_exists(JPATH_ROOT . '/media/com_jdonation/assets/css/custom.css') && filesize(JPATH_ROOT . '/media/com_jdonation/assets/css/custom.css') > 0)
{
$document->addStylesheet(Uri::base(true) . '/media/com_jdonation/assets/css/custom.css', 'text/css', null, null);
}
$mloaded = true;
}
/**
* Get hased field name to store the time which form started to be rendered
*
* @return string
*/
public static function getHashedFieldName()
{
$config = Factory::getConfig();
$siteName = $config->get('sitename');
$secret = $config->get('secret');
return md5($siteName . $secret);
}
/**
* Helper method to write data to a log file, for debuging purpose
*
* @param string $logFile
* @param array $data
* @param string $message
*/
public static function logData($logFile, $data = [], $message = null)
{
$text = '[' . gmdate('m/d/Y g:i A') . '] - ';
foreach ($data as $key => $value)
{
$text .= "$key=$value, ";
}
$text .= $message;
$fp = fopen($logFile, 'a');
fwrite($fp, $text . "\n\n");
fclose($fp);
}
/**
* Helper method to determine if we are in Joomla 4
*
* @return bool
*/
public static function isJoomla4()
{
return version_compare(JVERSION, '4.0.0-dev', 'ge');
}
}