ComGrafPL Posted February 8, 2020 Share Posted February 8, 2020 Hello. Tried to update 1.7.5.1 to 1.7.6.3 ( even to 1.7.6 ) Tried to do manual way. No luck. Tried with link ( MD5 not correct ) Tried with 1-Click upgrade and got this: "public_html/classes/controller/FrontController.php line 353 - Trying to get property 'logged' of non-object" While i have FrontController.php file, theres no numeric lines there, so i have no idea which line is 353. Cant update. Any clue? Attaching php file. <?php /** * 2007-2019 PrestaShop and Contributors * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 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: * https://opensource.org/licenses/OSL-3.0 * 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 https://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2019 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ use PrestaShop\PrestaShop\Adapter\Configuration as ConfigurationAdapter; use PrestaShop\PrestaShop\Adapter\ContainerBuilder; use PrestaShop\PrestaShop\Adapter\Image\ImageRetriever; use PrestaShop\PrestaShop\Adapter\Presenter\Cart\CartPresenter; use PrestaShop\PrestaShop\Adapter\Presenter\Object\ObjectPresenter; use Symfony\Component\Debug\Debug; use Symfony\Component\Filesystem\Filesystem; class FrontControllerCore extends Controller { /** * @deprecated Deprecated shortcuts as of 1.5.0.1 - Use $context->smarty instead * * @var Smarty */ protected static $smarty; /** * @deprecated Deprecated shortcuts as of 1.5.0.1 - Use $context->cookie instead * * @var Cookie */ protected static $cookie; /** * @deprecated Deprecated shortcuts as of 1.5.0.1 - Use $context->link instead * * @var Link */ protected static $link; /** * @deprecated Deprecated shortcuts as of 1.5.0.1 - Use $context->cart instead * * @var Cart */ protected static $cart; /** @var array Controller errors */ public $errors = array(); /** @var array Controller warning notifications */ public $warning = array(); /** @var array Controller success notifications */ public $success = array(); /** @var array Controller info notifications */ public $info = array(); /** @var string Language ISO code */ public $iso; /** @var string ORDER BY field */ public $orderBy; /** @var string Order way string ('ASC', 'DESC') */ public $orderWay; /** @var int Current page number */ public $p; /** @var int Items (products) per page */ public $n; /** @var bool If set to true, will redirected user to login page during init function. */ public $auth = false; /** * If set to true, user can be logged in as guest when checking if logged in. * * @see $auth * * @var bool */ public $guestAllowed = false; /** * Route of PrestaShop page to redirect to after forced login. * * @see $auth * * @var bool */ public $authRedirection = false; /** @var bool SSL connection flag */ public $ssl = false; /** @var bool If true, switches display to restricted country page during init. */ protected $restrictedCountry = Country::GEOLOC_ALLOWED; /** @var bool If true, forces display to maintenance page. */ protected $maintenance = false; /** @var string[] Adds excluded $_GET keys for redirection */ protected $redirectionExtraExcludedKeys = array(); /** * True if controller has already been initialized. * Prevents initializing controller more than once. * * @var bool */ public static $initialized = false; /** * @var array Holds current customer's groups */ protected static $currentCustomerGroups; /** * @var int */ public $nb_items_per_page; /** * @var object ObjectSerializer */ public $objectPresenter; /** * @var object CartPresenter */ public $cart_presenter; /** * @var object TemplateFinder */ private $templateFinder; /** * @var object StylesheetManager */ protected $stylesheetManager; /** * @var object JavascriptManager */ protected $javascriptManager; /** * @var object CccReducer */ protected $cccReducer; /** * Controller constructor. * * @global bool $useSSL SSL connection flag */ public function __construct() { $this->controller_type = 'front'; global $useSSL; parent::__construct(); if (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')) { $this->ssl = true; } if (isset($useSSL)) { $this->ssl = $useSSL; } else { $useSSL = $this->ssl; } $this->objectPresenter = new ObjectPresenter(); $this->cart_presenter = new CartPresenter(); $this->templateFinder = new TemplateFinder($this->context->smarty->getTemplateDir(), '.tpl'); $this->stylesheetManager = new StylesheetManager( array(_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__), new ConfigurationAdapter() ); $this->javascriptManager = new JavascriptManager( array(_PS_THEME_URI_, _PS_PARENT_THEME_URI_, __PS_BASE_URI__), new ConfigurationAdapter() ); $this->cccReducer = new CccReducer( _PS_THEME_DIR_ . 'assets/cache/', new ConfigurationAdapter(), new Filesystem() ); } /** * Check if the controller is available for the current user/visitor. * * @see Controller::checkAccess() * * @return bool */ public function checkAccess() { return true; } /** * Check if the current user/visitor has valid view permissions. * * @see Controller::viewAccess * * @return bool */ public function viewAccess() { return true; } /** * Initializes front controller: sets smarty variables, * class properties, redirects depending on context, etc. * * @global bool $useSSL SSL connection flag * @global Cookie $cookie Visitor's cookie * @global Smarty $smarty * @global Cart $cart Visitor's cart * @global string $iso Language ISO * @global Country $defaultCountry Visitor's country object * @global string $protocol_link * @global string $protocol_content * @global Link $link * @global array $css_files * @global array $js_files * @global Currency $currency Visitor's selected currency * * @throws PrestaShopException */ public function init() { /* * Globals are DEPRECATED as of version 1.5.0.1 * Use the Context object to access objects instead. * Example: $this->context->cart */ global $useSSL, $cookie, $smarty, $cart, $iso, $defaultCountry, $protocol_link, $protocol_content, $link, $css_files, $js_files, $currency; if (self::$initialized) { return; } self::$initialized = true; parent::init(); // enable Symfony error handler if debug mode enabled $this->initDebugguer(); // If current URL use SSL, set it true (used a lot for module redirect) if (Tools::usingSecureMode()) { $useSSL = true; } // For compatibility with globals, DEPRECATED as of version 1.5.0.1 $css_files = $this->css_files; $js_files = $this->js_files; $this->sslRedirection(); if ($this->ajax) { $this->display_header = false; $this->display_footer = false; } // If account created with the 2 steps register process, remove 'account_created' from cookie if (isset($this->context->cookie->account_created)) { unset($this->context->cookie->account_created); } ob_start(); $protocol_link = (Configuration::get('PS_SSL_ENABLED') || Tools::usingSecureMode()) ? 'https://' : 'http://'; $useSSL = ((isset($this->ssl) && $this->ssl && Configuration::get('PS_SSL_ENABLED')) || Tools::usingSecureMode()) ? true : false; $protocol_content = ($useSSL) ? 'https://' : 'http://'; $link = new Link($protocol_link, $protocol_content); $this->context->link = $link; if ($id_cart = (int) $this->recoverCart()) { $this->context->cookie->id_cart = (int) $id_cart; } if ($this->auth && !$this->context->customer->isLogged($this->guestAllowed)) { Tools::redirect('index.php?controller=authentication' . ($this->authRedirection ? '&back=' . $this->authRedirection : '')); } /* Theme is missing */ if (!is_dir(_PS_THEME_DIR_)) { throw new PrestaShopException( $this->trans( 'Current theme is unavailable. Please check your theme\'s directory name ("%s") and permissions.', array(basename(rtrim(_PS_THEME_DIR_, '/\\'))), 'Admin.Design.Notification' ) ); } if (Configuration::get('PS_GEOLOCATION_ENABLED')) { if (($new_default = $this->geolocationManagement($this->context->country)) && Validate::isLoadedObject($new_default)) { $this->context->country = $new_default; } } elseif (Configuration::get('PS_DETECT_COUNTRY')) { $has_currency = isset($this->context->cookie->id_currency) && (int) $this->context->cookie->id_currency; $has_country = isset($this->context->cookie->iso_code_country) && $this->context->cookie->iso_code_country; $has_address_type = false; if ((int) $this->context->cookie->id_cart && ($cart = new Cart($this->context->cookie->id_cart)) && Validate::isLoadedObject($cart)) { $has_address_type = isset($cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) && $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}; } if ((!$has_currency || $has_country) && !$has_address_type) { $id_country = $has_country && !Validate::isLanguageIsoCode($this->context->cookie->iso_code_country) ? (int) Country::getByIso(strtoupper($this->context->cookie->iso_code_country)) : (int) Tools::getCountry(); $country = new Country($id_country, (int) $this->context->cookie->id_lang); if (!$has_currency && validate::isLoadedObject($country) && $this->context->country->id !== $country->id) { $this->context->country = $country; $this->context->cookie->id_currency = (int) Currency::getCurrencyInstance($country->id_currency ? (int) $country->id_currency : (int) Configuration::get('PS_CURRENCY_DEFAULT'))->id; $this->context->cookie->iso_code_country = strtoupper($country->iso_code); } } } $currency = Tools::setCurrency($this->context->cookie); if (isset($_GET['logout']) || ($this->context->customer->logged && Customer::isBanned($this->context->customer->id))) { $this->context->customer->logout(); Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null); } elseif (isset($_GET['mylogout'])) { $this->context->customer->mylogout(); Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null); } /* Cart already exists */ if ((int) $this->context->cookie->id_cart) { if (!isset($cart)) { $cart = new Cart($this->context->cookie->id_cart); } if (Validate::isLoadedObject($cart) && $cart->orderExists()) { PrestaShopLogger::addLog('Frontcontroller::init - Cart cannot be loaded or an order has already been placed using this cart', 1, null, 'Cart', (int) $this->context->cookie->id_cart, true); unset($this->context->cookie->id_cart, $cart, $this->context->cookie->checkedTOS); $this->context->cookie->check_cgv = false; } elseif ((int) (Configuration::get('PS_GEOLOCATION_ENABLED')) && !in_array(strtoupper($this->context->cookie->iso_code_country), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))) && $cart->nbProducts() && (int) (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR')) != -1 && !FrontController::isInWhitelistForGeolocation() && !in_array($_SERVER['SERVER_NAME'], array('localhost', '127.0.0.1', '::1')) ) { /* Delete product of cart, if user can't make an order from his country */ PrestaShopLogger::addLog('Frontcontroller::init - GEOLOCATION is deleting a cart', 1, null, 'Cart', (int) $this->context->cookie->id_cart, true); unset($this->context->cookie->id_cart, $cart); } elseif ($this->context->cookie->id_customer != $cart->id_customer || $this->context->cookie->id_lang != $cart->id_lang || $currency->id != $cart->id_currency) { // update cart values if ($this->context->cookie->id_customer) { $cart->id_customer = (int) $this->context->cookie->id_customer; } $cart->id_lang = (int) $this->context->cookie->id_lang; $cart->id_currency = (int) $currency->id; $cart->update(); } /* Select an address if not set */ if (isset($cart) && (!isset($cart->id_address_delivery) || $cart->id_address_delivery == 0 || !isset($cart->id_address_invoice) || $cart->id_address_invoice == 0) && $this->context->cookie->id_customer) { $to_update = false; if (!isset($cart->id_address_delivery) || $cart->id_address_delivery == 0) { $to_update = true; $cart->id_address_delivery = (int) Address::getFirstCustomerAddressId($cart->id_customer); } if (!isset($cart->id_address_invoice) || $cart->id_address_invoice == 0) { $to_update = true; $cart->id_address_invoice = (int) Address::getFirstCustomerAddressId($cart->id_customer); } if ($to_update) { $cart->update(); } } } if (!isset($cart) || !$cart->id) { $cart = new Cart(); $cart->id_lang = (int) $this->context->cookie->id_lang; $cart->id_currency = (int) $this->context->cookie->id_currency; $cart->id_guest = (int) $this->context->cookie->id_guest; $cart->id_shop_group = (int) $this->context->shop->id_shop_group; $cart->id_shop = $this->context->shop->id; if ($this->context->cookie->id_customer) { $cart->id_customer = (int) $this->context->cookie->id_customer; $cart->id_address_delivery = (int) Address::getFirstCustomerAddressId($cart->id_customer); $cart->id_address_invoice = (int) $cart->id_address_delivery; } else { $cart->id_address_delivery = 0; $cart->id_address_invoice = 0; } // Needed if the merchant want to give a free product to every visitors $this->context->cart = $cart; CartRule::autoAddToCart($this->context); } else { $this->context->cart = $cart; } $this->context->cart->checkAndUpdateAddresses(); $this->context->smarty->assign('request_uri', Tools::safeOutput(urldecode($_SERVER['REQUEST_URI']))); // Automatically redirect to the canonical URL if needed if (!empty($this->php_self) && !Tools::getValue('ajax')) { $this->canonicalRedirection($this->context->link->getPageLink($this->php_self, $this->ssl, $this->context->language->id)); } Product::initPricesComputation(); $display_tax_label = $this->context->country->display_tax_label; if (isset($cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) && $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}) { $infos = Address::getCountryAndState((int) $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); $country = new Country((int) $infos['id_country']); $this->context->country = $country; if (Validate::isLoadedObject($country)) { $display_tax_label = $country->display_tax_label; } } /* * These shortcuts are DEPRECATED as of version 1.5.0.1 * Use the Context to access objects instead. * Example: $this->context->cart */ self::$cookie = $this->context->cookie; self::$cart = $cart; self::$smarty = $this->context->smarty; self::$link = $link; $defaultCountry = $this->context->country; $this->displayMaintenancePage(); if (Country::GEOLOC_FORBIDDEN == $this->restrictedCountry) { $this->displayRestrictedCountryPage(); } $this->iso = $iso; $this->context->cart = $cart; $this->context->currency = $currency; Hook::exec('actionFrontControllerAfterInit'); } /** * Method that is executed after init() and checkAccess(). * Used to process user input. * * @see Controller::run() */ public function postProcess() { } protected function assignGeneralPurposeVariables() { $templateVars = array( 'cart' => $this->cart_presenter->present($this->context->cart), 'currency' => $this->getTemplateVarCurrency(), 'customer' => $this->getTemplateVarCustomer(), 'language' => $this->objectPresenter->present($this->context->language), 'page' => $this->getTemplateVarPage(), 'shop' => $this->getTemplateVarShop(), 'urls' => $this->getTemplateVarUrls(), 'configuration' => $this->getTemplateVarConfiguration(), 'field_required' => $this->context->customer->validateFieldsRequiredDatabase(), 'breadcrumb' => $this->getBreadcrumb(), 'link' => $this->context->link, 'time' => time(), 'static_token' => Tools::getToken(false), 'token' => Tools::getToken(), ); $modulesVariables = Hook::exec('actionFrontControllerSetVariables', [], null, true); if (is_array($modulesVariables)) { foreach ($modulesVariables as $moduleName => $variables) { $templateVars['modules'][$moduleName] = $variables; } } $this->context->smarty->assign($templateVars); Media::addJsDef(array( 'prestashop' => $this->buildFrontEndObject($templateVars), )); } /** * Builds the "prestashop" javascript object that will be sent to the front end. * * @param array $object Variables inserted in the template (see FrontController::assignGeneralPurposeVariables) * * @return array Variables to be inserted in the "prestashop" javascript object * * @throws \PrestaShop\PrestaShop\Core\Filter\FilterException * @throws PrestaShopException */ protected function buildFrontEndObject($object) { $object = $this->get('prestashop.core.filter.front_end_object.main') ->filter($object); Hook::exec('actionBuildFrontEndObject', array( 'obj' => &$object, )); return $object; } /** * Initializes common front page content: header, footer and side columns. */ public function initContent() { $this->assignGeneralPurposeVariables(); $this->process(); if (!isset($this->context->cart)) { $this->context->cart = new Cart(); } $this->context->smarty->assign(array( 'HOOK_HEADER' => Hook::exec('displayHeader'), )); } public function initFooter() { } /** * Renders and outputs maintenance page and ends controller process. */ public function initCursedPage() { $this->displayMaintenancePage(); } /** * Called before compiling common page sections (header, footer, columns). * Good place to modify smarty variables. * * @see FrontController::initContent() */ public function process() { } /** * @return mixed */ public function getStylesheets() { $cssFileList = $this->stylesheetManager->getList(); if (Configuration::get('PS_CSS_THEME_CACHE')) { $cssFileList = $this->cccReducer->reduceCss($cssFileList); } return $cssFileList; } /** * @return mixed */ public function getJavascript() { $jsFileList = $this->javascriptManager->getList(); if (Configuration::get('PS_JS_THEME_CACHE')) { $jsFileList = $this->cccReducer->reduceJs($jsFileList); } return $jsFileList; } /** * Redirects to redirect_after link. * * @see $redirect_after */ protected function redirect() { Tools::redirectLink($this->redirect_after); } public function redirectWithNotifications() { $notifications = json_encode(array( 'error' => $this->errors, 'warning' => $this->warning, 'success' => $this->success, 'info' => $this->info, )); if (session_status() == PHP_SESSION_ACTIVE) { $_SESSION['notifications'] = $notifications; } elseif (session_status() == PHP_SESSION_NONE) { session_start(); $_SESSION['notifications'] = $notifications; } else { setcookie('notifications', $notifications); } return call_user_func_array(array('Tools', 'redirect'), func_get_args()); } /** * Renders page content. * Used for retrocompatibility with PS 1.4. */ public function displayContent() { } /** * Compiles and outputs full page content. * * @return bool * * @throws Exception * @throws SmartyException */ public function display() { $this->context->smarty->assign(array( 'layout' => $this->getLayout(), 'stylesheets' => $this->getStylesheets(), 'javascript' => $this->getJavascript(), 'js_custom_vars' => Media::getJsDef(), 'notifications' => $this->prepareNotifications(), )); $this->smartyOutputContent($this->template); return true; } protected function smartyOutputContent($content) { $this->context->cookie->write(); $html = ''; if (is_array($content)) { foreach ($content as $tpl) { $html .= $this->context->smarty->fetch($tpl, null, $this->getLayout()); } } else { $html = $this->context->smarty->fetch($content, null, $this->getLayout()); } Hook::exec('actionOutputHTMLBefore', array('html' => &$html)); echo trim($html); } protected function prepareNotifications() { $notifications = array( 'error' => $this->errors, 'warning' => $this->warning, 'success' => $this->success, 'info' => $this->info, ); if (session_status() == PHP_SESSION_NONE) { session_start(); } if (session_status() == PHP_SESSION_ACTIVE && isset($_SESSION['notifications'])) { $notifications = array_merge($notifications, json_decode($_SESSION['notifications'], true)); unset($_SESSION['notifications']); } elseif (isset($_COOKIE['notifications'])) { $notifications = array_merge($notifications, json_decode($_COOKIE['notifications'], true)); unset($_COOKIE['notifications']); } return $notifications; } /** * Displays maintenance page if shop is closed. */ protected function displayMaintenancePage() { if ($this->maintenance == true || !(int) Configuration::get('PS_SHOP_ENABLE')) { $this->maintenance = true; if (!in_array(Tools::getRemoteAddr(), explode(',', Configuration::get('PS_MAINTENANCE_IP')))) { header('HTTP/1.1 503 Service Unavailable'); header('Retry-After: 3600'); $this->registerStylesheet('theme-error', '/assets/css/error.css', ['media' => 'all', 'priority' => 50]); $this->context->smarty->assign(array( 'urls' => $this->getTemplateVarUrls(), 'shop' => $this->getTemplateVarShop(), 'HOOK_MAINTENANCE' => Hook::exec('displayMaintenance', array()), 'maintenance_text' => Configuration::get('PS_MAINTENANCE_TEXT', (int) $this->context->language->id), 'stylesheets' => $this->getStylesheets(), )); $this->smartyOutputContent('errors/maintenance.tpl'); exit; } } } /** * Displays 'country restricted' page if user's country is not allowed. */ protected function displayRestrictedCountryPage() { header('HTTP/1.1 403 Forbidden'); $this->registerStylesheet('theme-error', '/assets/css/error.css', ['media' => 'all', 'priority' => 50]); $this->context->smarty->assign(array( 'urls' => $this->getTemplateVarUrls(), 'shop' => $this->getTemplateVarShop(), 'stylesheets' => $this->getStylesheets(), )); $this->smartyOutputContent('errors/restricted-country.tpl'); exit; } /** * Redirects to correct protocol if settings and request methods don't match. */ protected function sslRedirection() { // If we call a SSL controller without SSL or a non SSL controller with SSL, we redirect with the right protocol if (Configuration::get('PS_SSL_ENABLED') && $_SERVER['REQUEST_METHOD'] != 'POST' && $this->ssl != Tools::usingSecureMode()) { $this->context->cookie->disallowWriting(); header('HTTP/1.1 301 Moved Permanently'); header('Cache-Control: no-cache'); if ($this->ssl) { header('Location: ' . Tools::getShopDomainSsl(true) . $_SERVER['REQUEST_URI']); } else { header('Location: ' . Tools::getShopDomain(true) . $_SERVER['REQUEST_URI']); } exit(); } } /** * Redirects to canonical URL. * * @param string $canonical_url */ protected function canonicalRedirection($canonical_url = '') { if (!$canonical_url || !Configuration::get('PS_CANONICAL_REDIRECT') || strtoupper($_SERVER['REQUEST_METHOD']) != 'GET') { return; } $canonical_url = preg_replace('/#.*$/', '', $canonical_url); $match_url = rawurldecode(Tools::getCurrentUrlProtocolPrefix() . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); if (!preg_match('/^' . Tools::pRegexp(rawurldecode($canonical_url), '/') . '([&?].*)?$/', $match_url)) { $params = array(); $url_details = parse_url($canonical_url); if (!empty($url_details['query'])) { parse_str($url_details['query'], $query); foreach ($query as $key => $value) { $params[Tools::safeOutput($key)] = Tools::safeOutput($value); } } $excluded_key = array('isolang', 'id_lang', 'controller', 'fc', 'id_product', 'id_category', 'id_manufacturer', 'id_supplier', 'id_cms'); $excluded_key = array_merge($excluded_key, $this->redirectionExtraExcludedKeys); foreach ($_GET as $key => $value) { if (!in_array($key, $excluded_key) && Validate::isUrl($key) && Validate::isUrl($value)) { $params[Tools::safeOutput($key)] = Tools::safeOutput($value); } } $str_params = http_build_query($params, '', '&'); if (!empty($str_params)) { $final_url = preg_replace('/^([^?]*)?.*$/', '$1', $canonical_url) . '?' . $str_params; } else { $final_url = preg_replace('/^([^?]*)?.*$/', '$1', $canonical_url); } // Don't send any cookie Context::getContext()->cookie->disallowWriting(); if (defined('_PS_MODE_DEV_') && _PS_MODE_DEV_ && $_SERVER['REQUEST_URI'] != __PS_BASE_URI__) { die('[Debug] This page has moved<br />Please use the following URL instead: <a href="' . $final_url . '">' . $final_url . '</a>'); } $redirect_type = Configuration::get('PS_CANONICAL_REDIRECT') == 2 ? '301' : '302'; header('HTTP/1.0 ' . $redirect_type . ' Moved'); header('Cache-Control: no-cache'); Tools::redirectLink($final_url); } } /** * Geolocation management. * * @param Country $defaultCountry * * @return Country|false */ protected function geolocationManagement($defaultCountry) { if (!in_array(Tools::getRemoteAddr(), array('localhost', '127.0.0.1', '::1'))) { /* Check if Maxmind Database exists */ if (@filemtime(_PS_GEOIP_DIR_ . _PS_GEOIP_CITY_FILE_)) { if (!isset($this->context->cookie->iso_code_country) || (isset($this->context->cookie->iso_code_country) && !in_array(strtoupper($this->context->cookie->iso_code_country), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))))) { $reader = new GeoIp2\Database\Reader(_PS_GEOIP_DIR_ . _PS_GEOIP_CITY_FILE_); try { $record = $reader->city(Tools::getRemoteAddr()); } catch (\GeoIp2\Exception\AddressNotFoundException $e) { $record = null; } if (is_object($record) && Validate::isLanguageIsoCode($record->country->isoCode) && (int) Country::getByIso(strtoupper($record->country->isoCode)) != 0) { if (!in_array(strtoupper($record->country->isoCode), explode(';', Configuration::get('PS_ALLOWED_COUNTRIES'))) && !FrontController::isInWhitelistForGeolocation()) { if (Configuration::get('PS_GEOLOCATION_BEHAVIOR') == _PS_GEOLOCATION_NO_CATALOG_) { $this->restrictedCountry = Country::GEOLOC_FORBIDDEN; } elseif (Configuration::get('PS_GEOLOCATION_BEHAVIOR') == _PS_GEOLOCATION_NO_ORDER_) { $this->restrictedCountry = Country::GEOLOC_CATALOG_MODE; $this->warning[] = $this->trans('You cannot place a new order from your country (%s).', array($record->country->name), 'Shop.Notifications.Warning'); } } else { $hasBeenSet = !isset($this->context->cookie->iso_code_country); $this->context->cookie->iso_code_country = strtoupper($record->country->isoCode); } } } if (isset($this->context->cookie->iso_code_country) && $this->context->cookie->iso_code_country && !Validate::isLanguageIsoCode($this->context->cookie->iso_code_country)) { $this->context->cookie->iso_code_country = Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT')); } if (isset($this->context->cookie->iso_code_country) && ($idCountry = (int) Country::getByIso(strtoupper($this->context->cookie->iso_code_country)))) { /* Update defaultCountry */ if ($defaultCountry->iso_code != $this->context->cookie->iso_code_country) { $defaultCountry = new Country($idCountry); } if (isset($hasBeenSet) && $hasBeenSet) { $this->context->cookie->id_currency = (int) ($defaultCountry->id_currency ? (int) $defaultCountry->id_currency : (int) Configuration::get('PS_CURRENCY_DEFAULT')); } return $defaultCountry; } elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_CATALOG_ && !FrontController::isInWhitelistForGeolocation()) { $this->restrictedCountry = Country::GEOLOC_FORBIDDEN; } elseif (Configuration::get('PS_GEOLOCATION_NA_BEHAVIOR') == _PS_GEOLOCATION_NO_ORDER_ && !FrontController::isInWhitelistForGeolocation()) { $this->restrictedCountry = Country::GEOLOC_CATALOG_MODE; $countryName = $this->trans('Undefined', array(), 'Shop.Theme.Global'); if (isset($record->country->name) && $record->country->name) { $countryName = $record->country->name; } $this->warning[] = $this->trans( 'You cannot place a new order from your country (%s).', array($countryName), 'Shop.Notifications.Warning' ); } } } return false; } /** * Sets controller CSS and JS files. * * @return bool */ public function setMedia() { $this->registerStylesheet('theme-main', '/assets/css/theme.css', ['media' => 'all', 'priority' => 50]); $this->registerStylesheet('theme-custom', '/assets/css/custom.css', ['media' => 'all', 'priority' => 1000]); if ($this->context->language->is_rtl) { $this->registerStylesheet('theme-rtl', '/assets/css/rtl.css', ['media' => 'all', 'priority' => 900]); } $this->registerJavascript('corejs', '/themes/core.js', ['position' => 'bottom', 'priority' => 0]); $this->registerJavascript('theme-main', '/assets/js/theme.js', ['position' => 'bottom', 'priority' => 50]); $this->registerJavascript('theme-custom', '/assets/js/custom.js', ['position' => 'bottom', 'priority' => 1000]); $assets = $this->context->shop->theme->getPageSpecificAssets($this->php_self); if (!empty($assets)) { foreach ($assets['css'] as $css) { $this->registerStylesheet($css['id'], $css['path'], $css); } foreach ($assets['js'] as $js) { $this->registerJavascript($js['id'], $js['path'], $js); } } // Execute Hook FrontController SetMedia Hook::exec('actionFrontControllerSetMedia', array()); return true; } /** * Initializes page header variables. */ public function initHeader() { } /** * Sets and returns customer groups that the current customer(visitor) belongs to. * * @return array * * @throws PrestaShopDatabaseException */ public static function getCurrentCustomerGroups() { if (!Group::isFeatureActive()) { return array(); } $context = Context::getContext(); if (!isset($context->customer) || !$context->customer->id) { return array(); } if (!is_array(self::$currentCustomerGroups)) { self::$currentCustomerGroups = array(); $result = Db::getInstance()->executeS('SELECT id_group FROM ' . _DB_PREFIX_ . 'customer_group WHERE id_customer = ' . (int) $context->customer->id); foreach ($result as $row) { self::$currentCustomerGroups[] = $row['id_group']; } } return self::$currentCustomerGroups; } /** * Checks if user's location is whitelisted. * * @staticvar bool|null $allowed * * @return bool */ protected static function isInWhitelistForGeolocation() { static $allowed = null; if ($allowed !== null) { return $allowed; } $allowed = false; $user_ip = Tools::getRemoteAddr(); $ips = array(); // retrocompatibility $ips_old = explode(';', Configuration::get('PS_GEOLOCATION_WHITELIST')); if (is_array($ips_old) && count($ips_old)) { foreach ($ips_old as $ip) { $ips = array_merge($ips, explode("\n", $ip)); } } $ips = array_map('trim', $ips); if (is_array($ips) && count($ips)) { foreach ($ips as $ip) { if (!empty($ip) && preg_match('/^' . $ip . '.*/', $user_ip)) { $allowed = true; } } } return $allowed; } /** * Checks if token is valid. * * @since 1.5.0.1 * * @return bool */ public function isTokenValid() { if (!Configuration::get('PS_TOKEN_ENABLE')) { return true; } return strcasecmp(Tools::getToken(false), Tools::getValue('token')) == 0; } /** * @deprecated 1.7 use $this->registerJavascript() and $this->registerStylesheet() to manage your assets. */ public function addMedia($media_uri, $css_media_type = null, $offset = null, $remove = false, $check_path = true) { /* This function has no effect in PrestaShop 1.7 theme, use $this->registerJavascript() and $this->registerStylesheet() to manage your assets. */ } /** * @deprecated 1.7 this method has not effect with PrestaShop 1.7+ */ public function removeMedia($media_uri, $css_media_type = null, $check_path = true) { /* This function has no effect in PrestaShop 1.7 theme, use $this->registerJavascript() and $this->registerStylesheet() to manage your assets. */ } public function registerStylesheet($id, $relativePath, $params = array()) { if (!is_array($params)) { $params = array(); } $default_params = [ 'media' => AbstractAssetManager::DEFAULT_MEDIA, 'priority' => AbstractAssetManager::DEFAULT_PRIORITY, 'inline' => false, 'server' => 'local', ]; $params = array_merge($default_params, $params); $this->stylesheetManager->register($id, $relativePath, $params['media'], $params['priority'], $params['inline'], $params['server']); } public function unregisterStylesheet($id) { $this->stylesheetManager->unregisterById($id); } public function registerJavascript($id, $relativePath, $params = array()) { if (!is_array($params)) { $params = array(); } $default_params = [ 'position' => AbstractAssetManager::DEFAULT_JS_POSITION, 'priority' => AbstractAssetManager::DEFAULT_PRIORITY, 'inline' => false, 'attributes' => null, 'server' => 'local', ]; $params = array_merge($default_params, $params); $this->javascriptManager->register($id, $relativePath, $params['position'], $params['priority'], $params['inline'], $params['attributes'], $params['server']); } public function unregisterJavascript($id) { $this->javascriptManager->unregisterById($id); } /** * @deprecated 1.7 This function shouldn't be used, use $this->registerStylesheet() instead */ public function addCSS($css_uri, $css_media_type = 'all', $offset = null, $check_path = true) { /* This is deprecated in PrestaShop 1.7 and has no effect in PrestaShop 1.7 theme. You should use registerStylesheet($id, $path, $params) */ if (!is_array($css_uri)) { $css_uri = (array) $css_uri; } foreach ($css_uri as $legacy_uri) { if ($uri = $this->getAssetUriFromLegacyDeprecatedMethod($legacy_uri)) { $this->registerStylesheet(sha1($uri), $uri, ['media' => $css_media_type, 'priority' => 80]); } } } /** * @deprecated 1.7 This function has no effect in PrestaShop 1.7 theme, use $this->unregisterStylesheet() instead */ public function removeCSS($css_uri, $css_media_type = 'all', $check_path = true) { /* This is deprecated in PrestaShop 1.7 and has no effect in PrestaShop 1.7 theme. You should use unregisterStylesheet($id) */ if (!is_array($css_uri)) { $css_uri = (array) $css_uri; } foreach ($css_uri as $legacy_uri) { if ($uri = $this->getAssetUriFromLegacyDeprecatedMethod($legacy_uri)) { $this->unregisterStylesheet(sha1($uri)); } } } /** * @deprecated 1.7 This function has no effect in PrestaShop 1.7 theme, use $this->registerJavascript() instead */ public function addJS($js_uri, $check_path = true) { /* This is deprecated in PrestaShop 1.7 and has no effect in PrestaShop 1.7 theme. You should use registerJavascript($id, $path, $params) */ if (!is_array($js_uri)) { $js_uri = (array) $js_uri; } foreach ($js_uri as $legacy_uri) { if ($uri = $this->getAssetUriFromLegacyDeprecatedMethod($legacy_uri)) { $this->registerJavascript(sha1($uri), $uri, ['position' => 'bottom', 'priority' => 80]); } } } /** * @deprecated 1.7 This function has no effect in PrestaShop 1.7 theme, use $this->unregisterJavascript() instead */ public function removeJS($js_uri, $check_path = true) { /* This is deprecated in PrestaShop 1.7 and has no effect in PrestaShop 1.7 theme. You should use unregisterJavascript($id) */ if (!is_array($js_uri)) { $js_uri = (array) $js_uri; } foreach ($js_uri as $legacy_uri) { if ($uri = $this->getAssetUriFromLegacyDeprecatedMethod($legacy_uri)) { $this->unregisterJavascript(sha1($uri)); } } } /** * @deprecated 1.7 This function has no effect in PrestaShop 1.7 theme. jQuery2 is register by the core on every theme. * Have a look at the /themes/_core folder. */ public function addJquery($version = null, $folder = null, $minifier = true) { /* This is deprecated in PrestaShop 1.7 and has no effect in PrestaShop 1.7 theme. jQuery2 is register by the core on every theme. Have a look at the /themes/_core folder. */ } /** * Adds jQuery UI component(s) to queued JS file list. * * @param string|array $component * @param string $theme * @param bool $check_dependencies */ public function addJqueryUI($component, $theme = 'base', $check_dependencies = true) { $css_theme_path = '/js/jquery/ui/themes/' . $theme . '/minified/jquery.ui.theme.min.css'; $css_path = '/js/jquery/ui/themes/' . $theme . '/minified/jquery-ui.min.css'; $js_path = '/js/jquery/ui/jquery-ui.min.js'; $this->registerStylesheet('jquery-ui-theme', $css_theme_path, ['media' => 'all', 'priority' => 95]); $this->registerStylesheet('jquery-ui', $css_path, ['media' => 'all', 'priority' => 90]); $this->registerJavascript('jquery-ui', $js_path, ['position' => 'bottom', 'priority' => 90]); } /** * Add Library not included with classic theme. */ public function requireAssets(array $libraries) { foreach ($libraries as $library) { if ($assets = PrestashopAssetsLibraries::getAssetsLibraries($library)) { foreach ($assets as $asset) { $this->{$asset['type']}($library, $asset['path'], $asset['params']); } } } } /** * Adds jQuery plugin(s) to queued JS file list. * * @param string|array $name * @param string null $folder * @param bool $css */ public function addJqueryPlugin($name, $folder = null, $css = true) { if (!is_array($name)) { $name = array($name); } foreach ($name as $plugin) { $plugin_path = Media::getJqueryPluginPath($plugin, $folder); if (!empty($plugin_path['js'])) { $this->registerJavascript( str_replace(_PS_JS_DIR_ . 'jquery/plugins/', '', $plugin_path['js']), str_replace(_PS_JS_DIR_, 'js/', $plugin_path['js']), array('position' => 'bottom', 'priority' => 100) ); } if ($css && !empty($plugin_path['css'])) { $this->registerStylesheet( str_replace(_PS_JS_DIR_ . 'jquery/plugins/', '', key($plugin_path['css'])), str_replace(_PS_JS_DIR_, 'js/', key($plugin_path['css'])), array('media' => 'all', 'priority' => 100) ); } } } /** * Recovers cart information. * * @return int|false */ protected function recoverCart() { if (($id_cart = (int) Tools::getValue('recover_cart')) && Tools::getValue('token_cart') == md5(_COOKIE_KEY_ . 'recover_cart_' . $id_cart)) { $cart = new Cart((int) $id_cart); if (Validate::isLoadedObject($cart)) { $customer = new Customer((int) $cart->id_customer); if (Validate::isLoadedObject($customer)) { $customer->logged = 1; $this->context->customer = $customer; $this->context->cookie->id_customer = (int) $customer->id; $this->context->cookie->customer_lastname = $customer->lastname; $this->context->cookie->customer_firstname = $customer->firstname; $this->context->cookie->logged = 1; $this->context->cookie->check_cgv = 1; $this->context->cookie->is_guest = $customer->isGuest(); $this->context->cookie->passwd = $customer->passwd; $this->context->cookie->email = $customer->email; return $id_cart; } } } else { return false; } } /** * Sets template file for page content output. * * @param string $default_template */ public function setTemplate($template, $params = array(), $locale = null) { parent::setTemplate( $this->getTemplateFile($template, $params, $locale) ); } /** * Removed in PrestaShop 1.7. * * @return bool */ protected function useMobileTheme() { return false; } /** * Returns theme directory (regular or mobile). * * @return string */ protected function getThemeDir() { return _PS_THEME_DIR_; } /** * Returns the layout corresponding to the current page by using the override system * Ex: * On the url: http://localhost/index.php?id_product=1&controller=product, this method will * check if the layout exists in the following files (in that order), and return the first found: * - /themes/default/override/layout-product-1.tpl * - /themes/default/override/layout-product.tpl * - /themes/default/layout.tpl. * * @since 1.5.0.13 * * @return bool|string */ public function getLayout() { $entity = $this->php_self; if (empty($entity)) { $entity = $this->getPageName(); } $layout = $this->context->shop->theme->getLayoutRelativePathForPage($entity); $content_only = (int) Tools::getValue('content_only'); if ($overridden_layout = Hook::exec( 'overrideLayoutTemplate', array( 'default_layout' => $layout, 'entity' => $entity, 'locale' => $this->context->language->locale, 'controller' => $this, 'content_only' => $content_only, ) )) { return $overridden_layout; } if ($content_only) { $layout = 'layouts/layout-content-only.tpl'; } return $layout; } /** * Returns template path. * * @param string $template * * @return string */ public function getTemplatePath($template) { return $template; } public function getTemplateFile($template, $params = array(), $locale = null) { if (!isset($params['entity'])) { $params['entity'] = null; } if (!isset($params['id'])) { $params['id'] = null; } if (null === $locale) { $locale = $this->context->language->locale; } if ($overridden_template = Hook::exec( 'DisplayOverrideTemplate', array( 'controller' => $this, 'template_file' => $template, 'id' => $params['id'], 'locale' => $locale, ) )) { return $overridden_template; } return $this->getTemplateFinder()->getTemplate( $template, $params['entity'], $params['id'], $locale ); } /** * Renders and adds color list HTML for each product in a list. * * @param array $products */ public function addColorsToProductList(&$products) { if (!is_array($products) || !count($products) || !file_exists(_PS_THEME_DIR_ . 'product-list-colors.tpl')) { return; } $products_need_cache = array(); foreach ($products as &$product) { if (!$this->isCached(_PS_THEME_DIR_ . 'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product']))) { $products_need_cache[] = (int) $product['id_product']; } } unset($product); $colors = false; if (count($products_need_cache)) { $colors = Product::getAttributesColorList($products_need_cache); } Tools::enableCache(); foreach ($products as &$product) { $tpl = $this->context->smarty->createTemplate(_PS_THEME_DIR_ . 'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product'])); $tpl->assign(array( 'id_product' => $product['id_product'], 'colors_list' => isset($colors[$product['id_product']]) ? $colors[$product['id_product']] : null, 'link' => Context::getContext()->link, 'img_col_dir' => _THEME_COL_DIR_, 'col_img_dir' => _PS_COL_IMG_DIR_, )); $product['color_list'] = $tpl->fetch(_PS_THEME_DIR_ . 'product-list-colors.tpl', $this->getColorsListCacheId($product['id_product'])); } Tools::restoreCacheSettings(); } /** * Returns cache ID for product color list. * * @param int $id_product * * @return string */ protected function getColorsListCacheId($id_product) { return Product::getColorsListCacheId($id_product); } public function getTemplateVarUrls() { $http = Tools::getCurrentUrlProtocolPrefix(); $base_url = $this->context->shop->getBaseURL(true, true); $urls = array( 'base_url' => $base_url, 'current_url' => $this->context->shop->getBaseURL(true, false) . $_SERVER['REQUEST_URI'], 'shop_domain_url' => $this->context->shop->getBaseURL(true, false), ); $assign_array = array( 'img_ps_url' => _PS_IMG_, 'img_cat_url' => _THEME_CAT_DIR_, 'img_lang_url' => _THEME_LANG_DIR_, 'img_prod_url' => _THEME_PROD_DIR_, 'img_manu_url' => _THEME_MANU_DIR_, 'img_sup_url' => _THEME_SUP_DIR_, 'img_ship_url' => _THEME_SHIP_DIR_, 'img_store_url' => _THEME_STORE_DIR_, 'img_col_url' => _THEME_COL_DIR_, 'img_url' => _THEME_IMG_DIR_, 'css_url' => _THEME_CSS_DIR_, 'js_url' => _THEME_JS_DIR_, 'pic_url' => _THEME_PROD_PIC_DIR_, ); foreach ($assign_array as $assign_key => $assign_value) { if (substr($assign_value, 0, 1) == '/' || $this->ssl) { $urls[$assign_key] = $http . Tools::getMediaServer($assign_value) . $assign_value; } else { $urls[$assign_key] = $assign_value; } } $pages = array(); $p = array( 'address', 'addresses', 'authentication', 'cart', 'category', 'cms', 'contact', 'discount', 'guest-tracking', 'history', 'identity', 'index', 'my-account', 'order-confirmation', 'order-detail', 'order-follow', 'order', 'order-return', 'order-slip', 'pagenotfound', 'password', 'pdf-invoice', 'pdf-order-return', 'pdf-order-slip', 'prices-drop', 'product', 'search', 'sitemap', 'stores', 'supplier', ); foreach ($p as $page_name) { $index = str_replace('-', '_', $page_name); $pages[$index] = $this->context->link->getPageLink($page_name, $this->ssl); } $pages['register'] = $this->context->link->getPageLink('authentication', true, null, array('create_account' => '1')); $pages['order_login'] = $this->context->link->getPageLink('order', true, null, array('login' => '1')); $urls['pages'] = $pages; $urls['alternative_langs'] = $this->getAlternativeLangsUrl(); $urls['theme_assets'] = __PS_BASE_URI__ . 'themes/' . $this->context->shop->theme->getName() . '/assets/'; $urls['actions'] = array( 'logout' => $this->context->link->getPageLink('index', true, null, 'mylogout'), ); $imageRetriever = new ImageRetriever($this->context->link); $urls['no_picture_image'] = $imageRetriever->getNoPictureImage($this->context->language); return $urls; } public function getTemplateVarConfiguration() { $quantity_discount_price = Configuration::get('PS_DISPLAY_DISCOUNT_PRICE'); return array( 'display_taxes_label' => $this->getDisplayTaxesLabel(), 'display_prices_tax_incl' => (bool) (new TaxConfiguration())->includeTaxes(), 'taxes_enabled' => (bool) Configuration::get('PS_TAX'), 'low_quantity_threshold' => (int) Configuration::get('PS_LAST_QTIES'), 'is_b2b' => (bool) Configuration::get('PS_B2B_ENABLE'), 'is_catalog' => (bool) Configuration::isCatalogMode(), 'show_prices' => (bool) Configuration::showPrices(), 'opt_in' => array( 'partner' => (bool) Configuration::get('PS_CUSTOMER_OPTIN'), ), 'quantity_discount' => array( 'type' => ($quantity_discount_price) ? 'price' : 'discount', 'label' => ($quantity_discount_price) ? $this->getTranslator()->trans('Price', array(), 'Shop.Theme.Catalog') : $this->getTranslator()->trans('Discount', array(), 'Shop.Theme.Catalog'), ), 'voucher_enabled' => (int) CartRule::isFeatureActive(), 'return_enabled' => (int) Configuration::get('PS_ORDER_RETURN'), 'number_of_days_for_return' => (int) Configuration::get('PS_ORDER_RETURN_NB_DAYS'), ); } protected function getDisplayTaxesLabel() { return (Module::isEnabled('ps_legalcompliance') && (bool) Configuration::get('AEUC_LABEL_TAX_INC_EXC')) || $this->context->country->display_tax_label; } public function getTemplateVarCurrency() { $curr = array(); $fields = array('name', 'iso_code', 'iso_code_num', 'sign'); foreach ($fields as $field_name) { $curr[$field_name] = $this->context->currency->{$field_name}; } return $curr; } public function getTemplateVarCustomer($customer = null) { if (Validate::isLoadedObject($customer)) { $cust = $this->objectPresenter->present($customer); } else { $cust = $this->objectPresenter->present($this->context->customer); } unset( $cust['secure_key'], $cust['passwd'], $cust['show_public_prices'], $cust['deleted'], $cust['id_lang'] ); $cust['is_logged'] = $this->context->customer->isLogged(true); $cust['gender'] = $this->objectPresenter->present(new Gender($cust['id_gender'])); unset($cust['id_gender']); $cust['risk'] = $this->objectPresenter->present(new Risk($cust['id_risk'])); unset($cust['id_risk']); $addresses = $this->context->customer->getSimpleAddresses(); foreach ($addresses as &$a) { $a['formatted'] = AddressFormat::generateAddress(new Address($a['id']), array(), '<br>'); } $cust['addresses'] = $addresses; return $cust; } public function getTemplateVarShop() { $address = $this->context->shop->getAddress(); $shop = array( 'name' => Configuration::get('PS_SHOP_NAME'), 'email' => Configuration::get('PS_SHOP_EMAIL'), 'registration_number' => Configuration::get('PS_SHOP_DETAILS'), 'long' => Configuration::get('PS_STORES_CENTER_LONG'), 'lat' => Configuration::get('PS_STORES_CENTER_LAT'), 'logo' => (Configuration::get('PS_LOGO')) ? _PS_IMG_ . Configuration::get('PS_LOGO') : '', 'stores_icon' => (Configuration::get('PS_STORES_ICON')) ? _PS_IMG_ . Configuration::get('PS_STORES_ICON') : '', 'favicon' => (Configuration::get('PS_FAVICON')) ? _PS_IMG_ . Configuration::get('PS_FAVICON') : '', 'favicon_update_time' => Configuration::get('PS_IMG_UPDATE_TIME'), 'address' => array( 'formatted' => AddressFormat::generateAddress($address, array(), '<br>'), 'address1' => $address->address1, 'address2' => $address->address2, 'postcode' => $address->postcode, 'city' => $address->city, 'state' => (new State($address->id_state))->name, 'country' => (new Country($address->id_country))->name[$this->context->language->id], ), 'phone' => Configuration::get('PS_SHOP_PHONE'), 'fax' => Configuration::get('PS_SHOP_FAX'), ); return $shop; } public function getTemplateVarPage() { $page_name = $this->getPageName(); $meta_tags = Meta::getMetaTags($this->context->language->id, $page_name); $my_account_controllers = array( 'address', 'authentication', 'discount', 'history', 'identity', 'order-follow', 'order-slip', 'password', 'guest-tracking', ); $body_classes = array( 'lang-' . $this->context->language->iso_code => true, 'lang-rtl' => (bool) $this->context->language->is_rtl, 'country-' . $this->context->country->iso_code => true, 'currency-' . $this->context->currency->iso_code => true, $this->context->shop->theme->getLayoutNameForPage($this->php_self) => true, 'page-' . $this->php_self => true, 'tax-display-' . ($this->getDisplayTaxesLabel() ? 'enabled' : 'disabled') => true, ); if (in_array($this->php_self, $my_account_controllers)) { $body_classes['page-customer-account'] = true; } $page = array( 'title' => '', 'canonical' => $this->getCanonicalURL(), 'meta' => array( 'title' => $meta_tags['meta_title'], 'description' => $meta_tags['meta_description'], 'keywords' => $meta_tags['meta_keywords'], 'robots' => 'index', ), 'page_name' => $page_name, 'body_classes' => $body_classes, 'admin_notifications' => array(), ); return $page; } public function getBreadcrumb() { $breadcrumb = $this->getBreadcrumbLinks(); $breadcrumb['count'] = count($breadcrumb['links']); return $breadcrumb; } protected function getBreadcrumbLinks() { $breadcrumb = array(); $breadcrumb['links'][] = array( 'title' => $this->getTranslator()->trans('Home', array(), 'Shop.Theme.Global'), 'url' => $this->context->link->getPageLink('index', true), ); return $breadcrumb; } protected function getCategoryPath($category) { if ($category->id_parent != 0 && !$category->is_root_category) { return array( 'title' => $category->name, 'url' => $this->context->link->getCategoryLink($category), ); } } protected function addMyAccountToBreadcrumb() { return array( 'title' => $this->getTranslator()->trans('Your account', array(), 'Shop.Theme.Customeraccount'), 'url' => $this->context->link->getPageLink('my-account', true), ); } public function getCanonicalURL() { } /** * Generate a URL corresponding to the current page but * with the query string altered. * * If $extraParams is set to NULL, then all query params are stripped. * * Otherwise, params from $extraParams that have a null value are stripped, * and other params are added. Params not in $extraParams are unchanged. */ protected function updateQueryString(array $extraParams = null) { $uriWithoutParams = explode('?', $_SERVER['REQUEST_URI'])[0]; $url = Tools::getCurrentUrlProtocolPrefix() . $_SERVER['HTTP_HOST'] . $uriWithoutParams; $params = array(); $paramsFromUri = ''; if (strpos($_SERVER['REQUEST_URI'], '?') !== false) { $paramsFromUri = explode('?', $_SERVER['REQUEST_URI'])[1]; } parse_str($paramsFromUri, $params); if (null !== $extraParams) { foreach ($extraParams as $key => $value) { if (null === $value) { unset($params[$key]); } else { $params[$key] = $value; } } } if (null !== $extraParams) { foreach ($params as $key => $param) { if (null === $param || '' === $param) { unset($params[$key]); } } } else { $params = array(); } $queryString = str_replace('%2F', '/', http_build_query($params, '', '&')); return $url . ($queryString ? "?$queryString" : ''); } protected function getCurrentURL() { return Tools::getCurrentUrlProtocolPrefix() . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; } public function getPageName() { // Are we in a payment module $module_name = ''; if (Validate::isModuleName(Tools::getValue('module'))) { $module_name = Tools::getValue('module'); } if (!empty($this->page_name)) { $page_name = $this->page_name; } elseif (!empty($this->php_self)) { $page_name = $this->php_self; } elseif (Tools::getValue('fc') == 'module' && $module_name != '' && (Module::getInstanceByName($module_name) instanceof PaymentModule)) { $page_name = 'module-payment-submit'; } elseif (preg_match('#^' . preg_quote($this->context->shop->physical_uri, '#') . 'modules/([a-zA-Z0-9_-]+?)/(.*)$#', $_SERVER['REQUEST_URI'], $m)) { /** @retrocompatibility Are we in a module ? */ $page_name = 'module-' . $m[1] . '-' . str_replace(array('.php', '/'), array('', '-'), $m[2]); } else { $page_name = Dispatcher::getInstance()->getController(); $page_name = (preg_match('/^[0-9]/', $page_name) ? 'page_' . $page_name : $page_name); } return $page_name; } protected function render($template, array $params = array()) { $templateContent = ''; $scope = $this->context->smarty->createData( $this->context->smarty ); $scope->assign($params); try { $tpl = $this->context->smarty->createTemplate( $this->getTemplateFile($template), $scope ); $templateContent = $tpl->fetch(); } catch (PrestaShopException $e) { PrestaShopLogger::addLog($e->getMessage()); if (defined('_PS_MODE_DEV_') && _PS_MODE_DEV_) { $this->warning[] = $e->getMessage(); $scope->assign(array('notifications' => $this->prepareNotifications())); $tpl = $this->context->smarty->createTemplate( $this->getTemplateFile('_partials/notifications'), $scope ); $templateContent = $tpl->fetch(); } } return $templateContent; } protected function getTranslator() { return $this->translator; } protected function makeLoginForm() { $form = new CustomerLoginForm( $this->context->smarty, $this->context, $this->getTranslator(), new CustomerLoginFormatter($this->getTranslator()), $this->getTemplateVarUrls() ); $form->setAction($this->getCurrentURL()); return $form; } protected function makeCustomerFormatter() { $formatter = new CustomerFormatter( $this->getTranslator(), $this->context->language ); $customer = new Customer(); $formatter ->setAskForPartnerOptin(Configuration::get('PS_CUSTOMER_OPTIN')) ->setAskForBirthdate(Configuration::get('PS_CUSTOMER_BIRTHDATE')) ->setPartnerOptinRequired($customer->isFieldRequired('optin')); return $formatter; } protected function makeCustomerForm() { $guestAllowedCheckout = Configuration::get('PS_GUEST_CHECKOUT_ENABLED'); $form = new CustomerForm( $this->context->smarty, $this->context, $this->getTranslator(), $this->makeCustomerFormatter(), new CustomerPersister( $this->context, $this->get('hashing'), $this->getTranslator(), $guestAllowedCheckout ), $this->getTemplateVarUrls() ); $form->setGuestAllowed($guestAllowedCheckout); $form->setAction($this->getCurrentURL()); return $form; } protected function makeAddressPersister() { return new CustomerAddressPersister( $this->context->customer, $this->context->cart, Tools::getToken(true, $this->context) ); } protected function makeAddressForm() { if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) { $availableCountries = Carrier::getDeliveredCountries($this->context->language->id, true, true); } else { $availableCountries = Country::getCountries($this->context->language->id, true); } $form = new CustomerAddressForm( $this->context->smarty, $this->context->language, $this->getTranslator(), $this->makeAddressPersister(), new CustomerAddressFormatter( $this->context->country, $this->getTranslator(), $availableCountries ) ); $form->setAction($this->getCurrentURL()); return $form; } private function initDebugguer() { if (true === _PS_MODE_DEV_) { Debug::enable(); } } /** * Get templateFinder. * * @return object */ public function getTemplateFinder() { return $this->templateFinder; } public function getRestrictedCountry() { return $this->restrictedCountry; } public function getAssetUriFromLegacyDeprecatedMethod($legacy_uri) { $success = preg_match('/modules\/.*/', $legacy_uri, $matches); if (!$success) { Tools::displayAsDeprecated( 'Backward compatibility for this method couldn\'t be handled. Use $this->registerJavascript() instead' ); return false; } else { return $matches[0]; } } /** * {@inheritdoc} */ protected function buildContainer() { return ContainerBuilder::getContainer('front', _PS_MODE_DEV_); } /** * @return array containing the URLs of the same page but for different languages */ protected function getAlternativeLangsUrl() { $alternativeLangs = array(); $languages = Language::getLanguages(true, $this->context->shop->id); if ($languages < 2) { // No need to display alternative lang if there is only one enabled return $alternativeLangs; } foreach ($languages as $lang) { $alternativeLangs[$lang['language_code']] = $this->context->link->getLanguageLink($lang['id_lang']); } return $alternativeLangs; } } FrontController.php Link to comment Share on other sites More sharing options...
notsureabout Posted March 11, 2020 Share Posted March 11, 2020 if (isset($_GET['logout']) || ($this->context->customer->logged && Customer::isBanned($this->context->customer->id))) { Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now