* @copyright 2007-2017 PrestaShop SA * @license http://addons.prestashop.com/en/content/12-terms-and-conditions-of-use * International Registered Trademark & Property of PrestaShop SA */ class CartAbandonmentProTemplate extends ObjectModel { public $id_template = null; public $model = null; private $fields = array(); private $wich_template = 0; private $name = ''; public function __construct($id_template = null, $model = null, $wich_template = 0) { $this->id_template = $id_template; $this->model = $model; $this->wich_template = $wich_template; } public function save($null_values = false, $autodate = true) { // Avoid validator unused parameters $null_values = $null_values; $autodate = $autodate; if (!is_null($this->id_template) && $this->id_template > 0) { $active = TemplateController::isActive($this->id_template); $id_template = $this->id_template; } else { $active = 1; $id_template = 'NULL'; } $query = "REPLACE INTO " . _DB_PREFIX_ . "cartabandonment_template VALUES (" . (int)$id_template . ", " . (int) $this->model->getId() . ", '" . pSQL($this->name) . "', " . (int)Tools::getValue('language') . ", " . (int)Tools::getValue('id_shop') . ", " . (int)$active . ", 1)"; if (!Db::getInstance()->Execute($query)) { return false; } $this->id_template = Db::getInstance()->Insert_ID(); $content = $this->model->getContent(); $this->editContent($content); $iso = Language::getIsoById(Tools::getValue('language')); CartAbandonmentPro::initDirectory('mails/' . $iso); if (!is_writable('../modules/cartabandonmentpro/mails/')) { $query = "TRUNCATE " . _DB_PREFIX_ . "cartabandonment_template"; Db::getInstance()->Execute($query); $query = "TRUNCATE " . _DB_PREFIX_ . "cartabandonment_remind_lang"; Db::getInstance()->Execute($query); return false; } $fp = fopen('../modules/cartabandonmentpro/mails/' . $iso . '/' . $this->id_template . '.html', 'w+'); fwrite($fp, $content); fclose($fp); $content = $this->model->getContentEdit($this->wich_template); $this->editContent($content, false); if (!is_writable('../modules/cartabandonmentpro/tpls/')) { $query = "TRUNCATE " . _DB_PREFIX_ . "cartabandonment_template"; Db::getInstance()->Execute($query); $query = "TRUNCATE " . _DB_PREFIX_ . "cartabandonment_remind_lang"; Db::getInstance()->Execute($query); return false; } // Clean old templates from onChange attributes $content = preg_replace('/onchange=\"([^"]*)\"/', '', $content); $fp = fopen('../modules/cartabandonmentpro/tpls/' . $this->id_template . '.html', 'w+'); fwrite($fp, $content); fclose($fp); return $this->id_template; } // This function edits the newsletter // left column, right column, center column and the colors private function editContent(&$content, $save = true) { $this->editLeftColumn($content, $save); $this->editRightColumn($content, $save); $this->editCenter($content, $save); $this->editColors($content, $save); $context = Context::getContext(); $logo = Configuration::get('PS_LOGO_MAIL'); if (!$logo || $logo == '' || !file_exists(_PS_IMG_DIR_.$logo)) { $logo = Configuration::get('PS_LOGO'); } $logo = $context->shop->getBaseUrl() . 'img/' . $logo; $content = str_replace('%logo%', $logo, $content); } // Replace all content in left column private function editLeftColumn(&$content, $save = true) { if (!$this->model->getLeftColumn()) { return false; } for ($nb = 1; $nb <= $this->model->getTxtsLeft(); $nb++) { $value = Tools::getValue('left_' . $this->model->getId() . '_' . $nb . '_' . $this->wich_template); $content = str_replace('%left_' . $nb . '%', $value, $content); if ($save) { $value = Tools::getValue('left_' . $this->model->getId() . '_' . $nb . '_' . $this->wich_template); $this->saveColumn('left', $nb, $value); } } } // Replace all content in right column private function editRightColumn(&$content, $save = true) { if (!$this->model->getRightColumn()) { return false; } for ($nb = 1; $nb <= $this->model->getTxtsRight(); $nb++) { $value = Tools::getValue('right_' . $this->model->getId() . '_' . $nb . '_' . $this->wich_template); $content = str_replace('%right_' . $nb . '%', $value, $content); if ($save) { Tools::getValue('right_' . $this->model->getId() . '_' . $nb . '_' . $this->wich_template); $this->saveColumn('right', $nb, $value); } } } // Replace all content in center column private function editCenter(&$content, $save = true) { for ($nb = 1; $nb <= $this->model->getTxtsCenter(); $nb++) { $value = Tools::getValue('center_' . $this->model->getId() . '_' . $nb . '_' . $this->wich_template); $content = str_replace('%center_' . $nb . '%', $value, $content); if ($save) { $this->saveColumn('center', $nb, Tools::getValue('center_' . $nb . '_' . $this->wich_template)); } } } // Replace all colors private function editColors(&$content, $save = true) { for ($nb = 1; $nb <= $this->model->getColors(); $nb++) { $value = Tools::getValue('color_picker_' . $this->model->getId() . '_' . $nb . '_' . $this->wich_template); $content = str_replace('%color_' . $nb . '%', $value, $content); if ($save) { $value = Tools::getValue('color_picker_' . (int)$this->model->getId() . '_' . (int)$nb . '_' . (int)$this->wich_template); Db::getInstance()->Execute(" DELETE FROM " . _DB_PREFIX_ . "cartabandonment_template_color WHERE id_template = " . (int) $this->id_template); Db::getInstance()->Execute(" INSERT INTO " . _DB_PREFIX_ . "cartabandonment_template_color VALUES (NULL, " . (int) $this->id_template . ", " . (int)$nb . ", '" . pSQL($value) . "')"); } } } // Save One column in database private function saveColumn($column, $id_field, $value) { if (!isset($column) || !isset($id_field) || !isset($value)) { return false; } return Db::getInstance()->Execute(" INSERT INTO " . _DB_PREFIX_ . "cartabandonment_template_field VALUES (NULL, " . (int) $this->id_template . ", " . (int)$id_field . ", '" . (int)$value . "', '" . pSQL($column) . "')"); } public static function editTemplate($content, $reminder = null, $id_cart = null, $id_lang = null, $id_shop = null) { $lang_default = Configuration::get('PS_LANG_DEFAULT'); if (is_null($id_lang)) { $id_lang = $lang_default; } if (is_null($id_shop)) { $id_shop = Context::getContext()->shop->id; } if (!$id_cart) { $id_cart = Db::getInstance()->getValue(' SELECT id_cart FROM '._DB_PREFIX_.'cart_product ORDER BY id_cart DESC'); } $cart = new Cart($id_cart); $id_currency = $cart->id_currency; $currency = new Currency($id_currency); $sign_currency = $currency->sign; if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { $context = Context::getContext(); $context->cart = $cart; } if (!Validate::isLoadedObject($cart)) { return false; } $products = $cart->getProducts(true); if (!$products || empty($products)) { return false; } if (strpos($content, '%CART_PRODUCTS%')) { foreach ($products as &$product) { $product['img'] = CartAbandonmentProTemplate::getImage( $product['id_product'], $product['id_product_attribute'], $id_lang ); $product['link'] = Context::getContext()->link->getProductLink( $product['id_product'], $product['link_rewrite'] ); $product['price_with_tax'] = number_format(Product::getPriceStatic($product['id_product'], true, $product['id_product_attribute'], 6, null, false, true, 1, true, null, $id_cart), 2); $product['test2'] = Product::getPriceStatic($product['id_product'], 1, $product['id_product_attribute'], 2, null, 0, 0); $product['test3'] = Product::getPriceStatic($product['id_product'], 0, $product['id_product_attribute'], 2, null, 0, 0); } Context::getContext()->smarty->assign(array( 'products' => $products, 'sign' => $sign_currency, )); // Little hack to allow template override $module = Module::getInstanceByName('cartabandonmentpro'); $html = $module->display(getcwd().'/'.$module->name.'.php', 'views/templates/admin/email_products.tpl'); $content = str_replace('%CART_PRODUCTS%', $html, $content); } if (is_null($id_cart)) { $customer = array( 'firstname' => 'John', 'lastname' => 'Doe', 'id_lang' => $id_lang, 'gender_name' => 'M.' ); } else { $customer = Db::getInstance()->getRow(' SELECT c.firstname, c.lastname, c.id_lang, gl.name as gender_name FROM `' . _DB_PREFIX_ . 'cart` ca LEFT JOIN ' . _DB_PREFIX_ . 'customer c ON ca.id_customer = c.id_customer LEFT JOIN ' . _DB_PREFIX_ . 'gender_lang gl ON c.id_gender = gl.id_gender WHERE ca.id_cart = ' . (int)$id_cart . ' AND c.id_lang = ' . (int)$id_lang); } $shopName = Db::getInstance()->getValue(' SELECT `name` FROM '._DB_PREFIX_.'shop WHERE `id_shop` = '.(int)$id_shop); $content = str_replace('%SHOP_NAME%', $shopName, $content); $content = str_replace('%FIRSTNAME%', $customer['firstname'], $content); $content = str_replace('%LASTNAME%', $customer['lastname'], $content); $content = str_replace('%GENDER%', $customer['gender_name'], $content); $params = array( 'token_cart' => md5(_COOKIE_KEY_.'recover_cart_'.(int)$id_cart), 'id_cart' => (int)$id_cart, 'action' => 'redirect' ); if ($reminder) { $params['wichRemind'] = (int)$reminder; } $module_url = Context::getContext()->link->getModuleLink( 'cartabandonmentpro', 'FrontCartAbandonment', array(), true ).'?'; /* REPLACE %SHOP_LINK% + retro compat */ $params['link'] = 'shop'; $shop_url = $module_url.http_build_query($params); $content = str_replace('%SHOP_LINK%', $shop_url, $content); $content = str_replace('%SHOP_LINK_OPEN%', '', $content); $content = str_replace('%SHOP_LINK_CLOSE%', '', $content); /* REPLACE %CART_LINK% + retro compat */ $params['link'] = 'cart'; $cart_url = $module_url.http_build_query($params); $content = str_replace('%CART_LINK%', $cart_url, $content); $content = str_replace('%CART_LINK_OPEN%', '', $content); $content = str_replace('%CART_LINK_CLOSE%', '', $content); /* REPLACE %%UNSUBSCRIBE_LINK%% + retro compat */ $params['link'] = 'unsubscribe'; $unsubscribeUrl = $module_url.http_build_query($params); $content = str_replace('%UNSUBSCRIBE_LINK%', $unsubscribeUrl, $content); $content = str_replace('%UNUBSCRIBE_OPEN%', '', $content); $content = str_replace('%UNUBSCRIBE_CLOSE%', '', $content); $content = str_replace('%UNSUBSCRIBE_OPEN%', '', $content); $content = str_replace('%UNSUBSCRIBE_CLOSE%', '', $content); /* Add image to track if email is opened, only if it's not a test */ if (!is_null($id_cart)) { $visualizeUrl = Context::getContext()->link->getModuleLink( 'cartabandonmentpro', 'FrontCartAbandonment', array(), true ); $params['action'] = 'visualize'; unset($params['link']); $content = ' ' . $content; } return $content; } public static function editTitleBeforeSending($title, $id_cart = null, $id_lang = 1) { if (is_null($id_lang)) { $id_lang = Configuration::get('PS_LANG_DEFAULT'); } $query = ' SELECT c.firstname, c.lastname, gl.name as gender_name FROM `' . _DB_PREFIX_ . 'cart` ca JOIN ' . _DB_PREFIX_ . 'customer c ON ca.id_customer = c.id_customer LEFT JOIN ' . _DB_PREFIX_ . 'gender_lang gl ON c.id_gender = gl.id_gender'; if (is_null($id_cart)) { $query .= ' LIMIT 1'; } else { $query .= ' WHERE ca.id_cart = ' . (int) $id_cart; } $products = Db::getInstance()->ExecuteS($query); $title = str_replace('%FIRSTNAME%', $products[0]['firstname'], $title); $title = str_replace('%LASTNAME%', $products[0]['lastname'], $title); $title = str_replace('%GENDER%', $products[0]['gender_name'], $title); return $title; } public static function editDiscount($voucher, $content, $id_lang, $id_shop) { $value = false; $type = ''; if ($voucher->reduction_percent > 0) { $value = $voucher->reduction_percent; $discount_txt = Configuration::get('CARTABAND_DISC_VAL', $id_lang, null, $id_shop); $type = "%"; } elseif ($voucher->reduction_amount > 0) { $value = $voucher->reduction_amount; $discount_txt = Configuration::get('CARTABAND_DISC_VAL', $id_lang, null, $id_shop); $type = Currency::getDefaultCurrency()->sign; } else { $discount_txt = Configuration::get('CARTABAND_SHIPP_VAL', $id_lang, null, $id_shop); } $dates = explode(' ', $voucher->date_to); $dates = explode('-', $dates[0]); $discount_txt = str_replace('%DISCOUNT_VALUE%', $value . ' ' . $type, $discount_txt); $discount_txt = str_replace('%DISCOUNT_VALID_DAY%', $dates[2], $discount_txt); $discount_txt = str_replace('%DISCOUNT_VALID_MONTH%', $dates[1], $discount_txt); $discount_txt = str_replace('%DISCOUNT_VALID_YEAR%', $dates[0], $discount_txt); $discount_txt = str_replace('%DISCOUNT_CODE%', $voucher->code, $discount_txt); $content = str_replace('%DISCOUNT_TXT%', $discount_txt, $content); return $content; } private static function getImage($id_product, $id_product_attribute, $id_lang) { $product = new Product((int)$id_product); $link = new Link(); $numblink = 0; while (empty($product->link_rewrite[$numblink])) { $numblink += 1; } $link_rewrite = $product->link_rewrite[$numblink]; $product_link = $link->getProductLink($id_product, $link_rewrite, null, null, null, null, $id_product_attribute) ; $id_image = Image::getImages($id_lang, $id_product, $id_product_attribute); if (empty($id_image)) { $id_image = Image::getCover($id_product); $id_image = $id_image['id_image']; } else { $id_image = $id_image[0]['id_image']; } if (version_compare(_PS_VERSION_, '1.7', '>=')) { $image_link = $link->getImageLink($link_rewrite, $id_image, ImageType::getFormattedName('small')); } else { $image_link = $link->getImageLink($link_rewrite, $id_image, ImageType::getFormatedName('small')); } return $image_link; } public function setWichTemplate($val) { $this->wich_template = $val; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } }