Files
b2b.redline.com.pl/modules/newsletterpro/classes/NewsletterProTemplateUser.php
2025-06-24 14:14:35 +02:00

686 lines
25 KiB
PHP

<?php
/**
* Since 2013 Ovidiu Cimpean.
*
* Ovidiu Cimpean - Newsletter Pro © All rights reserved.
*
* DISCLAIMER
*
* Do not edit, modify or copy this file.
* If you wish to customize it, contact us at addons4prestashop@gmail.com.
*
* @author Ovidiu Cimpean <addons4prestashop@gmail.com>
* @copyright Since 2013 Ovidiu Cimpean
* @license Do not edit, modify or copy this file
*
* @version Release: 4
*/
class NewsletterProTemplateUser
{
/**
* Only the public properties will be converted into variables.
*/
public $email;
public $firstname;
public $lastname;
public $id;
public $id_lang;
public $id_shop;
public $id_default_group;
public $newsletter_date_add;
public $ip;
public $active;
public $language;
public $date;
public $date_full;
public $shop_name;
public $img_path;
public $user_type;
public $is_forwarder;
private $variables = [];
private $variables_chimp = [];
private $template;
private $create_use_type;
private $has_employee_customer_data = false;
const USER_TYPE_CUSTOMER = 100;
const USER_TYPE_REGISTRED = 101;
const USER_TYPE_REGISTRED_NP = 102;
const USER_TYPE_ADDED = 103;
const USER_TYPE_UNREGISTRED = 104;
const USER_TYPE_EMPLOYEE = 105;
public function __construct($email)
{
$this->email = $email;
}
public static function newInstance($email)
{
return new self($email);
}
public function setTemplate($template)
{
$this->template = $template;
return $this;
}
public function getTypesName()
{
return self::getTypesNameStatic();
}
public static function getTypesNameStatic()
{
return [
self::USER_TYPE_CUSTOMER => 'customer',
self::USER_TYPE_REGISTRED => 'registred',
self::USER_TYPE_REGISTRED_NP => 'registred_np',
self::USER_TYPE_ADDED => 'added',
self::USER_TYPE_UNREGISTRED => 'unregistred',
self::USER_TYPE_EMPLOYEE => 'employee',
];
}
public static function convertUserType($userType)
{
$types = self::getTypesNameStatic();
if (!array_key_exists($userType, $types)) {
throw new InvalidArgumentException('The user type is not valid.');
}
return $types[$userType];
}
public function refresh($id_lang)
{
$this->create($this->create_use_type, $id_lang);
}
public function create($use_type = null, $id_lang = null)
{
$this->create_use_type = $use_type;
$context = Context::getContext();
$default_lang = (int) pqnp_config('PS_LANG_DEFAULT');
$sql_customer = 'SELECT count(*) FROM `'._DB_PREFIX_.'customer` WHERE `email` = "'.pSQL($this->email).'"';
$sql_registred = 'SELECT count(*) FROM `'._DB_PREFIX_.pSQL(NewsletterProDefaultNewsletterTable::getTableName()).'` WHERE `email` = "'.pSQL($this->email).'"';
$sql_registred_np = 'SELECT count(*) FROM `'._DB_PREFIX_.'newsletter_pro_subscribers` WHERE `email` = "'.pSQL($this->email).'"';
$sql_added = 'SELECT count(*) FROM `'._DB_PREFIX_.'newsletter_pro_email` WHERE `email` = "'.pSQL($this->email).'"';
$type = self::USER_TYPE_UNREGISTRED;
// default behavior, search for the user
if (!isset($use_type)) {
if (Db::getInstance()->getValue($sql_customer)) {
$type = self::USER_TYPE_CUSTOMER;
} elseif (!((bool) pqnp_config('SUBSCRIPTION_ACTIVE')) && NewsletterProDefaultNewsletterTable::getTableName() && Db::getInstance()->getValue($sql_registred)) {
$type = self::USER_TYPE_REGISTRED;
} elseif (((bool) pqnp_config('SUBSCRIPTION_ACTIVE')) && Db::getInstance()->getValue($sql_registred_np)) {
$type = self::USER_TYPE_REGISTRED_NP;
} elseif (Db::getInstance()->getValue($sql_added)) {
$type = self::USER_TYPE_ADDED;
}
} else {
// this is for the type employee or unregistred
$type = $use_type;
}
// types name for the variables
$types_name = $this->getTypesName();
$this->user_type = $types_name[$type];
$exception_no_row_msg = sprintf(NewsletterPro::getInstance()->l('Cannot create the user for the email "%s".'), $this->email);
switch ($type) {
case self::USER_TYPE_CUSTOMER:
$row = Db::getInstance()->getRow('
SELECT
c.`firstname`,
c.`lastname`,
c.`email`,
c.`id_customer` AS `id`,
c.`id_lang`,
c.`id_shop`,
c.`id_default_group`,
c.`newsletter_date_add`,
c.`ip_registration_newsletter` AS `ip`,
c.`active` ,
lg.`name` AS `language`,
lg.`date_format_lite` AS `date`,
lg.`date_format_full` AS `date_full`,
sh.`name` AS `shop_name`
FROM `'._DB_PREFIX_.'customer` c
LEFT JOIN `'._DB_PREFIX_.'lang` lg ON (c.`id_lang` = lg.`id_lang`)
INNER JOIN `'._DB_PREFIX_.'shop` sh ON (c.`id_shop` = sh.`id_shop`)
WHERE c.`email` = "'.pSQL($this->email).'"
');
if (!$row) {
throw new NewsletterProTemplateUserException($exception_no_row_msg);
}
$this->firstname = $row['firstname'];
$this->lastname = $row['lastname'];
$this->id = (int) $row['id'];
if (!isset($id_lang)) {
$this->id_lang = (int) $row['id_lang'];
} else {
$this->id_lang = $id_lang;
}
$this->id_shop = (int) $row['id_shop'];
$this->id_default_group = (int) $row['id_default_group'];
$this->newsletter_date_add = $row['newsletter_date_add'];
$this->ip = $row['ip'];
$this->active = (int) $row['active'];
$this->language = $row['language'];
$this->date = date($row['date']);
$this->date_full = date($row['date_full']);
$this->shop_name = $row['shop_name'];
$this->setImgPath($this->id_lang);
$customer = new Customer((int) $this->id);
if (Validate::isLoadedObject($customer)) {
$context->customer = $customer;
}
break;
case self::USER_TYPE_REGISTRED:
$defaultLang = (int) pqnp_config('PS_LANG_DEFAULT');
$row = Db::getInstance()->getRow('
SELECT
n.`id`,
n.`id_shop`,
'.(NewsletterProDefaultNewsletterTable::hasIdLang() ? 'n.`id_lang`' : $defaultLang.' as `id_lang`').',
n.`ip_registration_newsletter` AS `ip`,
n.`email`, n.`newsletter_date_add` ,
s.`name` AS `shop_name`,
l.`date_format_lite` AS `date`,
l.`date_format_full` AS `date_full`,
l.`name` AS `language`
FROM `'._DB_PREFIX_.NewsletterProDefaultNewsletterTable::getTableName().'` n
LEFT JOIN `'._DB_PREFIX_.'lang` l ON (l.id_lang = '.(int) $default_lang.')
LEFT JOIN `'._DB_PREFIX_.'shop` s ON (s.`id_shop` = n.`id_shop`)
WHERE n.`email` = "'.pSQL($this->email).'"
');
if (!$row) {
throw new NewsletterProTemplateUserException($exception_no_row_msg);
}
$this->id = (int) $row['id'];
$this->id_shop = (int) $row['id_shop'];
$this->ip = $row['ip'];
$this->newsletter_date_add = $row['newsletter_date_add'];
$this->shop_name = $row['shop_name'];
$this->date = date($row['date']);
$this->date_full = date($row['date_full']);
$this->language = $row['language'];
// default settings
$this->firstname = '';
$this->lastname = '';
if (!isset($id_lang)) {
$this->id_lang = (int) $row['id_lang'];
} else {
$this->id_lang = $id_lang;
}
$this->id_default_group = '';
$this->active = 1;
$this->setImgPath($default_lang);
break;
case self::USER_TYPE_ADDED:
$row = Db::getInstance()->getRow('
SELECT
n.`id_newsletter_pro_email` AS `id`,
n.`email`,
n.`firstname`,
n.`lastname`,
n.`id_lang`,
n.`id_shop`,
n.`ip_registration_newsletter` AS `ip`,
n.`date_add` AS `newsletter_date_add`,
n.`active`,
s.`name` AS `shop_name`,
l.`date_format_lite` AS `date`,
l.`date_format_full` AS `date_full`,
l.`name` AS `language`
FROM `'._DB_PREFIX_.'newsletter_pro_email` n
LEFT JOIN `'._DB_PREFIX_.'lang` l ON (l.`id_lang` = n.`id_lang`)
LEFT JOIN `'._DB_PREFIX_.'shop` s ON (s.`id_shop` = n.`id_shop`)
WHERE n.`email` = "'.pSQL($this->email).'"
');
if (!$row) {
throw new NewsletterProTemplateUserException($exception_no_row_msg);
}
$this->id = (int) $row['id'];
$this->firstname = $row['firstname'];
$this->lastname = $row['lastname'];
if (!isset($id_lang)) {
$this->id_lang = (int) $row['id_lang'];
} else {
$this->id_lang = $id_lang;
}
$this->id_shop = (int) $row['id_shop'];
$this->ip = $row['ip'];
$this->newsletter_date_add = $row['newsletter_date_add'];
$this->active = (int) $row['active'];
$this->shop_name = $row['shop_name'];
$this->date = date($row['date']);
$this->date_full = date($row['date_full']);
$this->language = $row['language'];
// default settings
$this->id_default_group = '';
$this->setImgPath($this->id_lang);
break;
case self::USER_TYPE_REGISTRED_NP:
$row = Db::getInstance()->getRow('
SELECT
n.`id_newsletter_pro_subscribers` AS `id`,
n.`email`,
n.`firstname`,
n.`lastname`,
n.`id_lang`,
n.`id_shop`,
n.`ip_registration_newsletter` AS `ip`,
n.`date_add` AS `newsletter_date_add`,
n.`active`,
s.`name` AS `shop_name`,
l.`date_format_lite` AS `date`,
l.`date_format_full` AS `date_full`,
l.`name` AS `language`
FROM `'._DB_PREFIX_.'newsletter_pro_subscribers` n
LEFT JOIN `'._DB_PREFIX_.'lang` l ON (l.`id_lang` = n.`id_lang`)
LEFT JOIN `'._DB_PREFIX_.'shop` s ON (s.`id_shop` = n.`id_shop`)
WHERE n.`email` = "'.pSQL($this->email).'"
');
if (!$row) {
throw new NewsletterProTemplateUserException($exception_no_row_msg);
}
$this->id = (int) $row['id'];
$this->firstname = $row['firstname'];
$this->lastname = $row['lastname'];
if (!isset($id_lang)) {
$this->id_lang = (int) $row['id_lang'];
} else {
$this->id_lang = $id_lang;
}
$this->id_shop = (int) $row['id_shop'];
$this->ip = $row['ip'];
$this->newsletter_date_add = $row['newsletter_date_add'];
$this->active = (int) $row['active'];
$this->shop_name = $row['shop_name'];
$this->date = date($row['date']);
$this->date_full = date($row['date_full']);
$this->language = $row['language'];
// default settings
$this->id_default_group = '';
$this->setImgPath($this->id_lang);
break;
case self::USER_TYPE_UNREGISTRED:
$this->createDefault(self::USER_TYPE_UNREGISTRED, $id_lang);
break;
case self::USER_TYPE_EMPLOYEE:
$this->createDefault(self::USER_TYPE_EMPLOYEE, $id_lang);
break;
default:
throw new NewsletterProTemplateUserException(NewsletterPro::getInstance()->l('Unregistered user are not allowed'));
break;
}
$this->initVariables();
return $this;
}
private function createDefault($type, $id_lang_load = null)
{
$context = Context::getContext();
// types name for the variables
$types_name = $this->getTypesName();
$this->user_type = $types_name[$type];
$id_lang = (int) pqnp_config('PS_LANG_DEFAULT');
$firstname = '';
$lastname = '';
$id = 0;
switch ((int) $type) {
case self::USER_TYPE_UNREGISTRED:
break;
case self::USER_TYPE_EMPLOYEE:
$id_lang = (int) $context->language->id;
if (isset($context->employee)) {
if (!isset($this->email)) {
$this->email = $context->employee->email;
}
$id_lang = (int) $context->employee->id_lang;
$firstname = $context->employee->firstname;
$lastname = $context->employee->lastname;
$id = (int) $context->employee->id;
// serach for customer in database the the email is from a customer
$customerId = (int) Db::getInstance()->getValue('
SELECT `id_customer` FROM `'._DB_PREFIX_.'customer`
WHERE `email` = "'.pSQL($this->email).'"
AND `id_shop` = '.(int) $context->shop->id.'
');
$customer = new Customer((int) $customerId);
if (Validate::isLoadedObject($customer)) {
$firstname = $customer->firstname;
$lastname = $customer->lastname;
$id = $customer->id;
$this->has_employee_customer_data = true;
}
} else {
if (!isset($this->email)) {
$this->email = pqnp_config('PS_SHOP_EMAIL');
}
}
break;
default:
throw new NewsletterProTemplateUserException(sprintf(NewsletterPro::getInstance()->l('Invalid user type "%s". Only the "%s", "%s" values are allowed.'), $type, self::USER_TYPE_EMPLOYEE, self::USER_TYPE_UNREGISTRED));
break;
}
$this->active = 1;
$this->firstname = $firstname;
$this->lastname = $lastname;
$this->id = (int) $id;
if (isset($id_lang_load)) {
$this->id_lang = (int) $id_lang_load;
} else {
$this->id_lang = (int) $id_lang;
}
$this->id_default_group = '';
$this->id_shop = (int) $context->shop->id;
$this->ip = '127.0.0.1';
$this->setImgPath($id_lang);
$row = Db::getInstance()->getRow('
SELECT
`name`,
`date_format_lite` AS `date`,
`date_format_full` AS `date_full`
FROM `'._DB_PREFIX_.'lang`
WHERE `id_lang` = '.(int) $id_lang.'
');
if (!$row) {
$row['name'] = 'Unknow';
$row['date'] = 'Y-m-d';
$row['date_full'] = 'Y-m-d H:i:s';
}
$this->language = $row['name'];
$this->date = date($row['date']);
$this->date_full = date($row['date_full']);
$this->newsletter_date_add = date('Y-m-d H:i:s');
$row = Db::getInstance()->getRow('
SELECT `name`
FROM `'._DB_PREFIX_.'shop`
WHERE `id_shop` = '.(int) $this->id_shop.'
');
if (!$row) {
$row['name'] = pqnp_config('PS_SHOP_NAME');
}
$this->shop_name = $row['name'];
}
public function hasEmployeeCustomerData()
{
return $this->has_employee_customer_data;
}
private function setImgPath($id_lang)
{
$lang_img_path = Tools::getHttpHost(true)._PS_IMG_.'l/';
$lang_img_dir = _PS_IMG_DIR_.'l/';
if (file_exists($lang_img_dir.$id_lang.'.jpg')) {
$this->img_path = NewsletterPro::relplaceAdminLink($lang_img_path.$id_lang.'.jpg');
} else {
$this->img_path = NewsletterPro::relplaceAdminLink($lang_img_path.'none.jpg');
}
}
private function initVariables()
{
$module = NewsletterPro::getInstance();
$context = Context::getContext();
$base_uri = NewsletterPro::relplaceAdminLink(__PS_BASE_URI__);
$default_shop_url = Tools::getHttpHost(true).$base_uri;
$shop_url = $module->getShopUrl();
$this->default_shop_url = $default_shop_url;
$moduleUrl = NewsletterProTemplate::getModuleUrl();
$this->module_url = $this->default_shop_url.'modules/newsletterpro/';
$this->{$moduleUrl['key']} = $moduleUrl['value'];
$this->shop_url = $module->getShopUrl();
$this->shop_logo_url = $module->getShopLogoUrl($this->id_shop);
$this->shop_logo = '<a title="'.$this->shop_name.'" href="'.$this->shop_url.'"> <img style="border: none;" src="'.$this->shop_logo_url.'" alt="'.$this->shop_name.'" /> </a>';
$this->unsubscribe_link = urldecode($context->link->getModuleLink($module->name, 'unsubscribe', [
'email' => $this->email,
'u_token' => Tools::encrypt($this->email),
'msg' => true,
], null, $this->id_lang, $this->id_shop));
$this->elastic_unsubscribe_link = '{unsubscribe:'.$this->unsubscribe_link.'}';
$this->elastic_unsubscribeauto_link = '{unsubscribeauto:'.$this->unsubscribe_link.'}';
$this->front_subscription_link = NewsletterProSubscriptionTpl::getFrontLink((int) $this->id_lang, (int) $this->id_shop);
$this->front_subscription = '<a href="'.$this->front_subscription_link.'" target="_blank">'.$module->l('subscribe').'</a>';
$this->unsubscribe = '<a href="'.$this->unsubscribe_link.'" target="_blank">'.$module->l('unsubscribe').'</a>';
$this->unsubscribe_link_redirect = urldecode($context->link->getModuleLink($module->name, 'unsubscribe', [
'email' => $this->email,
'u_token' => Tools::encrypt($this->email),
'msg' => false,
], null, $this->id_lang, $this->id_shop));
$this->unsubscribe_redirect = '<a href="'.$this->unsubscribe_link_redirect.'" target="_blank">'.$module->l('unsubscribe').'</a>';
$this->subscribe_link = urldecode($context->link->getModuleLink($module->name, 'subscribe', [
'email' => $this->email,
'token' => Tools::encrypt($this->email),
], null, $this->id_lang, $this->id_shop));
$this->subscribe = '<a href="'.$this->subscribe_link.'" target="_blank">'.$module->l('subscribe').'</a>';
$this->forward_link = urldecode($context->link->getModuleLink($module->name, 'forward', [
'email' => $this->email,
'token' => Tools::encrypt($this->email),
], null, $this->id_lang, $this->id_shop));
// $this->unsubscribe_link = $this->shop_url.'index.php?fc=module&module=newsletterpro&controller=unsubscribe&email='.$this->email.'&u_token='.Tools::encrypt($this->email);
// $this->unsubscribe_link_redirect = $this->shop_url.'index.php?fc=module&module=newsletterpro&controller=unsubscribe&email='.$this->email.'&u_token='.Tools::encrypt($this->email).'&msg=false';
// $this->subscribe_link = $this->shop_url.'index.php?fc=module&module=newsletterpro&controller=subscribe&email='.$this->email.'&token='.Tools::encrypt($this->email);
// $this->forward_link = $this->shop_url.'index.php?fc=module&module=newsletterpro&controller=forward&email='.$this->email.'&token='.Tools::encrypt($this->email);
$this->forward = '<a href="'.$this->forward_link.'" target="_blank">'.$module->l('forward').'</a>';
$this->date_text = date('F j.Y');
$this->date_year = date('Y');
$this->date_day = date('j');
$mounths = $module->dateMonths($this->id_lang);
$mounth_numeric = date('m');
if (isset($mounths[$mounth_numeric])) {
$this->date_month_text = $mounths[$mounth_numeric];
} else {
$this->date_month_text = date('F');
}
$this->domain = $context->shop->domain;
$this->domain_ssl = $context->shop->domain_ssl;
$this->shop_email = Configuration::get('PS_SHOP_EMAIL');
// the variables with tokens will be replaced for mailchimp
$this->page_index_link = $context->link->getPageLink('index', null, $this->id_lang, null, false, $this->id_shop);
$this->page_contact_link = $context->link->getPageLink('contact', null, $this->id_lang, null, false, $this->id_shop);
$this->page_new_products = $context->link->getPageLink('new-products', null, $this->id_lang, null, false, $this->id_shop);
$this->page_best_sales = $context->link->getPageLink('best-sales', null, $this->id_lang, null, false, $this->id_shop);
$this->page_sitemap = $context->link->getPageLink('sitemap', null, $this->id_lang, null, false, $this->id_shop);
$this->page_my_account = $context->link->getPageLink('my-account', null, $this->id_lang, null, false, $this->id_shop);
$this->page_my_orders = $context->link->getPageLink('history', null, $this->id_lang, null, false, $this->id_shop);
$this->page_my_order_slip = $context->link->getPageLink('order-slip', null, $this->id_lang, null, false, $this->id_shop);
$this->page_my_addresses = $context->link->getPageLink('addresses', null, $this->id_lang, null, false, $this->id_shop);
$this->page_my_personal_info = $context->link->getPageLink('identity', null, $this->id_lang, null, false, $this->id_shop);
$this->page_my_vouchers = $context->link->getPageLink('discount', null, $this->id_lang, null, false, $this->id_shop);
if (!isset($this->template)) {
throw new NewsletterProTemplateUserException(sprintf('You mut set the template variable.', 'template'));
}
// this value wll be replaced as a template variable
$this->is_forwarder = $this->template->is_forwarder;
$this->forwarder_email = $this->template->getForwarderData('forwarder_email');
if ($this->template instanceof NewsletterProTemplateHistory) {
$this->unsubscribe_link = $this->unsubscribe_link.'&token='.$module->getTokenByIdHistory((int) $this->template->id_history);
$this->unsubscribe_link_redirect = $this->unsubscribe_link_redirect.'&token='.$module->getTokenByIdHistory((int) $this->template->id_history);
$this->view_in_browser_link = urldecode(Context::getContext()->link->getModuleLink(NewsletterProTools::module()->name, 'newsletter', [
'token_tpl' => $module->getTokenByIdHistory((int) $this->template->id_history),
'email' => $this->email,
]));
$this->view_in_browser = '<a href="'.$this->view_in_browser_link.'" target="_blank">'.$module->l('Click here').'</a>';
$this->view_in_browser_link_share = urlencode($this->view_in_browser_link);
$this->view_in_browser_share = '<a href="'.$this->view_in_browser_link_share.'" target="_blank">'.$module->l('Click here').'</a>';
} else {
$this->view_in_browser_link = '';
$this->view_in_browser = '';
}
// mail chimp variables
$this->setChimpVariables([
'EMAIL' => $this->email,
'FNAME' => $this->firstname,
'LNAME' => $this->lastname,
'SHOP' => $this->shop_name,
'SUBSCRIBED' => $this->active,
'USER_TYPE' => $this->user_type,
'LANGUAGE' => $this->language,
]);
// extend user defined variables
NewsletterProExtendTemplateVars::newInstance()->set($this);
return $this;
}
public function variables()
{
$method = new ReflectionObject($this);
$variables = [];
foreach ($method->getProperties() as $property) {
if ($property->isPublic()) {
$variables[$property->getName()] = $property->getValue($this);
}
}
$variables = array_merge($variables, $this->variables);
ksort($variables);
return $variables;
}
public function variablesChimp()
{
return $this->variables_chimp;
}
public function setVariables($variables)
{
$this->variables = array_merge($this->variables, $variables);
return $this;
}
public function setChimpVariables($variables)
{
$this->variables_chimp = array_merge($this->variables_chimp, $variables);
return $this;
}
public function to()
{
return NewsletterProMail::getToFromUser($this);
}
}