[-] MO : MailAlerts module upgraded for PrestaShop 1.5
git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@12688 b9a71923-0436-4b27-9f14-aed3839534dd
This commit is contained in:
+235
-360
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/*
|
||||
* 2007-2011 PrestaShop
|
||||
* 2007-2011 PrestaShop
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
@@ -20,18 +20,19 @@
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2011 PrestaShop SA
|
||||
* @version Release: $Revision: 7310 $
|
||||
* @version Release: $Revision: 12460 $
|
||||
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
if (!defined('_PS_VERSION_'))
|
||||
if (!defined('_CAN_LOAD_FILES_'))
|
||||
exit;
|
||||
|
||||
include_once(dirname(__FILE__).'/MailAlert.php');
|
||||
|
||||
class MailAlerts extends Module
|
||||
{
|
||||
private $_html = '';
|
||||
private $_postErrors = array();
|
||||
|
||||
private $_merchant_mails;
|
||||
private $_merchant_order;
|
||||
@@ -44,30 +45,40 @@ class MailAlerts extends Module
|
||||
{
|
||||
$this->name = 'mailalerts';
|
||||
$this->tab = 'administration';
|
||||
$this->version = '2.2';
|
||||
$this->version = '2.3';
|
||||
$this->author = 'PrestaShop';
|
||||
|
||||
parent::__construct();
|
||||
|
||||
|
||||
if ($this->id)
|
||||
$this->_refreshProperties();
|
||||
$this->init();
|
||||
|
||||
$this->displayName = $this->l('Mail alerts');
|
||||
$this->description = $this->l('Sends e-mail notifications to customers and merchants.');
|
||||
$this->confirmUninstall = $this->l('Are you sure you want to delete all customer notifications?');
|
||||
}
|
||||
|
||||
private function init()
|
||||
{
|
||||
$this->_merchant_mails = strval(Configuration::get('MA_MERCHANT_MAILS'));
|
||||
$this->_merchant_order = (int)Configuration::get('MA_MERCHANT_ORDER');
|
||||
$this->_merchant_oos = (int)Configuration::get('MA_MERCHANT_OOS');
|
||||
$this->_customer_qty = (int)Configuration::get('MA_CUSTOMER_QTY');
|
||||
}
|
||||
|
||||
public function install()
|
||||
{
|
||||
if (!parent::install() OR
|
||||
!$this->registerHook('newOrder') OR
|
||||
!$this->registerHook('updateQuantity') OR
|
||||
!$this->registerHook('productOutOfStock') OR
|
||||
!$this->registerHook('customerAccount') OR
|
||||
!$this->registerHook('updateProduct') OR
|
||||
!$this->registerHook('deleteProduct') OR
|
||||
!$this->registerHook('deleteProductAttribute') OR
|
||||
!$this->registerHook('updateProductAttribute')
|
||||
if (!parent::install()
|
||||
|| !$this->registerHook('actionValidateOrder')
|
||||
|| !$this->registerHook('actionUpdateQuantity')
|
||||
|| !$this->registerHook('actionProductOutOfStock')
|
||||
|| !$this->registerHook('displayCustomerAccount')
|
||||
|| !$this->registerHook('displayMyAccountBlock')
|
||||
|| !$this->registerHook('actionProductUpdate')
|
||||
|| !$this->registerHook('actionProductDelete')
|
||||
|| !$this->registerHook('actionProductAttributeDelete')
|
||||
|| !$this->registerHook('actionProductAttributeUpdate')
|
||||
|| !$this->registerHook('displayHeader')
|
||||
)
|
||||
return false;
|
||||
|
||||
@@ -75,21 +86,20 @@ class MailAlerts extends Module
|
||||
Configuration::updateValue('MA_MERCHANT_OOS', 1);
|
||||
Configuration::updateValue('MA_CUSTOMER_QTY', 1);
|
||||
Configuration::updateValue('MA_MERCHANT_MAILS', Configuration::get('PS_SHOP_EMAIL'));
|
||||
Configuration::updateValue('MA_LAST_QTIES', Configuration::get('PS_LAST_QTIES'));
|
||||
Configuration::updateValue('MA_LAST_QTIES', (int)Configuration::get('PS_LAST_QTIES'));
|
||||
|
||||
if (!Db::getInstance()->execute('
|
||||
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'mailalert_customer_oos` (
|
||||
$sql = 'CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.MailAlert::$definition['table'].'` (
|
||||
`id_customer` int(10) unsigned NOT NULL,
|
||||
`customer_email` varchar(128) NOT NULL,
|
||||
`id_product` int(10) unsigned NOT NULL,
|
||||
`id_product_attribute` int(10) unsigned NOT NULL,
|
||||
`id_shop` int(10) unsigned NOT NULL,
|
||||
PRIMARY KEY (`id_customer`,`customer_email`,`id_product`,`id_product_attribute`)
|
||||
) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci')
|
||||
)
|
||||
return false;
|
||||
) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci';
|
||||
|
||||
if (!Db::getInstance()->Execute($sql))
|
||||
return false;
|
||||
|
||||
/* This hook is optional */
|
||||
$this->registerHook('myAccountBlock');
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -100,44 +110,148 @@ class MailAlerts extends Module
|
||||
Configuration::deleteByName('MA_CUSTOMER_QTY');
|
||||
Configuration::deleteByName('MA_MERCHANT_MAILS');
|
||||
Configuration::deleteByName('MA_LAST_QTIES');
|
||||
if (!Db::getInstance()->execute('DROP TABLE '._DB_PREFIX_.'mailalert_customer_oos'))
|
||||
return false;
|
||||
|
||||
if (!Db::getInstance()->Execute('DROP TABLE '._DB_PREFIX_.MailAlert::$definition['table']))
|
||||
return false;
|
||||
|
||||
return parent::uninstall();
|
||||
}
|
||||
|
||||
private function _refreshProperties()
|
||||
public function getContent()
|
||||
{
|
||||
$this->_merchant_mails = Configuration::get('MA_MERCHANT_MAILS');
|
||||
$this->_merchant_order = (int)Configuration::get('MA_MERCHANT_ORDER');
|
||||
$this->_merchant_oos = (int)Configuration::get('MA_MERCHANT_OOS');
|
||||
$this->_customer_qty = (int)Configuration::get('MA_CUSTOMER_QTY');
|
||||
$this->_postProcess();
|
||||
|
||||
$this->_html = '<h2>'.$this->displayName.'</h2>';
|
||||
$this->_html .= $this->_displayForm();
|
||||
|
||||
return $this->_html;
|
||||
}
|
||||
|
||||
public function hookNewOrder($params)
|
||||
private function _postProcess()
|
||||
{
|
||||
$errors = array();
|
||||
|
||||
if (Tools::isSubmit('submitMACustomer'))
|
||||
{
|
||||
if (!Configuration::updateValue('MA_CUSTOMER_QTY', (int)Tools::getValue('mA_customer_qty')))
|
||||
$errors[] = $this->l('Cannot update settings');
|
||||
}
|
||||
else if (Tools::isSubmit('submitMAMerchant'))
|
||||
{
|
||||
$emails = strval(Tools::getValue('ma_merchant_mails'));
|
||||
|
||||
if (!$emails || empty($emails))
|
||||
$errors[] = $this->l('Please type one (or more) e-mail address');
|
||||
else
|
||||
{
|
||||
$emails = explode("\n", $emails);
|
||||
foreach ($emails as $k => $email)
|
||||
{
|
||||
$email = trim($email);
|
||||
if (!empty($email) && !Validate::isEmail($email))
|
||||
{
|
||||
$errors[] = $this->l('Invalid e-mail:').' '.$email;
|
||||
break;
|
||||
}
|
||||
else if (!empty($email) && sizeof($email))
|
||||
$emails[$k] = $email;
|
||||
else
|
||||
unset($emails[$k]);
|
||||
}
|
||||
$emails = implode(self::__MA_MAIL_DELIMITOR__, $emails);
|
||||
if (!Configuration::updateValue('MA_MERCHANT_MAILS', strval($emails)))
|
||||
$errors[] = $this->l('Cannot update settings');
|
||||
elseif (!Configuration::updateValue('MA_MERCHANT_ORDER', (int)Tools::getValue('mA_merchand_order')))
|
||||
$errors[] = $this->l('Cannot update settings');
|
||||
elseif (!Configuration::updateValue('MA_MERCHANT_OOS', (int)Tools::getValue('mA_merchand_oos')))
|
||||
$errors[] = $this->l('Cannot update settings');
|
||||
elseif (!Configuration::updateValue('MA_LAST_QTIES', (int)Tools::getValue('MA_LAST_QTIES')))
|
||||
$errors[] = $this->l('Cannot update settings');
|
||||
}
|
||||
}
|
||||
|
||||
if (sizeof($errors))
|
||||
echo $this->displayError(implode('<br />', $errors));
|
||||
|
||||
$this->init();
|
||||
}
|
||||
|
||||
public function _displayForm()
|
||||
{
|
||||
return '<form action="'.Tools::safeOutput($_SERVER['REQUEST_URI']).'" method="post">
|
||||
<fieldset><legend><img src="'.$this->_path.'logo.gif" />'.$this->l('Customer notification').'</legend>
|
||||
<label>'.$this->l('Product availability:').' </label>
|
||||
<div class="margin-form">
|
||||
<input type="checkbox" value="1" id="mA_customer_qty" name="mA_customer_qty" '.(Tools::getValue('mA_customer_qty', $this->_customer_qty) == 1 ? 'checked' : '').'>
|
||||
<label for="mA_customer_qty" class="t">'.$this->l('Gives the customer the option of receiving a notification for an available product if this one is out of stock.').'</label>
|
||||
</div>
|
||||
<div class="margin-form">
|
||||
<input type="submit" value="'.$this->l(' Save ').'" name="submitMACustomer" class="button" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
<br />
|
||||
<form action="'.Tools::safeOutput($_SERVER['REQUEST_URI']).'" method="post">
|
||||
<fieldset><legend><img src="'.$this->_path.'logo.gif" />'.$this->l('Merchant notification').'</legend>
|
||||
<label>'.$this->l('New order:').' </label>
|
||||
<div class="margin-form">
|
||||
<input type="checkbox" value="1" id="mA_merchand_order" name="mA_merchand_order" '.(Tools::getValue('mA_merchand_order', $this->_merchant_order) == 1 ? 'checked' : '').'>
|
||||
<label for="mA_merchand_order" class="t">'.$this->l('Receive a notification if a new order is made').'</label>
|
||||
</div>
|
||||
<label>'.$this->l('Out of stock:').' </label>
|
||||
<div class="margin-form">
|
||||
<input type="checkbox" value="1" id="mA_merchand_oos" name="mA_merchand_oos" '.(Tools::getValue('mA_merchand_oos', $this->_merchant_oos) == 1 ? 'checked' : '').'>
|
||||
<label for="mA_merchand_oos" class="t">'.$this->l('Receive a notification if the quantity of a product is below the alert threshold').'</label>
|
||||
</div>
|
||||
<label>'.$this->l('Alert threshold:').'</label>
|
||||
<div class="margin-form">
|
||||
<input type="text" name="MA_LAST_QTIES" value="'.(Tools::getValue('MA_LAST_QTIES') != NULL ? (int)(Tools::getValue('MA_LAST_QTIES')) : Configuration::get('MA_LAST_QTIES')).'" size="3" />
|
||||
<p>'.$this->l('Quantity for which a product is regarded as out of stock').'</p>
|
||||
</div>
|
||||
<label>'.$this->l('Send to these e-mail addresses:').' </label>
|
||||
<div class="margin-form">
|
||||
<div style="float:left; margin-right:10px;">
|
||||
<textarea name="ma_merchant_mails" rows="10" cols="30">'.Tools::getValue('ma_merchant_mails', str_replace(self::__MA_MAIL_DELIMITOR__, "\n", $this->_merchant_mails)).'</textarea>
|
||||
</div>
|
||||
<div style="float:left;">
|
||||
'.$this->l('One e-mail address per line').'<br />
|
||||
'.$this->l('e.g.,').' bob@example.com
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear:both;"> </div>
|
||||
<div class="margin-form">
|
||||
<input type="submit" value="'.$this->l(' Save ').'" name="submitMAMerchant" class="button" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>';
|
||||
}
|
||||
|
||||
public function hookActionValidateOrder($params)
|
||||
{
|
||||
if (!$this->_merchant_order OR empty($this->_merchant_mails))
|
||||
return;
|
||||
|
||||
// Getting differents vars
|
||||
$id_lang = (int)Configuration::get('PS_LANG_DEFAULT');
|
||||
$id_lang = (int)Context::getContext()->language->id;
|
||||
$currency = $params['currency'];
|
||||
$configuration = Configuration::getMultiple(array('PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME'));
|
||||
$order = $params['order'];
|
||||
$customer = $params['customer'];
|
||||
$delivery = new Address((int)($order->id_address_delivery));
|
||||
$invoice = new Address((int)($order->id_address_invoice));
|
||||
$order_date_text = Tools::displayDate($order->date_add, (int)($id_lang));
|
||||
$carrier = new Carrier((int)($order->id_carrier));
|
||||
$delivery = new Address((int)$order->id_address_delivery);
|
||||
$invoice = new Address((int)$order->id_address_invoice);
|
||||
$order_date_text = Tools::displayDate($order->date_add, (int)$id_lang);
|
||||
$carrier = new Carrier((int)$order->id_carrier);
|
||||
$message = $order->getFirstMessage();
|
||||
if (!$message OR empty($message))
|
||||
|
||||
if (!$message || empty($message))
|
||||
$message = $this->l('No message');
|
||||
|
||||
$itemsTable = '';
|
||||
|
||||
$products = $params['order']->getProducts();
|
||||
$customizedDatas = Product::getAllCustomizedDatas(intval($params['cart']->id));
|
||||
$customizedDatas = Product::getAllCustomizedDatas((int)$params['cart']->id);
|
||||
Product::addCustomizationPrice($products, $customizedDatas);
|
||||
foreach ($products AS $key => $product)
|
||||
foreach ($products as $key => $product)
|
||||
{
|
||||
$unit_price = $product['product_price_wt'];
|
||||
$price = $product['total_price'];
|
||||
@@ -148,12 +262,12 @@ class MailAlerts extends Module
|
||||
|
||||
foreach ($customizedDatas[$product['product_id']][$product['product_attribute_id']] AS $customization)
|
||||
{
|
||||
if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD]))
|
||||
foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] AS $text)
|
||||
if (isset($customization['datas'][_CUSTOMIZE_TEXTFIELD_]))
|
||||
foreach ($customization['datas'][_CUSTOMIZE_TEXTFIELD_] as $text)
|
||||
$customizationText .= $text['name'].':'.' '.$text['value'].'<br />';
|
||||
|
||||
if (isset($customization['datas'][Product::CUSTOMIZE_FILE]))
|
||||
$customizationText .= sizeof($customization['datas'][Product::CUSTOMIZE_FILE]) .' '. Tools::displayError('image(s)').'<br />';
|
||||
if (isset($customization['datas'][_CUSTOMIZE_FILE_]))
|
||||
$customizationText .= sizeof($customization['datas'][_CUSTOMIZE_FILE_]) .' '. Tools::displayError('image(s)').'<br />';
|
||||
|
||||
$customizationText .= '---<br />';
|
||||
}
|
||||
@@ -170,34 +284,32 @@ class MailAlerts extends Module
|
||||
<td style="padding:0.6em 0.4em; text-align:right;">'.Tools::displayPrice(($unit_price * $product['product_quantity']), $currency, false).'</td>
|
||||
</tr>';
|
||||
}
|
||||
foreach ($params['order']->getCartRules() AS $discount)
|
||||
foreach ($params['order']->getCartRules() as $discount)
|
||||
{
|
||||
$itemsTable .=
|
||||
'<tr style="background-color:#EBECEE;">
|
||||
<td colspan="4" style="padding:0.6em 0.4em; text-align:right;">'.$this->l('Voucher code:').' '.$discount['code'].'</td>
|
||||
<td colspan="4" style="padding:0.6em 0.4em; text-align:right;">'.$this->l('Voucher code:').' '.$discount['name'].'</td>
|
||||
<td style="padding:0.6em 0.4em; text-align:right;">-'.Tools::displayPrice($discount['value'], $currency, false).'</td>
|
||||
</tr>';
|
||||
}
|
||||
if ($delivery->id_state)
|
||||
$delivery_state = new State((int)($delivery->id_state));
|
||||
$delivery_state = new State((int)$delivery->id_state);
|
||||
if ($invoice->id_state)
|
||||
$invoice_state = new State((int)($invoice->id_state));
|
||||
$invoice_state = new State((int)$invoice->id_state);
|
||||
|
||||
// Filling-in vars for email
|
||||
$template = 'new_order';
|
||||
$subject = $this->l('New order', (int)$id_lang).' - '.sprintf('%06d', $order->id);
|
||||
$subject = $this->l('New order', $id_lang).' - '.sprintf('%06d', $order->id);
|
||||
$templateVars = array(
|
||||
'{firstname}' => $customer->firstname,
|
||||
'{lastname}' => $customer->lastname,
|
||||
'{email}' => $customer->email,
|
||||
'{delivery_block_txt}' => $this->_getFormatedAddress($delivery, "\n"),
|
||||
'{invoice_block_txt}' => $this->_getFormatedAddress($invoice, "\n"),
|
||||
'{delivery_block_html}' => $this->_getFormatedAddress($delivery, "<br />",
|
||||
array(
|
||||
'{delivery_block_txt}' => MailAlert::getFormatedAddress($delivery, "\n"),
|
||||
'{invoice_block_txt}' => MailAlert::getFormatedAddress($invoice, "\n"),
|
||||
'{delivery_block_html}' => MailAlert::getFormatedAddress($delivery, "<br />", array(
|
||||
'firstname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>',
|
||||
'lastname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>')),
|
||||
'{invoice_block_html}' => $this->_getFormatedAddress($invoice, "<br />",
|
||||
array(
|
||||
'{invoice_block_html}' => MailAlert::getFormatedAddress($invoice, "<br />", array(
|
||||
'firstname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>',
|
||||
'lastname' => '<span style="color:#DB3484; font-weight:bold;">%s</span>')),
|
||||
'{delivery_company}' => $delivery->company,
|
||||
@@ -236,346 +348,109 @@ class MailAlerts extends Module
|
||||
'{currency}' => $currency->sign,
|
||||
'{message}' => $message
|
||||
);
|
||||
$iso = Language::getIsoById((int)($id_lang));
|
||||
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.html'))
|
||||
Mail::Send((int)$id_lang, $template, $subject, $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], NULL, NULL, dirname(__FILE__).'/mails/');
|
||||
|
||||
$iso = Language::getIsoById($id_lang);
|
||||
|
||||
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.txt') && file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.html'))
|
||||
Mail::Send($id_lang, $template, $subject, $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], NULL, NULL, dirname(__FILE__).'/mails/');
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Generate correctly the address for an email
|
||||
*/
|
||||
private function _getFormatedAddress(Address $the_address, $line_sep, $fields_style = array())
|
||||
{
|
||||
return AddressFormat::generateAddress($the_address, array('avoid' => array()), $line_sep, ' ', $fields_style);
|
||||
}
|
||||
|
||||
public function hookProductOutOfStock($params)
|
||||
public function hookActionProductOutOfStock($params)
|
||||
{
|
||||
if (!$this->_customer_qty)
|
||||
return ;
|
||||
|
||||
$id_product = (int)($params['product']->id);
|
||||
$id_product_attribute = 0;
|
||||
$id_product = (int)$params['product']->id;
|
||||
$id_customer = (int)Context::getContext()->customer->id;
|
||||
|
||||
if (!$this->context->customer->isLogged())
|
||||
$this->smarty->assign('email', 1);
|
||||
else
|
||||
{
|
||||
$id_customer = (int)($params['cookie']->id_customer);
|
||||
if ($this->customerHasNotification($id_customer, $id_product, $id_product_attribute))
|
||||
return ;
|
||||
}
|
||||
|
||||
$this->smarty->assign(array(
|
||||
'id_product' => $id_product,
|
||||
'id_product_attribute' => $id_product_attribute));
|
||||
if (!(int)Context::getContext()->customer->isLogged())
|
||||
$this->context->smarty->assign('email', 1);
|
||||
else if (MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute))
|
||||
return ;
|
||||
|
||||
$this->context->smarty->assign(array(
|
||||
'id_product' => $id_product,
|
||||
'id_product_attribute' => $id_product_attribute));
|
||||
|
||||
return $this->display(__FILE__, 'product.tpl');
|
||||
}
|
||||
|
||||
public function customerHasNotification($id_customer, $id_product, $id_product_attribute)
|
||||
public function hookActionUpdateQuantity($params)
|
||||
{
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
|
||||
SELECT *
|
||||
FROM `'._DB_PREFIX_.'mailalert_customer_oos`
|
||||
WHERE `id_customer` = '.(int)($id_customer).'
|
||||
AND `id_product` = '.(int)($id_product).'
|
||||
AND `id_product_attribute` = '.(int)($id_product_attribute));
|
||||
return sizeof($result);
|
||||
}
|
||||
$product = $params['product'];
|
||||
$id_shop = (int)Context::getContext()->shop->id;
|
||||
$id_lang = (int)Context::getContext()->language->id;
|
||||
|
||||
public function hookUpdateQuantity($params)
|
||||
{
|
||||
if (is_object($params['product']))
|
||||
$params['product'] = get_object_vars($params['product']);
|
||||
|
||||
if (is_array($params['product']['name']))
|
||||
$params['product']['name'] = $params['product']['name'][(int)Configuration::get('PS_LANG_DEFAULT')];
|
||||
|
||||
if (isset($params['product']['id_product']))
|
||||
$params['product']['id'] = (int)$params['product']['id_product'];
|
||||
|
||||
$qty = (int)$params['product']['quantity'];
|
||||
if ($qty <= (int)(Configuration::get('MA_LAST_QTIES')) AND !(!$this->_merchant_oos OR empty($this->_merchant_mails)) AND Configuration::get('PS_STOCK_MANAGEMENT'))
|
||||
if ((int)$product->quantity <= (int)Configuration::get('MA_LAST_QTIES') &&
|
||||
!(!$this->_merchant_oos || empty($this->_merchant_mails)) && StockAvailable::dependsOnStock($product->id))
|
||||
{
|
||||
$templateVars = array(
|
||||
'{qty}' => $qty,
|
||||
'{last_qty}' => (int)(Configuration::get('MA_LAST_QTIES')),
|
||||
'{product}' => strval($params['product']['name']).(isset($params['product']['attributes_small']) ? ' '.$params['product']['attributes_small'] : ''));
|
||||
|
||||
$iso = $this->context->language->iso_code;
|
||||
if ($params['product']['active'] == 1)
|
||||
{
|
||||
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html'))
|
||||
Mail::Send((int)Configuration::get('PS_LANG_DEFAULT'), 'productoutofstock', Mail::l('Product out of stock', (int)Configuration::get('PS_LANG_DEFAULT')), $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/');
|
||||
$templateVars = array('{qty}' => (int)$product->quantity,
|
||||
'{last_qty}' => (int)Configuration::get('MA_LAST_QTIES'),
|
||||
'{product}' => strval((int)$product->name).(isset($product->attributes_small) ? ' '.$product->attributes_small : ''));
|
||||
|
||||
$iso = Language::getIsoById($id_lang);
|
||||
|
||||
if ($product->active == 1)
|
||||
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') && file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html'))
|
||||
Mail::Send($id_lang, 'productoutofstock', Mail::l('Product out of stock', $id_lang), $templateVars, explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), NULL, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/');
|
||||
}
|
||||
}
|
||||
if ($this->_customer_qty AND $params['product']['quantity'] > 0)
|
||||
$this->sendCustomerAlert((int)$params['product']['id'], 0);
|
||||
if ($this->_customer_qty && $product->quantity > 0)
|
||||
MailAlert::sendCustomerAlert((int)$product->id, (int)$params['attribute_id']);
|
||||
}
|
||||
|
||||
public function hookUpdateProduct($params)
|
||||
public function hookActionProductUpdate($params)
|
||||
{
|
||||
/* We specify 0 as an id_product_attribute because this hook is called when the main product is updated */
|
||||
if ($this->_customer_qty AND $params['product']->getStock() > 0)
|
||||
$this->sendCustomerAlert((int)$params['product']->id, 0);
|
||||
if ($this->_customer_qty && $product->quantity > 0)
|
||||
MailAlert::sendCustomerAlert((int)$params['product']->id, 0);
|
||||
}
|
||||
|
||||
public function hookUpdateProductAttribute($params)
|
||||
public function hookActionProductAttributeUpdate($params)
|
||||
{
|
||||
$sql = 'SELECT id_product, quantity
|
||||
FROM '._DB_PREFIX_.'stock_available
|
||||
WHERE id_product_attribute = '.(int)$params['id_product_attribute']
|
||||
.StockAvailable::addSqlShopRestriction();
|
||||
$sql = 'SELECT `id_product`, `quantity`
|
||||
FROM `'._DB_PREFIX_.'stock_available`
|
||||
WHERE `id_product_attribute` = '.(int)$params['id_product_attribute'];
|
||||
|
||||
$result = Db::getInstance()->getRow($sql);
|
||||
|
||||
if ($this->_customer_qty AND $result['quantity'] > 0)
|
||||
$this->sendCustomerAlert((int)$result['id_product'], (int)$params['id_product_attribute']);
|
||||
if ($this->_customer_qty && $result['quantity'] > 0)
|
||||
MailAlert::sendCustomerAlert((int)$result['id_product'], (int)$params['id_product_attribute']);
|
||||
}
|
||||
|
||||
public function sendCustomerAlert($id_product, $id_product_attribute)
|
||||
{
|
||||
$customers = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
|
||||
SELECT id_customer, customer_email
|
||||
FROM `'._DB_PREFIX_.'mailalert_customer_oos`
|
||||
WHERE `id_product` = '.(int)$id_product.' AND `id_product_attribute` = '.(int)$id_product_attribute);
|
||||
|
||||
$product = new Product((int)$id_product, false, $this->context->language->id);
|
||||
$templateVars = array(
|
||||
'{product}' => (is_array($product->name) ? $product->name[(int)Configuration::get('PS_LANG_DEFAULT')] : $product->name),
|
||||
'{product_link}' => $this->context->link->getProductLink($product)
|
||||
);
|
||||
foreach ($customers AS $cust)
|
||||
{
|
||||
if ($cust['id_customer'])
|
||||
{
|
||||
$customer = new Customer((int)$cust['id_customer']);
|
||||
$customer_email = $customer->email;
|
||||
$customer_id = (int)$customer->id;
|
||||
}
|
||||
else
|
||||
{
|
||||
$customer_email = $cust['customer_email'];
|
||||
$customer_id = 0;
|
||||
}
|
||||
$iso = $this->context->language->iso_code;
|
||||
|
||||
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.html'))
|
||||
Mail::Send((int)Configuration::get('PS_LANG_DEFAULT'), 'customer_qty', Mail::l('Product available', (int)Configuration::get('PS_LANG_DEFAULT')), $templateVars, strval($customer_email), NULL, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/');
|
||||
if ($customer_id)
|
||||
$customer_email = 0;
|
||||
self::deleteAlert((int)$customer_id, strval($customer_email), (int)$id_product, (int)$id_product_attribute);
|
||||
}
|
||||
}
|
||||
|
||||
public function hookCustomerAccount($params)
|
||||
|
||||
public function hookDisplayCustomerAccount($params)
|
||||
{
|
||||
return $this->_customer_qty ? $this->display(__FILE__, 'my-account.tpl') : NULL;
|
||||
}
|
||||
|
||||
public function hookMyAccountBlock($params)
|
||||
|
||||
public function hookDisplayMyAccountBlock($params)
|
||||
{
|
||||
return $this->hookCustomerAccount($params);
|
||||
return $this->hookDisplayCustomerAccount($params);
|
||||
}
|
||||
|
||||
public function getContent()
|
||||
|
||||
public function hookActionProductDelete($params)
|
||||
{
|
||||
$this->_html = '<h2>'.$this->displayName.'</h2>';
|
||||
$this->_postProcess();
|
||||
$this->_displayForm();
|
||||
return $this->_html;
|
||||
$sql = 'DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'`
|
||||
WHERE `id_product` = '.(int)$params['product']->id;
|
||||
|
||||
Db::getInstance()->Execute($sql);
|
||||
}
|
||||
|
||||
private function _displayForm()
|
||||
{
|
||||
$tab = Tools::getValue('tab');
|
||||
$token = Tools::getValue('token');
|
||||
|
||||
$this->_html .= '
|
||||
<form action="'.AdminController::$currentIndex.'&token='.$token.'&configure=mailalerts" method="post">
|
||||
<fieldset class="width3"><legend><img src="'.$this->_path.'logo.gif" />'.$this->l('Customer notification').'</legend>
|
||||
<label>'.$this->l('Product availability:').' </label>
|
||||
<div class="margin-form">
|
||||
<input type="checkbox" value="1" id="mA_customer_qty" name="mA_customer_qty" '.(Tools::getValue('mA_customer_qty', $this->_customer_qty) == 1 ? 'checked' : '').'>
|
||||
<label for="mA_customer_qty" class="t">'.$this->l('Gives the customer the option of receiving a notification for an available product if this one is out of stock.').'</label>
|
||||
</div>
|
||||
<div class="margin-form">
|
||||
<input type="submit" value="'.$this->l(' Save ').'" name="submitMACustomer" class="button" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
<br />
|
||||
<form action="'.AdminController::$currentIndex.'&token='.$token.'&configure=mailalerts" method="post">
|
||||
<fieldset class="width3"><legend><img src="'.$this->_path.'logo.gif" />'.$this->l('Merchant notification').'</legend>
|
||||
<label>'.$this->l('New order:').' </label>
|
||||
<div class="margin-form">
|
||||
<input type="checkbox" value="1" id="mA_merchand_order" name="mA_merchand_order" '.(Tools::getValue('mA_merchand_order', $this->_merchant_order) == 1 ? 'checked' : '').'>
|
||||
<label for="mA_merchand_order" class="t">'.$this->l('Receive a notification if a new order is made').'</label>
|
||||
</div>
|
||||
<label>'.$this->l('Out of stock:').' </label>
|
||||
<div class="margin-form">
|
||||
<input type="checkbox" value="1" id="mA_merchand_oos" name="mA_merchand_oos" '.(Tools::getValue('mA_merchand_oos', $this->_merchant_oos) == 1 ? 'checked' : '').'>
|
||||
<label for="mA_merchand_oos" class="t">'.$this->l('Receive a notification if the quantity of a product is below the alert threshold').'</label>
|
||||
</div>
|
||||
<label>'.$this->l('Alert threshold:').'</label>
|
||||
<div class="margin-form">
|
||||
<input type="text" name="MA_LAST_QTIES" value="'.(Tools::getValue('MA_LAST_QTIES') != NULL ? (int)(Tools::getValue('MA_LAST_QTIES')) : Configuration::get('MA_LAST_QTIES')).'" size="3" />
|
||||
<p>'.$this->l('Quantity for which a product is regarded as out of stock').'</p>
|
||||
</div>
|
||||
<label>'.$this->l('Send to these e-mail addresses:').' </label>
|
||||
<div class="margin-form">
|
||||
<div style="float:left; margin-right:10px;">
|
||||
<textarea name="ma_merchant_mails" rows="10" cols="30">'.Tools::getValue('ma_merchant_mails', str_replace(self::__MA_MAIL_DELIMITOR__, "\n", $this->_merchant_mails)).'</textarea>
|
||||
</div>
|
||||
<div style="float:left;">
|
||||
'.$this->l('One e-mail address per line').'<br />
|
||||
'.$this->l('e.g.,').' bob@example.com
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear:both;"> </div>
|
||||
<div class="margin-form">
|
||||
<input type="submit" value="'.$this->l(' Save ').'" name="submitMAMerchant" class="button" />
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>';
|
||||
}
|
||||
|
||||
private function _postProcess()
|
||||
{
|
||||
if (Tools::isSubmit('submitMACustomer'))
|
||||
{
|
||||
if (!Configuration::updateValue('MA_CUSTOMER_QTY', (int)(Tools::getValue('mA_customer_qty'))))
|
||||
$this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>';
|
||||
else
|
||||
$this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>';
|
||||
}
|
||||
elseif (Tools::isSubmit('submitMAMerchant'))
|
||||
{
|
||||
$emails = strval(Tools::getValue('ma_merchant_mails'));
|
||||
if (!$emails OR empty($emails))
|
||||
$this->_html .= '<div class="alert error">'.$this->l('Please type one (or more) e-mail address').'</div>';
|
||||
else
|
||||
{
|
||||
$emails = explode("\n", $emails);
|
||||
foreach ($emails AS $k => $email)
|
||||
{
|
||||
$email = trim($email);
|
||||
if (!empty($email) AND !Validate::isEmail($email))
|
||||
return ($this->_html .= '<div class="alert error">'.$this->l('Invalid e-mail:').' '.$email.'</div>');
|
||||
if (!empty($email) AND sizeof($email))
|
||||
$emails[$k] = $email;
|
||||
else
|
||||
unset($emails[$k]);
|
||||
}
|
||||
$emails = implode(self::__MA_MAIL_DELIMITOR__, $emails);
|
||||
if (!Configuration::updateValue('MA_MERCHANT_MAILS', strval($emails)))
|
||||
$this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>';
|
||||
elseif (!Configuration::updateValue('MA_MERCHANT_ORDER', (int)(Tools::getValue('mA_merchand_order'))))
|
||||
$this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>';
|
||||
elseif (!Configuration::updateValue('MA_MERCHANT_OOS', (int)(Tools::getValue('mA_merchand_oos'))))
|
||||
$this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>';
|
||||
elseif (!Configuration::updateValue('MA_LAST_QTIES', (int)(Tools::getValue('MA_LAST_QTIES'))))
|
||||
$this->_html .= '<div class="alert error">'.$this->l('Cannot update settings').'</div>';
|
||||
else
|
||||
$this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>';
|
||||
}
|
||||
}
|
||||
$this->_refreshProperties();
|
||||
}
|
||||
|
||||
public static function getProductsAlerts($id_customer, $id_lang)
|
||||
{
|
||||
if (!Validate::isUnsignedId($id_customer) OR
|
||||
!Validate::isUnsignedId($id_lang)
|
||||
)
|
||||
die (Tools::displayError());
|
||||
|
||||
$sql = 'SELECT ma.`id_product`, IFNULL(stock.quantity, 0) as product_quantity, pl.`name`, ma.`id_product_attribute`
|
||||
FROM `'._DB_PREFIX_.'mailalert_customer_oos` ma
|
||||
JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ma.`id_product`
|
||||
JOIN `'._DB_PREFIX_.'product_lang` pl ON pl.`id_product` = ma.`id_product` AND pl.`id_lang` = '.$id_lang.Context::getContext()->shop->addSqlRestrictionOnLang('pl').'
|
||||
'.Product::sqlStock('p', 0).'
|
||||
WHERE p.`active` = 1
|
||||
ma.`id_customer` = '.$id_customer;
|
||||
$products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
|
||||
|
||||
if (empty($products) === true OR !sizeof($products))
|
||||
return array();
|
||||
for ($i = 0; $i < sizeof($products); ++$i)
|
||||
{
|
||||
$obj = new Product($products[$i]['id_product'], false, (int)($id_lang));
|
||||
if (!Validate::isLoadedObject($obj))
|
||||
continue;
|
||||
|
||||
if (isset($products[$i]['id_product_attribute']) AND
|
||||
Validate::isUnsignedInt($products[$i]['id_product_attribute']))
|
||||
{
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
|
||||
SELECT al.`name` AS attribute_name
|
||||
FROM `'._DB_PREFIX_.'product_attribute_combination` pac
|
||||
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON (a.`id_attribute` = pac.`id_attribute`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`)
|
||||
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.$id_lang.')
|
||||
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.$id_lang.')
|
||||
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pac.`id_product_attribute` = pa.`id_product_attribute`)
|
||||
WHERE pac.`id_product_attribute` = '.(int)($products[$i]['id_product_attribute']));
|
||||
$products[$i]['attributes_small'] = '';
|
||||
if ($result)
|
||||
foreach ($result AS $k => $row)
|
||||
$products[$i]['attributes_small'] .= $row['attribute_name'].', ';
|
||||
$products[$i]['attributes_small'] = rtrim($products[$i]['attributes_small'], ', ');
|
||||
|
||||
// cover
|
||||
$attrgrps = $obj->getAttributesGroups($id_lang);
|
||||
foreach ($attrgrps AS $attrgrp)
|
||||
if ($attrgrp['id_product_attribute'] == $products[$i]['id_product_attribute'] AND $images = Product::_getAttributeImageAssociations((int)($attrgrp['id_product_attribute'])))
|
||||
{
|
||||
$products[$i]['cover'] = $obj->id.'-'.array_pop($images);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!isset($products[$i]['cover']) OR !$products[$i]['cover'])
|
||||
{
|
||||
$images = $obj->getImages($id_lang);
|
||||
foreach ($images AS $k => $image)
|
||||
if ($image['cover'])
|
||||
{
|
||||
$products[$i]['cover'] = $obj->id.'-'.$image['id_image'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!isset($products[$i]['cover']))
|
||||
$products[$i]['cover'] = Language::getIsoById($id_lang).'-default';
|
||||
$products[$i]['link'] = $obj->getLink();
|
||||
$products[$i]['link_rewrite'] = $obj->link_rewrite;
|
||||
}
|
||||
return ($products);
|
||||
}
|
||||
|
||||
public static function deleteAlert($id_customer, $customer_email, $id_product, $id_product_attribute)
|
||||
{
|
||||
return Db::getInstance()->execute('
|
||||
DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos`
|
||||
WHERE `id_customer` = '.(int)($id_customer).'
|
||||
AND `customer_email` = \''.pSQL($customer_email).'\'
|
||||
AND `id_product` = '.(int)($id_product).'
|
||||
AND `id_product_attribute` = '.(int)($id_product_attribute));
|
||||
}
|
||||
|
||||
public function hookDeleteProduct($params)
|
||||
{
|
||||
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos` WHERE `id_product` = '.(int)$params['product']->id);
|
||||
}
|
||||
|
||||
public function hookDeleteProductAttribute($params)
|
||||
|
||||
public function hookActionAttributeDelete($params)
|
||||
{
|
||||
if ($params['deleteAllAttributes'])
|
||||
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos`
|
||||
WHERE `id_product` = '.(int)$params['id_product']);
|
||||
$sql = 'DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'`
|
||||
WHERE `id_product` = '.(int)$params['id_product'];
|
||||
else
|
||||
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'mailalert_customer_oos`
|
||||
WHERE `id_product_attribute` = '.(int)$params['id_product_attribute'].'
|
||||
AND `id_product` = '.(int)$params['id_product']);
|
||||
$sql = 'DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'`
|
||||
WHERE `id_product_attribute` = '.(int)$params['id_product_attribute'].'
|
||||
AND `id_product` = '.(int)$params['id_product'];
|
||||
|
||||
Db::getInstance()->Execute($sql);
|
||||
}
|
||||
|
||||
public function hookDisplayHeader($params)
|
||||
{
|
||||
$this->context->controller->addCSS($this->_path.'mailalerts.css', 'all');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user