Jump to content

birchoff

Members
  • Posts

    34
  • Joined

  • Last visited

Profile Information

  • Location
    poland
  • Activity
    Freelancer

birchoff's Achievements

Newbie

Newbie (1/14)

  • Week One Done Rare
  • One Month Later Rare
  • One Year In Rare

Recent Badges

0

Reputation

  1. Hi, i've got strange situation. I've installed GB language, then i installed DE language. So I've got three languages in shop: https://shinydream.pl/pl/ (works perfect) https://shinydream.pl/gb/ (works perfect) and: https://shinydream.pl/de which don't work and there is error on main page: Fatal error: Uncaught Symfony\Component\Config\Util\Exception\XmlParsingException: [ERROR 522] Validation failed: no DTD found ! (in n/a - line 2, column 21) [ERROR 76] Opening and ending tag mismatch: note line 991 and xliff (in n/a - line 1224, column 9) [ERROR 77] Premature end of data in tag trans-unit line 988 (in n/a - line 1225, column 1) [ERROR 77] Premature end of data in tag body line 987 (in n/a - line 1225, column 1) [ERROR 77] Premature end of data in tag file line 986 (in n/a - line 1225, column 1) [ERROR 77] Premature end of data in tag xliff line 2 (in n/a - line 1225, column 1) in /home/shinyd/domains/shinydream.pl/public_html/vendor/symfony/symfony/src/Symfony/Component/Config/Util/XmlUtils.php:62 Stack trace: #0 /home/shinyd/domains/shinydream.pl/public_html/vendor/symfony/symfony/src/Symfony/Component/Config/Util/XmlUtils.php(131): Symfony\Component\Config\Util\XmlUtils::parse('<?xml version="...', NULL) #1 /home/shinyd/domains/shinydream.pl/public_html/vendor/symfony/symfony/src/Symfony/Component/Tran in /home/shinyd/domains/shinydream.pl/public_html/vendor/symfony/symfony/src/Symfony/Component/Translation/Loader/XliffFileLoader.php on line 56 I tried to reintall DE language, but this didn't resolve problem. What should i do? My PS version: 1.7.5.0
  2. Hi, i've got problem with cart on page http://welovewood.r5studio-ssd2.pl/koszyk?action=show When you add some products to cart, the Delete button don't work. In Console i've got error: Failed to load resource: the server responded with a status of 403 (Forbidden) when i click on delete icon. I've tried to reinstall cart module but problem still is. Any ideas? Prestashop v1.7.6.3
  3. Hi, on PS 1.7.6.0 on frontend I'm showing few dimension variables like: {$product.width} {$product.depth} {$product.height} On backend I write them in Shipping tab in format like: "5", "10", "23" etc. But on front they show in format "5.000000", "10.000000" etc. How to show them without zeros after . ? I would like to show them in format "5", "10" etc. like on backend...
  4. Hi, i've got problem with properly configuration SSL on my Prestashop. I've got Prestashop on three domains, lets say .de .eu and .cz. The main domain is .cz and backend is on SSL, and front-end of this domain. And all works great. But I would like to have SSL on domain .eu and .de Offcourse every three domains works as multistore. They are configured as it should. The domain .eu and .de are parked to domain .cz (in my DirectAdmin panel it is called domains pointers with alias). But problem is that I can paste the SSL certificate just to one domain (the SSL is pasted to .cz domain), there is no way to merge SSL do pointed domains. The hosting administartor told me that I should add three separate domain to one hosting account. Ok then I could merge the SSL but multistore will not work... What should I do? How to get three separate SSL on three domains with multistore. My Presta is 1.6.10 version. Please help.
  5. Hi, I've got some problem with MailAlerts Module. In mail to admin after sell product the Subject is just "New order" with no Order ID or Order number. In my two others shops the mail is "New Order: #7 - YBRDJFCNG" but in one of the shops I don't know that to do. I've overrided all files from modules/mailalerts (from shop where all is ok) to the shop where I can't see the Order numer or ID in mail subject. And this didn't solved the problem. Presta 1.6.0.14. Please help! The code of mailalerts.php is: <?php /** * 2007-2015 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2015 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ if (!defined('_CAN_LOAD_FILES_')) exit; include_once(dirname(__FILE__).'/MailAlert.php'); class MailAlerts extends Module { protected $html = ''; protected $merchant_mails; protected $merchant_order; protected $merchant_oos; protected $customer_qty; protected $merchant_coverage; protected $product_coverage; protected $order_edited; protected $return_slip; const __MA_MAIL_DELIMITOR__ = "\n"; public function __construct() { $this->name = 'mailalerts'; $this->tab = 'administration'; $this->version = '3.6.0'; $this->author = 'PrestaShop'; $this->need_instance = 0; $this->controllers = array('account'); $this->bootstrap = true; parent::__construct(); if ($this->id) $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?'); } protected function init() { $this->merchant_mails = str_replace(',', self::__MA_MAIL_DELIMITOR__, (string)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->merchant_coverage = (int)Configuration::getGlobalValue('MA_MERCHANT_COVERAGE'); $this->product_coverage = (int)Configuration::getGlobalValue('MA_PRODUCT_COVERAGE'); $this->order_edited = (int)Configuration::getGlobalValue('MA_ORDER_EDIT'); $this->return_slip = (int)Configuration::getGlobalValue('MA_RETURN_SLIP'); } public function install($delete_params = true) { if (!parent::install() || !$this->registerHook('actionValidateOrder') || !$this->registerHook('actionUpdateQuantity') || !$this->registerHook('actionProductOutOfStock') || !$this->registerHook('displayCustomerAccount') || !$this->registerHook('displayMyAccountBlock') || !$this->registerHook('actionProductDelete') || !$this->registerHook('actionProductAttributeDelete') || !$this->registerHook('actionProductAttributeUpdate') || !$this->registerHook('actionProductCoverage') || !$this->registerHook('actionOrderReturn') || !$this->registerHook('actionOrderEdited') || !$this->registerHook('displayHeader')) return false; if ($delete_params) { Configuration::updateValue('MA_MERCHANT_ORDER', 1); Configuration::updateValue('MA_MERCHANT_OOS', 1); Configuration::updateValue('MA_CUSTOMER_QTY', 1); Configuration::updateValue('MA_ORDER_EDIT', 1); Configuration::updateValue('MA_RETURN_SLIP', 1); Configuration::updateValue('MA_MERCHANT_MAILS', Configuration::get('PS_SHOP_EMAIL')); Configuration::updateValue('MA_LAST_QTIES', (int)Configuration::get('PS_LAST_QTIES')); Configuration::updateGlobalValue('MA_MERCHANT_COVERAGE', 0); Configuration::updateGlobalValue('MA_PRODUCT_COVERAGE', 0); $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, `id_lang` int(10) unsigned NOT NULL, PRIMARY KEY (`id_customer`,`customer_email`,`id_product`,`id_product_attribute`,`id_shop`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci'; if (!Db::getInstance()->execute($sql)) return false; } return true; } public function uninstall($delete_params = true) { if ($delete_params) { Configuration::deleteByName('MA_MERCHANT_ORDER'); Configuration::deleteByName('MA_MERCHANT_OOS'); Configuration::deleteByName('MA_CUSTOMER_QTY'); Configuration::deleteByName('MA_MERCHANT_MAILS'); Configuration::deleteByName('MA_LAST_QTIES'); Configuration::deleteByName('MA_MERCHANT_COVERAGE'); Configuration::deleteByName('MA_PRODUCT_COVERAGE'); Configuration::deleteByName('MA_ORDER_EDIT'); Configuration::deleteByName('MA_RETURN_SLIP'); if (!Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.MailAlert::$definition['table'])) return false; } return parent::uninstall(); } public function reset() { if (!$this->uninstall(false)) return false; if (!$this->install(false)) return false; return true; } public function getContent() { $this->html = ''; $this->postProcess(); $this->html .= $this->renderForm(); return $this->html; } protected function postProcess() { $errors = array(); if (Tools::isSubmit('submitMailAlert')) { if (!Configuration::updateValue('MA_CUSTOMER_QTY', (int)Tools::getValue('MA_CUSTOMER_QTY'))) $errors[] = $this->l('Cannot update settings'); } else if (Tools::isSubmit('submitMAMerchant')) { $emails = (string)Tools::getValue('MA_MERCHANT_MAILS'); if (!$emails || empty($emails)) $errors[] = $this->l('Please type one (or more) e-mail address'); else { $emails = str_replace(',', self::__MA_MAIL_DELIMITOR__, $emails); $emails = explode(self::__MA_MAIL_DELIMITOR__, $emails); foreach ($emails as $k => $email) { $email = trim($email); if (!empty($email) && !Validate::isEmail($email)) { $errors[] = $this->l('Invalid e-mail:').' '.Tools::safeOutput($email); break; } elseif (!empty($email) && count($email) > 0) $emails[$k] = $email; else unset($emails[$k]); } $emails = implode(self::__MA_MAIL_DELIMITOR__, $emails); if (!Configuration::updateValue('MA_MERCHANT_MAILS', (string)$emails)) $errors[] = $this->l('Cannot update settings'); elseif (!Configuration::updateValue('MA_MERCHANT_ORDER', (int)Tools::getValue('MA_MERCHANT_ORDER'))) $errors[] = $this->l('Cannot update settings'); elseif (!Configuration::updateValue('MA_MERCHANT_OOS', (int)Tools::getValue('MA_MERCHANT_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'); elseif (!Configuration::updateGlobalValue('MA_MERCHANT_COVERAGE', (int)Tools::getValue('MA_MERCHANT_COVERAGE'))) $errors[] = $this->l('Cannot update settings'); elseif (!Configuration::updateGlobalValue('MA_PRODUCT_COVERAGE', (int)Tools::getValue('MA_PRODUCT_COVERAGE'))) $errors[] = $this->l('Cannot update settings'); elseif (!Configuration::updateGlobalValue('MA_ORDER_EDIT', (int)Tools::getValue('MA_ORDER_EDIT'))) $errors[] = $this->l('Cannot update settings'); elseif (!Configuration::updateGlobalValue('MA_RETURN_SLIP', (int)Tools::getValue('MA_RETURN_SLIP'))) $errors[] = $this->l('Cannot update settings'); } } if (count($errors) > 0) $this->html .= $this->displayError(implode('<br />', $errors)); else $this->html .= $this->displayConfirmation($this->l('Settings updated successfully')); $this->init(); } public function getAllMessages($id) { $messages = Db::getInstance()->executeS(' SELECT `message` FROM `'._DB_PREFIX_.'message` WHERE `id_order` = '.(int)$id.' ORDER BY `id_message` ASC'); $result = array(); foreach ($messages as $message) $result[] = $message['message']; return implode('<br/>', $result); } public function hookActionValidateOrder($params) { if (!$this->merchant_order || empty($this->merchant_mails)) return; // Getting differents vars $context = Context::getContext(); $id_lang = (int)$context->language->id; $id_shop = (int)$context->shop->id; $currency = $params['currency']; $order = $params['order']; $customer = $params['customer']; $configuration = Configuration::getMultiple( array( 'PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME', 'PS_MAIL_COLOR' ), $id_lang, null, $id_shop ); $delivery = new Address((int)$order->id_address_delivery); $invoice = new Address((int)$order->id_address_invoice); $order_date_text = Tools::displayDate($order->date_add); $carrier = new Carrier((int)$order->id_carrier); $message = $this->getAllMessages($order->id); if (!$message || empty($message)) $message = $this->l('No message'); $items_table = ''; $products = $params['order']->getProducts(); $customized_datas = Product::getAllCustomizedDatas((int)$params['cart']->id); Product::addCustomizationPrice($products, $customized_datas); foreach ($products as $key => $product) { $unit_price = Product::getTaxCalculationMethod($customer->id) == PS_TAX_EXC ? $product['product_price'] : $product['product_price_wt']; $customization_text = ''; if (isset($customized_datas[$product['product_id']][$product['product_attribute_id']])) { foreach ($customized_datas[$product['product_id']][$product['product_attribute_id']][$order->id_address_delivery] as $customization) { if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD])) foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] as $text) $customization_text .= $text['name'].': '.$text['value'].'<br />'; if (isset($customization['datas'][Product::CUSTOMIZE_FILE])) $customization_text .= count($customization['datas'][Product::CUSTOMIZE_FILE]).' '.$this->l('image(s)').'<br />'; $customization_text .= '---<br />'; } if (method_exists('Tools', 'rtrimString')) $customization_text = Tools::rtrimString($customization_text, '---<br />'); else $customization_text = preg_replace('/---<br \/>$/', '', $customization_text); } $url = $context->link->getProductLink($product['product_id']); $items_table .= '<tr style="background-color:'.($key % 2 ? '#DDE2E6' : '#EBECEE').';"> <td style="padding:0.6em 0.4em;">'.$product['product_reference'].'</td> <td style="padding:0.6em 0.4em;"> <strong><a href="'.$url.'">'.$product['product_name'].'</a>' .(isset($product['attributes_small']) ? ' '.$product['attributes_small'] : '') .(!empty($customization_text) ? '<br />'.$customization_text : '') .'</strong> </td> <td style="padding:0.6em 0.4em; text-align:right;">'.Tools::displayPrice($unit_price, $currency, false).'</td> <td style="padding:0.6em 0.4em; text-align:center;">'.(int)$product['product_quantity'].'</td> <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) { $items_table .= '<tr style="background-color:#EBECEE;"> <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); if ($invoice->id_state) $invoice_state = new State((int)$invoice->id_state); if (Product::getTaxCalculationMethod($customer->id) == PS_TAX_EXC) $total_products = $order->getTotalProductsWithoutTaxes(); else $total_products = $order->getTotalProductsWithTaxes(); $order_state = $params['orderStatus']; // Filling-in vars for email $template_vars = array( '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{email}' => $customer->email, '{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:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>', 'lastname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>' ) ), '{invoice_block_html}' => MailAlert::getFormatedAddress( $invoice, '<br />', array( 'firstname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>', 'lastname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>' ) ), '{delivery_company}' => $delivery->company, '{delivery_firstname}' => $delivery->firstname, '{delivery_lastname}' => $delivery->lastname, '{delivery_address1}' => $delivery->address1, '{delivery_address2}' => $delivery->address2, '{delivery_city}' => $delivery->city, '{delivery_postal_code}' => $delivery->postcode, '{delivery_country}' => $delivery->country, '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', '{delivery_phone}' => $delivery->phone ? $delivery->phone : $delivery->phone_mobile, '{delivery_other}' => $delivery->other, '{invoice_company}' => $invoice->company, '{invoice_firstname}' => $invoice->firstname, '{invoice_lastname}' => $invoice->lastname, '{invoice_address2}' => $invoice->address2, '{invoice_address1}' => $invoice->address1, '{invoice_city}' => $invoice->city, '{invoice_postal_code}' => $invoice->postcode, '{invoice_country}' => $invoice->country, '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', '{invoice_phone}' => $invoice->phone ? $invoice->phone : $invoice->phone_mobile, '{invoice_other}' => $invoice->other, '{order_name}' => $order->reference, '{order_status}' => $order_state->name, '{shop_name}' => $configuration['PS_SHOP_NAME'], '{date}' => $order_date_text, '{carrier}' => (($carrier->name == '0') ? $configuration['PS_SHOP_NAME'] : $carrier->name), '{payment}' => Tools::substr($order->payment, 0, 32), '{items}' => $items_table, '{total_paid}' => Tools::displayPrice($order->total_paid, $currency), '{total_products}' => Tools::displayPrice($total_products, $currency), '{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency), '{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency), '{total_tax_paid}' => Tools::displayPrice( ($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $currency, false ), '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency), '{currency}' => $currency->sign, '{gift}' => (bool)$order->gift, '{gift_message}' => $order->gift_message, '{message}' => $message ); // Shop iso $iso = Language::getIsoById((int)Configuration::get('PS_LANG_DEFAULT')); // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->merchant_mails); foreach ($merchant_mails as $merchant_mail) { // Default language $mail_id_lang = $id_lang; $mail_iso = $iso; // Use the merchant lang if he exists as an employee $results = Db::getInstance()->executeS(' SELECT `id_lang` FROM `'._DB_PREFIX_.'employee` WHERE `email` = \''.pSQL($merchant_mail).'\' '); if ($results) { $user_iso = Language::getIsoById((int)$results[0]['id_lang']); if ($user_iso) { $mail_id_lang = (int)$results[0]['id_lang']; $mail_iso = $user_iso; } } $dir_mail = false; if (file_exists(dirname(__FILE__).'/mails/'.$mail_iso.'/new_order.txt') && file_exists(dirname(__FILE__).'/mails/'.$mail_iso.'/new_order.html')) $dir_mail = dirname(__FILE__).'/mails/'; if (file_exists(_PS_MAIL_DIR_.$mail_iso.'/new_order.txt') && file_exists(_PS_MAIL_DIR_.$mail_iso.'/new_order.html')) $dir_mail = _PS_MAIL_DIR_; if ($dir_mail) Mail::Send( $mail_id_lang, 'new_order', sprintf(Mail::l('New order : #%d - %s', $mail_id_lang), $order->id, $order->reference), $template_vars, $merchant_mail, null, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], null, null, $dir_mail, null, $id_shop ); } } public function hookActionProductOutOfStock($params) { if (!$this->customer_qty || !Configuration::get('PS_STOCK_MANAGEMENT') || Product::isAvailableWhenOutOfStock($params['product']->out_of_stock)) return; $context = Context::getContext(); $id_product = (int)$params['product']->id; $id_product_attribute = 0; $id_customer = (int)$context->customer->id; if ((int)$context->customer->id <= 0) $this->context->smarty->assign('email', 1); elseif (MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute, (int)$context->shop->id)) return; $this->context->smarty->assign( array( 'id_product' => $id_product, 'id_product_attribute' => $id_product_attribute ) ); return $this->display(__FILE__, 'product.tpl'); } public function hookActionUpdateQuantity($params) { $id_product = (int)$params['id_product']; $id_product_attribute = (int)$params['id_product_attribute']; $quantity = (int)$params['quantity']; $context = Context::getContext(); $id_shop = (int)$context->shop->id; $id_lang = (int)$context->language->id; $product = new Product($id_product, false, $id_lang, $id_shop, $context); $product_has_attributes = $product->hasAttributes(); $configuration = Configuration::getMultiple( array( 'MA_LAST_QTIES', 'PS_STOCK_MANAGEMENT', 'PS_SHOP_EMAIL', 'PS_SHOP_NAME' ), null, null, $id_shop ); $ma_last_qties = (int)$configuration['MA_LAST_QTIES']; $check_oos = ($product_has_attributes && $id_product_attribute) || (!$product_has_attributes && !$id_product_attribute); if ($check_oos && $product->active == 1 && (int)$quantity <= $ma_last_qties && !(!$this->merchant_oos || empty($this->merchant_mails)) && $configuration['PS_STOCK_MANAGEMENT']) { $iso = Language::getIsoById($id_lang); $product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang); $template_vars = array( '{qty}' => $quantity, '{last_qty}' => $ma_last_qties, '{product}' => $product_name ); // Do not send mail if multiples product are created / imported. if (!defined('PS_MASS_PRODUCT_CREATION') && file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') && file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html')) { // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->merchant_mails); foreach ($merchant_mails as $merchant_mail) { Mail::Send( $id_lang, 'productoutofstock', Mail::l('Product out of stock', $id_lang), $template_vars, $merchant_mail, null, (string)$configuration['PS_SHOP_EMAIL'], (string)$configuration['PS_SHOP_NAME'], null, null, dirname(__FILE__).'/mails/', false, $id_shop ); } } } if ($this->customer_qty && $quantity > 0) MailAlert::sendCustomerAlert((int)$product->id, (int)$params['id_product_attribute']); } public function hookActionProductAttributeUpdate($params) { $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 && $result['quantity'] > 0) MailAlert::sendCustomerAlert((int)$result['id_product'], (int)$params['id_product_attribute']); } public function hookDisplayCustomerAccount() { return $this->customer_qty ? $this->display(__FILE__, 'my-account.tpl') : null; } public function hookDisplayMyAccountBlock($params) { return $this->hookDisplayCustomerAccount($params); } public function hookActionProductDelete($params) { $sql = ' DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'` WHERE `id_product` = '.(int)$params['product']->id; Db::getInstance()->execute($sql); } public function hookActionAttributeDelete($params) { if ($params['deleteAllAttributes']) $sql = ' DELETE FROM `'._DB_PREFIX_.MailAlert::$definition['table'].'` WHERE `id_product` = '.(int)$params['id_product']; else $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 hookActionProductCoverage($params) { // if not advanced stock management, nothing to do if (!Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) return; // retrieves informations $id_product = (int)$params['id_product']; $id_product_attribute = (int)$params['id_product_attribute']; $warehouse = $params['warehouse']; $product = new Product($id_product); if (!Validate::isLoadedObject($product)) return; if (!$product->advanced_stock_management) return; // sets warehouse id to get the coverage if (!Validate::isLoadedObject($warehouse)) $id_warehouse = 0; else $id_warehouse = (int)$warehouse->id; // coverage of the product $warning_coverage = (int)Configuration::getGlobalValue('MA_PRODUCT_COVERAGE'); $coverage = StockManagerFactory::getManager()->getProductCoverage($id_product, $id_product_attribute, $warning_coverage, $id_warehouse); // if we need to send a notification if ($product->active == 1 && ($coverage < $warning_coverage) && !empty($this->merchant_mails) && Configuration::getGlobalValue('MA_MERCHANT_COVERAGE')) { $context = Context::getContext(); $id_lang = (int)$context->language->id; $id_shop = (int)$context->shop->id; $iso = Language::getIsoById($id_lang); $product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang); $template_vars = array( '{current_coverage}' => $coverage, '{warning_coverage}' => $warning_coverage, '{product}' => pSQL($product_name) ); if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.txt') && file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.html')) { // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->merchant_mails); foreach ($merchant_mails as $merchant_mail) { Mail::Send( $id_lang, 'productcoverage', Mail::l('Stock coverage', $id_lang), $template_vars, $merchant_mail, null, (string)Configuration::get('PS_SHOP_EMAIL'), (string)Configuration::get('PS_SHOP_NAME'), null, null, dirname(__FILE__).'/mails/', null, $id_shop ); } } } } public function hookDisplayHeader() { $this->page_name = Dispatcher::getInstance()->getController(); if (in_array($this->page_name, array('product', 'account'))) { $this->context->controller->addJS($this->_path.'js/mailalerts.js'); $this->context->controller->addCSS($this->_path.'css/mailalerts.css', 'all'); } } /** * Send a mail when a customer return an order. * * @param array $params Hook params. */ public function hookActionOrderReturn($params) { if (!$this->return_slip || empty($this->return_slip)) return; $context = Context::getContext(); $id_lang = (int)$context->language->id; $id_shop = (int)$context->shop->id; $configuration = Configuration::getMultiple( array( 'PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME', 'PS_MAIL_COLOR' ), $id_lang, null, $id_shop ); // Shop iso $iso = Language::getIsoById((int)Configuration::get('PS_LANG_DEFAULT')); $order = new Order((int)$params['orderReturn']->id_order); $customer = new Customer((int)$params['orderReturn']->id_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); if ($delivery->id_state) $delivery_state = new State((int)$delivery->id_state); if ($invoice->id_state) $invoice_state = new State((int)$invoice->id_state); $order_return_products = OrderReturn::getOrdersReturnProducts($params['orderReturn']->id, $order); $items_table = ''; foreach ($order_return_products as $key => $product) { $url = $context->link->getProductLink($product['product_id']); $items_table .= '<tr style="background-color:'.($key % 2 ? '#DDE2E6' : '#EBECEE').';"> <td style="padding:0.6em 0.4em;">'.$product['product_reference'].'</td> <td style="padding:0.6em 0.4em;"> <strong><a href="'.$url.'">'.$product['product_name'].'</a> </strong> </td> <td style="padding:0.6em 0.4em; text-align:center;">'.(int)$product['product_quantity'].'</td> </tr>'; } $template_vars = array( '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{email}' => $customer->email, '{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:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>', 'lastname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>' ) ), '{invoice_block_html}' => MailAlert::getFormatedAddress( $invoice, '<br />', array( 'firstname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>', 'lastname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>' ) ), '{delivery_company}' => $delivery->company, '{delivery_firstname}' => $delivery->firstname, '{delivery_lastname}' => $delivery->lastname, '{delivery_address1}' => $delivery->address1, '{delivery_address2}' => $delivery->address2, '{delivery_city}' => $delivery->city, '{delivery_postal_code}' => $delivery->postcode, '{delivery_country}' => $delivery->country, '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', '{delivery_phone}' => $delivery->phone ? $delivery->phone : $delivery->phone_mobile, '{delivery_other}' => $delivery->other, '{invoice_company}' => $invoice->company, '{invoice_firstname}' => $invoice->firstname, '{invoice_lastname}' => $invoice->lastname, '{invoice_address2}' => $invoice->address2, '{invoice_address1}' => $invoice->address1, '{invoice_city}' => $invoice->city, '{invoice_postal_code}' => $invoice->postcode, '{invoice_country}' => $invoice->country, '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', '{invoice_phone}' => $invoice->phone ? $invoice->phone : $invoice->phone_mobile, '{invoice_other}' => $invoice->other, '{order_name}' => $order->reference, '{shop_name}' => $configuration['PS_SHOP_NAME'], '{date}' => $order_date_text, '{items}' => $items_table, '{message}' => Tools::purifyHTML($params['orderReturn']->question), ); // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->merchant_mails); foreach ($merchant_mails as $merchant_mail) { // Default language $mail_id_lang = $id_lang; $mail_iso = $iso; // Use the merchant lang if he exists as an employee $results = Db::getInstance()->executeS(' SELECT `id_lang` FROM `'._DB_PREFIX_.'employee` WHERE `email` = \''.pSQL($merchant_mail).'\' '); if ($results) { $user_iso = Language::getIsoById((int)$results[0]['id_lang']); if ($user_iso) { $mail_id_lang = (int)$results[0]['id_lang']; $mail_iso = $user_iso; } } $dir_mail = false; if (file_exists(dirname(__FILE__).'/mails/'.$mail_iso.'/return_slip.txt') && file_exists(dirname(__FILE__).'/mails/'.$mail_iso.'/return_slip.html')) $dir_mail = dirname(__FILE__).'/mails/'; if (file_exists(_PS_MAIL_DIR_.$mail_iso.'/return_slip.txt') && file_exists(_PS_MAIL_DIR_.$mail_iso.'/return_slip.html')) $dir_mail = _PS_MAIL_DIR_; if ($dir_mail) Mail::Send( $mail_id_lang, 'return_slip', sprintf(Mail::l('New return from order #%d - %s', $mail_id_lang), $order->id, $order->reference), $template_vars, $merchant_mail, null, $configuration['PS_SHOP_EMAIL'], $configuration['PS_SHOP_NAME'], null, null, $dir_mail, null, $id_shop ); } } /** * Send a mail when an order is modified. * * @param array $params Hook params. */ public function hookActionOrderEdited($params) { if (!$this->order_edited || empty($this->order_edited)) return; $order = $params['order']; $data = array( '{lastname}' => $order->getCustomer()->lastname, '{firstname}' => $order->getCustomer()->firstname, '{id_order}' => (int)$order->id, '{order_name}' => $order->getUniqReference() ); Mail::Send( (int)$order->id_lang, 'order_changed', Mail::l('Your order has been changed', (int)$order->id_lang), $data, $order->getCustomer()->email, $order->getCustomer()->firstname.' '.$order->getCustomer()->lastname, null, null, null, null, _PS_MAIL_DIR_, true, (int)$order->id_shop); } public function renderForm() { $fields_form_1 = array( 'form' => array( 'legend' => array( 'title' => $this->l('Customer notifications'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('Product availability'), 'name' => 'MA_CUSTOMER_QTY', 'desc' => $this->l('Gives the customer the option of receiving a notification when an out-of-stock product is available again.'), 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('Order edit'), 'name' => 'MA_ORDER_EDIT', 'desc' => $this->l('Send a notification to the customer when an order is edited.'), 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right', 'name' => 'submitMailAlert', ) ), ); $fields_form_2 = array( 'form' => array( 'legend' => array( 'title' => $this->l('Merchant notifications'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('New order'), 'name' => 'MA_MERCHANT_ORDER', 'desc' => $this->l('Receive a notification when an order is placed.'), 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('Out of stock'), 'name' => 'MA_MERCHANT_OOS', 'desc' => $this->l('Receive a notification if the available quantity of a product is below the following threshold.'), 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), array( 'type' => 'text', 'label' => $this->l('Threshold'), 'name' => 'MA_LAST_QTIES', 'class' => 'fixed-width-xs', 'desc' => $this->l('Quantity for which a product is considered out of stock.'), ), array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('Coverage warning'), 'name' => 'MA_MERCHANT_COVERAGE', 'desc' => $this->l('Receive a notification when a product has insufficient coverage.'), 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), array( 'type' => 'text', 'label' => $this->l('Coverage'), 'name' => 'MA_PRODUCT_COVERAGE', 'class' => 'fixed-width-xs', 'desc' => $this->l('Stock coverage, in days. Also, the stock coverage of a given product will be calculated based on this number.'), ), array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('Returns'), 'name' => 'MA_RETURN_SLIP', 'desc' => $this->l('Receive a notification when a customer requests a merchandise return.'), 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), array( 'type' => 'textarea', 'cols' => 36, 'rows' => 4, 'label' => $this->l('E-mail addresses'), 'name' => 'MA_MERCHANT_MAILS', 'desc' => $this->l('One e-mail address per line (e.g. [email protected]).'), ), ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right', 'name' => 'submitMAMerchant', ) ), ); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->module = $this; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $helper->identifier = $this->identifier; $helper->submit_action = 'submitMailAlertConfiguration'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) .'&configure='.$this->name .'&tab_module='.$this->tab .'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'fields_value' => $this->getConfigFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id ); return $helper->generateForm(array($fields_form_1, $fields_form_2)); } public function getConfigFieldsValues() { return array( 'MA_CUSTOMER_QTY' => Tools::getValue('MA_CUSTOMER_QTY', Configuration::get('MA_CUSTOMER_QTY')), 'MA_MERCHANT_ORDER' => Tools::getValue('MA_MERCHANT_ORDER', Configuration::get('MA_MERCHANT_ORDER')), 'MA_MERCHANT_OOS' => Tools::getValue('MA_MERCHANT_OOS', Configuration::get('MA_MERCHANT_OOS')), 'MA_LAST_QTIES' => Tools::getValue('MA_LAST_QTIES', Configuration::get('MA_LAST_QTIES')), 'MA_MERCHANT_COVERAGE' => Tools::getValue('MA_MERCHANT_COVERAGE', Configuration::get('MA_MERCHANT_COVERAGE')), 'MA_PRODUCT_COVERAGE' => Tools::getValue('MA_PRODUCT_COVERAGE', Configuration::get('MA_PRODUCT_COVERAGE')), 'MA_MERCHANT_MAILS' => Tools::getValue('MA_MERCHANT_MAILS', Configuration::get('MA_MERCHANT_MAILS')), 'MA_ORDER_EDIT' => Tools::getValue('MA_ORDER_EDIT', Configuration::get('MA_ORDER_EDIT')), 'MA_RETURN_SLIP' => Tools::getValue('MA_RETURN_SLIP', Configuration::get('MA_RETURN_SLIP')), ); } }
  6. Czy zna ktoś może moduł, który pozwalałby na uzyskanie funkcjonalności podobnej jak tutaj: http://www.gerdex.com.pl/drzwi-antywlamaniowe?product_id=413 Chodzi o wyposażenie dodatkowe. Rozmiar drzwi, sposób otwierania, to wiem można sobie kombinacjami uzyskać. Ale czy takie dobieranie kolorów jak na podanej stronie, zaznaczanie dodatkowych opcji ze spisu (automatyczne dodawanie odpowiednich kwot) jest do uzyskania jakimś modułem?
  7. dzięki Faktycznie, wgrywam zdjęcia, które mają ok. 500 px na wysokości, on dodaje białe pole do 1000 px, monitor ma 768px na wysokości, więc przeskalowuje całe zdjęcia i stąd takie małe pipki Dzięki! Zmieniłem nieco proporcje i jest lepiej
  8. Mam problem z generowaniem miniatur w sklepie. A właściwie z generowaniem zdjęć do thickbox. Otóż zdjęcia w powiększeniu są zadziwiająco małe.. wszystkie. Wgrywam zdjęcie w dużej rozdzielczości, powiedzmy 1000x800px. Miniaturki wyglądają w miarę ok, ale zdjęcie w powiększeniu jest strasznie małe - większość miejsca zajmuje białe wypełnienie, jakby jakiś padding. Przykład w załączeniu, oryginalne wgrywane zdjęcie, zdjęcie po auto wygenerowaniu i ustawienia z zakładki Zdjęcia. Co zrobić, żeby w powiększeniu pojawiało się zdjęcie maksymalnie zbliżone do zaprogramowanego wymiaru (1000x1000px)? Bez tych białych pól, które de facto zmniejszają wymiar zdjęcia.
  9. No właśnie widzę, nie wiem jak to mogłem przeoczyć, bo zacząłem poszukiwania od tego pliku... Dzięki!
  10. nie no, działa. Tylko teraz trzeba blokować wyświetlanie bloków tradycyjnie - w zapleczu. Na moje, gdzieś w szablonie jest zaszyta funkcja, która powoduje, że prawy blok nie wyświetla się np. na karcie produkty czy w kategoriach. Niestety nie udało mi się tego znaleźć. Ale lepsze takie rozwiązanie, niż żadne
  11. znalazłem połowiczne rozwiązanie, w pliku header.tpl znalazłem coś takiego: {if !empty($HOOK_LEFT_COLUMN)&& empty($HOOK_RIGHT_COLUMN)} {assign var='LAYOUT_COLUMN_SPANS' value=array(3,9,0) scope='global'} {elseif empty($HOOK_LEFT_COLUMN)&& !empty($HOOK_RIGHT_COLUMN)} {assign var='LAYOUT_COLUMN_SPANS' value=array(0,9,3) scope='global'} {elseif empty($HOOK_LEFT_COLUMN)&&empty($HOOK_RIGHT_COLUMN)} {assign var='LAYOUT_COLUMN_SPANS' value=array(0,12,0) scope='global'} {else} {assign var='LAYOUT_COLUMN_SPANS' value=array(3,6,3) scope='global'} {/if} zamieniłem (3,9,0) na (3,6,3) i działa. VEKIA: który plik? W folderze controllers/front mam 41 plików... żaden z nich nie zawiera sformułowania "left" lub "right". W Folderze szablonu żaden plik nie zawiera sformułowania initContent() Z powyższego kodu, z tego co rozumiem powinien wyłączać wyświetlanie lewej lub prawej kolumny w zależności, czy jakieś bloki są znajdują się w Hook left lub right. I działa to, tylko nie w przypadku produktu i np. kategorii. presta4you.com: w modułach nie ma wyjątków.
×
×
  • Create New...