=') ? ImageType::getFormattedName($type) : ImageType::getFormatedName($type); } public static function formatFileName($file_name) { return preg_match('/[\_\(\)\s\%\+]+/', '-', $file_name); } public static function formatBytes($bytes, $precision = 2) { $units = array('B', 'KB', 'MB', 'GB', 'TB'); $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); // Uncomment one of the following alternatives $bytes /= pow(1024, $pow); return round($bytes, $precision) . ' ' . $units[$pow]; } public static function getServerVars($var) { return isset($_SERVER[$var]) ? $_SERVER[$var] : ''; } public static function getPostMaxSizeBytes() { $postMaxSizeList = array(@ini_get('post_max_size'), @ini_get('upload_max_filesize'), (int)Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') . 'M'); $ik = 0; foreach ($postMaxSizeList as &$max_size) { $bytes = (int)trim($max_size); $last = Tools::strtolower($max_size[Tools::strlen($max_size) - 1]); switch ($last) { case 'g': $bytes *= 1024; case 'm': $bytes *= 1024; case 'k': $bytes *= 1024; } if ($bytes == '') { unset($postMaxSizeList[$ik]); } else $max_size = $bytes; $ik++; } return min($postMaxSizeList); } public static function quickSort($list, $field = 'position', $ignore_value = -1) { $left = $right = array(); if (count($list) <= 1) { return $list; } $pivot_key = key($list); $pivot = array_shift($list); // partial: foreach ($list as $key => $val) { if ($val[$field] <= $pivot[$field]) { $left[$key] = $val; } elseif ($val[$field] > $pivot[$field]) { $right[$key] = $val; } } // recursive: return array_merge(self::quickSort($left, $field, $ignore_value), array($pivot_key => $pivot), self::quickSort($right, $field, $ignore_value)); } // DB: public static function tableExist($table) { return Db::getInstance()->executeS('SHOW TABLES LIKE \'' . _DB_PREFIX_ . bqSQL($table) . '\''); } public function runCronjob($token) { Configuration::updateGlobalValue('ETS_RV_LAST_CRONJOB', date('Y-m-d H:i:s'), true); if (!$token || !Validate::isCleanHtml($token) || $token != Configuration::getGlobalValue('ETS_RV_SECURE_TOKEN')) { if (Tools::isSubmit('ajax')) { die(json_encode(array( 'errors' => $this->l('Access denied'), 'result' => '' ))); } die($this->l('Access denied')); } $nbCartRule = 0; if (Configuration::getGlobalValue('ETS_RV_AUTO_CLEAR_DISCOUNT')) { $nbCartRule = EtsRVCartRule::clearDiscountIsExpired(); } $module = Module::getInstanceByName('ets_reviews'); $count = 0; $fail = 0; $max_try = ($max = (int)Configuration::getGlobalValue('ETS_RV_CRONJOB_MAX_TRY')) && $max > 0 && Validate::isUnsignedInt($max) ? $max : 5; $max_emails = ($limit = (int)Configuration::getGlobalValue('ETS_RV_CRONJOB_EMAILS')) && $limit > 0 && Validate::isUnsignedInt($limit) ? $limit : 5; $context = Context::getContext(); if ($queues = Db::getInstance()->executeS(' SELECT * FROM `' . _DB_PREFIX_ . 'ets_rv_email_queue` WHERE to_email is NOT NULL AND (schedule_time is NULL OR schedule_time <= 0 OR schedule_time <= ' . time() . ' ) AND ((sent = 0 AND send_count < ' . (int)$max_try . ') OR sending_time is NULL OR TIMESTAMPDIFF(SECOND, sending_time, \'' . pSQL(date('Y-m-d H:i:s')) . '\') > 60) LIMIT ' . (int)$max_emails )) { foreach ($queues as $queue) { if (EtsRVUnsubscribe::isUnsubscribe($queue['to_email'])) { Db::getInstance()->execute('DELETE FROM `' . _DB_PREFIX_ . 'ets_rv_email_queue` WHERE to_email=\'' . pSQL($queue['to_email']) . '\''); continue; } if (Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'ets_rv_email_queue` SET `sent` = 1, `sending_time` = \'' . pSQL(date('Y-m-d H:i:s')) . '\' WHERE `id_ets_rv_email_queue` = ' . (int)$queue['id_ets_rv_email_queue'])) { $templateVars = json_decode($queue['template_vars'], true); if (isset($queue['content']) && trim($queue['content']) !== '') $templateVars['{content}'] = $queue['content']; EtsRVTools::getInstance()->replaceShortCode($templateVars, (int)$queue['id_lang']); EtsRVMailLog::writeLog($queue, EtsRVMailLog::SEND_MAIL_TIMEOUT); if (($delivered = Mail::send( (int)$queue['id_lang'], trim($queue['template']), $queue['subject'], $templateVars, trim($queue['to_email']), trim($queue['to_name']), null, null, null, null, $module->getLocalPath() . 'mails/', false, (int)$queue['id_shop'] )) || (int)Db::getInstance()->getValue('SELECT `send_count` FROM `' . _DB_PREFIX_ . 'ets_rv_email_queue` WHERE `id_ets_rv_email_queue` = ' . (int)$queue['id_ets_rv_email_queue']) > $max_try ) { EtsRVMailLog::writeLog($queue, EtsRVMailLog::SEND_MAIL_DELIVERED); if ($delivered) { Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'ets_rv_tracking` SET `delivered` = 1, date_upd=\'' . pSQL(date('Y-m-d H:i:s')) . '\' WHERE `queue_id` = ' . (int)$queue['id_ets_rv_email_queue']); $count++; } Db::getInstance()->execute('DELETE FROM `' . _DB_PREFIX_ . 'ets_rv_email_queue` WHERE `id_ets_rv_email_queue` = ' . (int)$queue['id_ets_rv_email_queue']); } else { $fail++; EtsRVMailLog::writeLog($queue, EtsRVMailLog::SEND_MAIL_FAILED); Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'ets_rv_email_queue` SET `sent` = 0, `send_count` = `send_count` + 1, `sending_time` = \'' . pSQL(date('Y-m-d H:i:s')) . '\' WHERE `id_ets_rv_email_queue` = ' . (int)$queue['id_ets_rv_email_queue']); } } } } Db::getInstance()->execute('DELETE FROM `' . _DB_PREFIX_ . 'ets_rv_email_queue` WHERE send_count >= ' . (int)$max_try . ' OR to_email is NULL'); if ((int)Configuration::getGlobalValue('ETS_RV_SAVE_CRONJOB_LOG')) { $return = '[' . date($context->language->date_format_full) . ']'; if ($count > 0) $return .= ' ' . sprintf($this->l('There were %d email(s) sent successfully'), $count); elseif ($fail <= 0) $return .= ' ' . $this->l('No email has been sent'); if ($fail > 0) $return .= ($count > 0 ? ' | ' : ' ') . sprintf($this->l('Sent failed %d email(s)'), $fail); if ($nbCartRule) { $return .= ' | ' . sprintf($this->l('%s discount deleted'), $nbCartRule); } else { $return .= ' | ' . $this->l('No discount deleted'); } $dest = _PS_ROOT_DIR_ . '/var/logs/'; if (!@is_dir($dest)) @mkdir($dest, 0755, true); @file_put_contents($dest . $module->name . '.cronjob.log', $return . PHP_EOL, FILE_APPEND); } $jsonArr = array( 'result' => $this->l('Cronjob ran successfully') . ' ' . ($count <= 0 ? ($nbCartRule <= 0 && $fail <= 0 ? '. ' . $this->l('Nothing to do!') : '') : sprintf($this->l('%s email(s) was sent!'), $count)) . ($fail > 0 ? ($count > 0 ? ' | ' : '. ') . sprintf($this->l('Sent failed %d email(s)'), $fail) : '') . ($nbCartRule > 0 ? ' | ' . sprintf($this->l('%s discount deleted'), $nbCartRule) : ''), ); if (isset($return)) { $jsonArr['log'] = $return; } die(json_encode($jsonArr)); } public static function getCustomers($ids = array()) { if (!$ids || !Validate::isArrayWithIds($ids) ) { return false; } $dq = new DbQuery(); $dq ->select('*') ->from('customer', 'c') ->where('id_customer IN (' . implode(',', $ids) . ')'); return Db::getInstance()->executeS($dq); } public static function hasProductComments() { if (Db::getInstance()->executeS('SHOW TABLES LIKE \'' . _DB_PREFIX_ . 'product_comment\'')) { $dq = new DbQuery(); $dq ->select('COUNT(*)') ->from('product_comment', 'pc'); return (int)Db::getInstance()->getValue($dq); } return false; } /** * @param $type * @return bool * Write a review */ public static function reviewGrand($type) { if (trim($type) == '') return false; $options = explode(',', trim(Configuration::get('ETS_RV_WHO_POST_REVIEW'))); return is_array($options) && in_array($type, $options) ? 1 : 0; } public static function isCustomerPurchased() { $options = explode(',', trim(Configuration::get('ETS_RV_WHO_POST_REVIEW'))); return count($options) == 1 && trim($options[0]) == 'purchased' || Configuration::get('ETS_RV_FREE_DOWNLOADS_ENABLED') && count($options) == 2 && in_array('purchased', $options) && in_array('no_purchased_incl', $options); } /** * @param $type * @return bool * Rating a review */ public static function ratingGrand($type) { if (trim($type) == '') return false; $who_can_rate = explode(',', trim(Configuration::get('ETS_RV_WHO_POST_RATING'))); return is_array($who_can_rate) && in_array($type, $who_can_rate) ? 1 : 0; } static $cache_subject = []; public function getSubjects($template = null) { if (!self::$cache_subject) { self::$cache_subject = [ 'person_dislike' => [ 'og' => '{from_person_name} disliked your {object}', 't' => $this->l('{from_person_name} disliked your {object}', 'EtsRVTools'), 'desc' => $this->l('Notification email when a user clicks "dislike" for your object (reviews, comments, questions, etc.)', 'EtsRVTools'), ], 'person_like' => [ 'og' => '{from_person_name} liked your {object}', 't' => $this->l('{from_person_name} liked your {object}', 'EtsRVTools'), 'desc' => $this->l('Notification email when a user clicks "like" for your object (reviews, comments, questions, etc.)', 'EtsRVTools'), ], 'person_reported' => [ 'og' => '{from_person_name} reported your {object}', 't' => $this->l('{from_person_name} reported your {object}', 'EtsRVTools'), 'desc' => $this->l('Notification email when a user clicks "report" for your object (reviews, comments, questions, etc.)', 'EtsRVTools'), ], 'person_commented' => [ 'og' => '{from_person_name} commented on your {object}', 't' => $this->l('{from_person_name} commented on your {object}'), 'desc' => $this->l('Notification email when a user commented on your object (reviews, comments, questions, etc.)', 'EtsRVTools'), ], 'person_replied' => [ 'og' => '{from_person_name} replied to your {object}', 't' => $this->l('{from_person_name} replied to your {object}'), 'desc' => $this->l('Notification email when a user replied to your object (reviews, comments, questions, etc.)', 'EtsRVTools'), ], 'person_answer' => [ 'og' => '{from_person_name} answered to your question', 't' => $this->l('{from_person_name} answered to your question', 'EtsRVTools'), 'desc' => $this->l('Notification email when a user answered to your question', 'EtsRVTools'), ], // Customer|Admin 'tocustomer_awaiting' => [ 'og' => 'Your {object} has been submitted and is waiting for approval', 't' => $this->l('Your {object} has been submitted and is waiting for approval', 'EtsRVTools'), 'desc' => $this->l('Notification email send to customers when their object (reviews, comments, questions, etc.) has been submitted and is waiting for approval', 'EtsRVTools'), ], 'toadmin_awaiting' => [ 'og' => '{customer_name} submitted {object}. Please review it.',//[a/an] 't' => $this->l('{customer_name} submitted {object}. Please review it.', 'EtsRVTools'), 'desc' => $this->l('Notification email send to admin when an object (reviews, comments, questions, etc.) of customers has been submitted and is waiting for approval', 'EtsRVTools'), ], 'tocustomer_approved' => [ 'og' => 'Your {object} has been approved and published.', 't' => $this->l('Your {object} has been approved and published.', 'EtsRVTools'), 'desc' => $this->l('Notification email send to customers when their object (reviews, comments, questions, etc.) has been approved and published', 'EtsRVTools'), ], 'tocustomer_get_voucher' => [ 'og' => 'You got a voucher code from {shop_name}', 't' => $this->l('You got a voucher code from {shop_name}', 'EtsRVTools'), 'desc' => $this->l('Notification email send to customers when they receive a voucher code after leaving a review', 'EtsRVTools'), ], 'tocustomer_rating_invitation' => [ 'og' => 'Are you satisfied with “{product_name}”?', 't' => $this->l('Are you satisfied with “{product_name}”?', 'EtsRVTools'), 'desc' => $this->l('Notification email send to customers to invite them leaving a review', 'EtsRVTools'), ], 'tocustomer_rating_invitation_getvoucher' => [ 'og' => 'Are you satisfied with “{product_name}”? Rate now to get a voucher code', 't' => $this->l('Are you satisfied with “{product_name}”? Rate now to get a voucher code', 'EtsRVTools'), 'desc' => $this->l('Notification email send to customers to invite them leaving a review and receive a voucher', 'EtsRVTools'), ], ]; } return $template != null && isset(self::$cache_subject[$template]) ? self::$cache_subject[$template] : ($template == null ? self::$cache_subject : []); } public function initEmailTemplate() { $subjects = $this->getSubjects(); $partialQueries = []; foreach (array_keys($subjects) as $template) { $partialQueries[] = '(\'' . pSQL($template) . '\')'; } $res = Db::getInstance()->execute('TRUNCATE TABLE `' . _DB_PREFIX_ . 'ets_rv_email_template`'); $res &= Db::getInstance()->execute('TRUNCATE TABLE `' . _DB_PREFIX_ . 'ets_rv_email_template_shop`'); $res &= Db::getInstance()->execute('TRUNCATE TABLE `' . _DB_PREFIX_ . 'ets_rv_email_template_lang`'); if ($partialQueries) $res &= Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'ets_rv_email_template` (`template`) VALUES' . implode(',', $partialQueries)); if ($res) { $idShop = Configuration::get('PS_SHOP_DEFAULT'); $res &= Db::getInstance()->execute(' INSERT INTO `' . _DB_PREFIX_ . 'ets_rv_email_template_shop`(`id_ets_rv_email_template`, `id_shop`) SELECT et.id_ets_rv_email_template, IFNULL(shop.id_shop, ' . (int)$idShop . ') FROM `' . _DB_PREFIX_ . 'ets_rv_email_template` et CROSS JOIN `' . _DB_PREFIX_ . 'shop` shop '); $res &= Db::getInstance()->execute(' INSERT INTO `' . _DB_PREFIX_ . 'ets_rv_email_template_lang`(`id_ets_rv_email_template`, `id_lang`, `id_shop`, `subject`) SELECT et.id_ets_rv_email_template, IFNULL(lang.id_lang, 0), IFNULL(shop.id_shop, ' . (int)$idShop . '), \'\' `subject` FROM `' . _DB_PREFIX_ . 'ets_rv_email_template` et CROSS JOIN `' . _DB_PREFIX_ . 'lang` lang CROSS JOIN `' . _DB_PREFIX_ . 'shop` shop '); $templates = Db::getInstance()->executeS(' SELECT etl.*, et.template, l.iso_code FROM `' . _DB_PREFIX_ . 'ets_rv_email_template_lang` etl INNER JOIN `' . _DB_PREFIX_ . 'ets_rv_email_template` et ON (et.id_ets_rv_email_template = etl.id_ets_rv_email_template) INNER JOIN `' . _DB_PREFIX_ . 'lang` l ON (l.id_lang = etl.id_lang) '); if (count($templates) > 0) { $sql = 'UPDATE `' . _DB_PREFIX_ . 'ets_rv_email_template_lang` SET '; $queries = []; foreach ($templates as $template) { if (isset($template['template']) && trim($template['template']) !== '' && isset($subjects[trim($template['template'])]) && ($subject = $subjects[trim($template['template'])])) { $text = self::trans($subject['og'], trim($template['iso_code']), 'EtsRVTools') ?: $subject['og']; $queries[] = $sql . '`subject`=\'' . pSQL($text) . '\' WHERE `id_ets_rv_email_template`=' . (int)$template['id_ets_rv_email_template'] . ' AND `id_lang`=' . (int)$template['id_lang'] . ' AND `id_shop`=' . (int)$template['id_shop']; } } if ($queries) { foreach ($queries as $query) { $res &= Db::getInstance()->execute($query); } } } } return $res; } public function upgradeActivities() { $activities = [ // Review 'wrote_a_review_for_product' => '#wr(o|i)te a review (for|to) product(.*)#', // #write a review to product# 'liked_a_review' => '#like(d|.*) (a|to) review(.*)#', //#like to review(.*)# 'disliked_a_review' => '#dislike(d|.*) (a|to) review(.*)#', //#dislike to review# 'reported_a_review' => '#report(ed|.*) (a|to) review(.*)#', //#report to review# // Comment of review 'commented_on_a_review' => '#comment(ed|.*) (on a|to) review(.*)#', //#comment to review# 'reported_a_comment' => '#report(ed|.*) (an|to) comment(.*)#', //#report to comment# 'liked_a_comment' => '#like(d|.*) (a|to) comment(.*)#', //#like to comment# 'disliked_a_comment' => '#dislike(d|.*) (a|to) comment(.*)#', //#dislike to comment# // Reply 'replied_to_a_comment' => '#replied to a comment(.*)#', //#replied to a comment# 'reported_a_reply' => '#report(ed|.*) (a|to) reply(.*)#', 'liked_a_reply' => '#like(d|.*) (a|to) reply(.*)#', 'disliked_a_reply' => '#dislike(d|.*) (a|to) reply(.*)#', // Question 'asked_a_question_about_product' => '#ask(ed|.*) a question (about|to|on) product(.*)#', //#ask a question to product# 'liked_a_question' => '#like(d|.*) (to|a) question(.*)#', //#like to question# 'disliked_a_question' => '#dislike(d|.*) (to|a) question(.*)#', //#dislike to question# 'reported_a_question' => '#report(ed|.*) (a|to) question(.*)#', //#report to question# // Comment of question 'commented_on_a_question' => '#comment(ed|.*) (on a|to) question(.*)#', //#comment to question# 'reported_comment_of_question' => '#report(ed|.*) (a|to) comment( on a question|.*)(.*)#', //#report to comment# 'liked_comment_of_question' => '#like(d|.*) (a|to) comment( on a question|.*)(.*)#', 'disliked_comment_of_question' => '#dislike(d|.*) (a|to) comment( on a question|.*)(.*)#', // Answer 'answered_to_a_question' => '#answer(ed|.*) to( a|.*) question(.*)#', //#answer to question# 'disliked_an_answer' => '#dislik(ed|.*) (to|an) answer(.*)#', //#dislike to answer# 'liked_an_answer' => '#like(d|.*) (an|to) answer(.*)#', //#like to answer# 'reported_an_answer' => '#report(ed|.*) (an|to) answer(.*)#', //#report to answer# // Comment of answer 'commented_on_an_answer' => '#comment(ed|.*) (on|to) (a|an) answer(.*)#', //#commented to a answer# 'reported_a_comment_answer' => '#report(ed|.*) (a|to) comment(.*)#', 'liked_a_comment_answer' => '#like(d|.*) (a|to) comment(.*)#', 'disliked_a_comment_answer' => '#dislike(d|.*) (a|to) comment(.*)#', ]; $sql = []; foreach ($activities as $key => $activity) { if ($activity) { $query = 'UPDATE `' . _DB_PREFIX_ . 'ets_rv_activity` SET `content`=\'' . pSQL($key) . '\' WHERE 1'; if (is_array($activity) && count($activity) > 1) { $orWhere = []; foreach ($activity as $regex) { $orWhere[] = '`content` REGEXP \'' . $regex . '\''; } $query .= ' AND (' . implode(' OR ', $orWhere) . ')'; } else $query .= ' AND `content` REGEXP \'' . (is_array($activity) ? $activity[0] : $activity) . '\''; $sql[] = $query; } } if ($sql) { foreach ($sql as $qr) { Db::getInstance()->execute($qr); } } return true; } public function replaceShortCode(&$vars, $idLang = null) { if ($idLang == null) $idLang = Context::getContext()->language->id; $vars['{tracking}'] = isset($vars['{tracking}']) && trim($vars['{logo_img}']) !== '' ? $this->display('shortcode.tpl', ['shortcode' => 'tracking', 'tracking' => $vars['{tracking}']]) : ''; $vars['{logo_img}'] = isset($vars['{logo_img}']) && trim($vars['{logo_img}']) !== '' ? $this->display('shortcode.tpl', ['shortcode' => 'logo_img', 'shop_logo' => $vars['{logo_img}']]) : ''; if (isset($vars['{product_list}'])) { $ETS_RV_MAIL_RATE_NOW_TEXT = Configuration::get('ETS_RV_MAIL_RATE_NOW_TEXT', $idLang) ?: $this->l('Rate now', 'EtsRVTools'); $vars['{product_list}'] = $this->display('mail-product-list.tpl', ['products' => $vars['{product_list}'], 'ETS_RV_MAIL_RATE_NOW_TEXT' => $ETS_RV_MAIL_RATE_NOW_TEXT]); } if (!empty($vars['{product}'])) $vars['{product}'] = $this->display('product-info.tpl', $vars['{product}']); if (isset($vars['{product_name}']) && !empty($vars['{product_link}'])) { $vars['{product_name}'] = EtsRVTools::displayText(EtsRVTools::displayText($vars['{product_name}'], 'span'), 'a', ['href' => $vars['{product_link}']]); } if (!empty($vars['{unsubscribe}'])) { $ETS_RV_MAIL_UNSUBSCRIBE_TEXT = Configuration::get('ETS_RV_MAIL_UNSUBSCRIBE_TEXT', $idLang) ?: $this->l('Unsubscribe', 'EtsRVTools'); $vars['{unsubscribe}'] = EtsRVTools::displayText($ETS_RV_MAIL_UNSUBSCRIBE_TEXT, 'a', ['href' => $vars['{unsubscribe}']]); } if (isset($vars['{content}']) && $vars['{content}']) $vars['{content}'] = Tools::nl2br($vars['{content}']); } public function checkUploadError($error_code, $file_name) { switch ($error_code) { case 1: return sprintf($this->l('File "%1s" uploaded exceeds %2s', 'EtsRVTools'), $file_name, ini_get('upload_max_filesize')); case 2: return sprintf($this->l('The uploaded file exceeds %s', 'EtsRVTools'), ini_get('post_max_size')); case 3: return sprintf($this->l('Uploaded file "%s" was only partially uploaded', 'EtsRVTools'), $file_name); case 6: return $this->l('Missing temporary folder', 'EtsRVTools'); case 7: return sprintf($this->l('Failed to write file "%s" to disk', 'EtsRVTools'), $file_name); case 8: return sprintf($this->l('A PHP extension stopped the file "%s" to upload', 'EtsRVTools'), $file_name); } return false; } public function processUploadImage($field, $folder, &$errors, $required = false, $label = null, $destinationWidth = null, $destinationHeight = null, &$error_post_maxsize = false) { if (count($errors) > 0) return []; $file_dest = _PS_IMG_DIR_ . 'ets_reviews/' . ($folder !== '' ? $folder : 'a') . '/'; if (!is_dir($file_dest)) $errors[] = sprintf($this->l('The directory "%s" does not exist.', 'EtsRVTools'), $file_dest); $post_content_size = EtsRVTools::getServerVars('CONTENT_LENGTH'); if (($post_max_size = EtsRVTools::getPostMaxSizeBytes()) && ($post_content_size > $post_max_size)) { $errors[] = sprintf($this->l('The uploaded file(s) exceeds the post_max_size directive in php.ini (%s > %s)', 'EtsRVTools'), EtsRVTools::formatBytes($post_content_size), EtsRVTools::formatBytes($post_max_size)); $error_post_maxsize = true; } elseif (!@is_writable($file_dest) && !empty($_FILES[$field]['name'])) { $errors[] = sprintf($this->l('The directory "%s" is not writable.', 'EtsRVTools'), $file_dest); } elseif (isset($_FILES[$field]) && !empty($_FILES[$field]['name'])) { if ($uploadError = $this->checkUploadError($_FILES[$field]['error'], $_FILES[$field]['name'])) { $errors[] = $uploadError; } elseif ($_FILES[$field]['size'] > $post_max_size) { $errors[] = sprintf($this->l('File is too large. Maximum size allowed: %sMb', 'EtsRVTools'), EtsRVTools::formatBytes($post_max_size)); } elseif ($_FILES[$field]['size'] > Ets_reviews::DEFAULT_MAX_SIZE) { $errors[] = sprintf($this->l('File is too big. Current size is %1s, maximum size is %2s.', 'EtsRVTools'), $_FILES[$field]['size'], Ets_reviews::DEFAULT_MAX_SIZE); } elseif (isset($_FILES[$field]['name'])) { $type = Tools::strtolower(Tools::substr(strrchr($_FILES[$field]['name'], '.'), 1)); if (!in_array($type, array('jpg', 'gif', 'jpeg', 'png'))) { $errors[] = sprintf($this->l('File "%s" type is not allowed', 'EtsRVTools'), $_FILES[$field]['name']); } } } if ($required && (isset($_FILES[$field]['name']) || empty($_FILES[$field]['name']))) { $errors[] = $label . ' ' . $this->l('is required', 'EtsRVTools'); } if (!$errors && !empty($_FILES[$field]['name'])) { $salt = Tools::strtolower(Tools::passwdGen(20)); $type = Tools::strtolower(Tools::substr(strrchr($_FILES[$field]['name'], '.'), 1)); $image = $salt . '.' . $type; $file_name = $file_dest . $image; if (@file_exists($file_name)) { $errors[] = $this->l('File name already exists. Try to rename the file and upload again', 'EtsRVTools'); } else { $image_size = @getimagesize($_FILES[$field]['tmp_name']); if (isset($_FILES[$field]) && !empty($_FILES[$field]['tmp_name']) && !empty($image_size) && in_array($type, array('jpg', 'gif', 'jpeg', 'png'))) { if (!($temp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS')) || !@move_uploaded_file($_FILES[$field]['tmp_name'], $temp_name)) { $errors[] = $this->l('An error occurred while uploading the image.', 'EtsRVTools'); } elseif (!@ImageManager::resize($temp_name, $file_name, $destinationWidth, $destinationHeight, $type)) $errors[] = sprintf($this->l('An error occurred while copying this image: %s', 'EtsRVTools'), Tools::stripslashes($image)); } if (isset($temp_name) && file_exists($temp_name)) @unlink($temp_name); } if (!$errors) { return [ $image, $file_dest, $file_name ]; } } return []; } public static function ajaxSearchCustomer($q) { $query = $q && Validate::isCleanHtml($q) ? $q : false; if (!$query or $query == '' or Tools::strlen($query) < 1) { die(); } $searches = explode(' ', $query); $searches = array_unique($searches); foreach ($searches as $search) { if (!empty($search) && $results = Customer::searchByName($search, 50)) { foreach ($results as $result) { $customer = []; if ($result['active']) { $customer = [ $result['id_customer'], $result['firstname'], $result['lastname'], $result['email'], ]; } echo implode('|', $customer) . "\r\n"; } } } die; } public static function getVariables($template) { if (empty($template)) return []; switch ($template) { case 'person_like': case 'person_dislike': case 'person_reported': return [ '{shop_name}', '{person_name}', '{from_person_name}', '{object}', '{product_name}', '{content}', '{unsubscribe}', ]; case 'person_commented': case 'person_replied': return [ '{shop_name}', '{person_name}', '{from_person_name}', '{object}', '{product_name}', '{object_content}', '{content}', '{unsubscribe}', ]; case 'person_answer': return [ '{shop_name}', '{person_name}', '{from_person_name}', '{object}', '{product_name}', '{question_content}', '{content}', '{unsubscribe}', ]; case 'toadmin_awaiting': return [ '{shop_name}', '{admin_name}', '{customer_name}', '{object}', '{content}', '{product}', '{unsubscribe}', ]; case 'tocustomer_awaiting': case 'tocustomer_approved': return [ '{shop_name}', '{customer_name}', '{object}', '{product_name}', '{content}', '{unsubscribe}', ]; case 'tocustomer_get_voucher': return [ '{shop_name}', '{customer_name}', '{voucher_code}', '{voucher_value}', '{unsubscribe}', ]; case 'tocustomer_rating_invitation': return [ '{shop_name}', '{customer_name}', '{product_list}', '{unsubscribe}', ]; case 'tocustomer_rating_invitation_getvoucher': return [ '{shop_name}', '{customer_name}', '{product_list}', '{voucher_value}', '{unsubscribe}', ]; default: return []; } } public static function getShortCodesInSubject($template) { if (!$template || !Validate::isCleanHtml($template)) { return []; } switch ($template) { case 'person_like': case 'person_dislike': case 'person_reported': case 'person_commented': case 'person_replied': return [ '{from_person_name}', '{object}', ]; case 'person_answer': return [ '{from_person_name}', ]; case 'toadmin_awaiting': return [ '{customer_name}', '{object}', ]; case 'tocustomer_awaiting': case 'tocustomer_approved': return [ '{object}', ]; case 'tocustomer_get_voucher': return [ '{shop_name}', ]; case 'tocustomer_rating_invitation': case 'tocustomer_rating_invitation_getvoucher': return [ '{product_name}', ]; default: return []; } } public static function encrypt($key) { $key = md5($key); return Tools::substr($key, 5, 5) . Tools::substr($key, 3, 3) . Tools::substr($key, 4, 4) . Tools::substr($key, 20, 3) . Tools::substr($key, 15, 2) . Tools::substr($key, 23, 3) . Tools::substr($key, 29, 2); } public static function isEmailListSeparatedByComma($emails) { $emails = explode(',', $emails); if ($emails) { foreach ($emails as $email) { if (!Validate::isEmail(trim($email))) return false; } } return true; } public static function displayText($content, $tag, $attr_datas = array()) { $text = '<' . $tag . ' '; if ($attr_datas) { foreach ($attr_datas as $key => $value) $text .= $key . '="' . $value . '" '; } if ($tag == 'img' || $tag == 'br' || $tag == 'path' || $tag == 'input') $text .= ' /' . '>'; else $text .= '>'; if ($tag && $tag != 'img' && $tag != 'input' && $tag != 'br' && !is_null($content)) $text .= $content; if ($tag && $tag != 'img' && $tag != 'path' && $tag != 'input' && $tag != 'br') $text .= '<' . '/' . $tag . '>'; return $text; } public static function checkEnableOtherShop($id_module) { $sql = 'SELECT * FROM `' . _DB_PREFIX_ . 'module_shop` WHERE `id_module`=' . (int)$id_module . ' AND `id_shop` NOT IN(' . implode(', ', Shop::getContextListShopID()) . ')'; return Db::getInstance()->executeS($sql); } public static function activeTab($module_name) { if (property_exists('Tab', 'enabled')) return Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'tab` SET `enabled`=1 WHERE `module`=\'' . pSQL($module_name) . '\''); } public static function executeSQL($sql_file) { if (!file_exists(dirname(__FILE__) . '/../sql/' . $sql_file)) { return false; } elseif (!$sql = Tools::file_get_contents(dirname(__FILE__) . '/../sql/' . $sql_file)) { return false; } $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); $sql = preg_split("/;\s*[\r\n]+/", trim($sql)); if ($sql) { foreach ($sql as $query) { if (!Db::getInstance()->execute(trim($query))) { return false; } } } return true; } }