* @copyright 2018 Areama * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of Areama */ if (!defined('_PS_VERSION_')) { exit; } include_once dirname(__FILE__).'/classes/ArSeoProInstaller.php'; include_once dirname(__FILE__).'/classes/ArSeoProLogger.php'; include_once dirname(__FILE__).'/classes/ArSeoProUrls.php'; include_once dirname(__FILE__).'/classes/ArSeoProJsonLD.php'; include_once dirname(__FILE__).'/classes/ArSeoProSitemap.php'; include_once dirname(__FILE__).'/classes/ArSeoProRedirects.php'; include_once dirname(__FILE__).'/classes/ArSeoProFavicon.php'; include_once dirname(__FILE__).'/classes/ArSeoProCanonical.php'; include_once dirname(__FILE__).'/classes/canonical/ArSeoProCanonicalProduct.php'; include_once dirname(__FILE__).'/classes/canonical/ArSeoProCanonicalCategory.php'; include_once dirname(__FILE__).'/classes/ArSeoProTools.php'; include_once dirname(__FILE__).'/classes/redirects/models/ArSeoProRedirectTable.php'; include_once dirname(__FILE__).'/classes/meta/models/ArSeoProMetaTable.php'; include_once dirname(__FILE__).'/classes/meta/models/ArSeoProMetaData.php'; /** * @property ArSeoProUrls $urlConfig * @property ArSeoProSitemap $sitemapConfig * @property ArSeoProMeta $metaConfig */ class ArSeoPro extends Module { const REMIND_TO_RATE = 259200; // 3 days const ADDONS_ID = 44489; const AUTHOR_ID = 675406; protected $html; protected $installer = null; protected $urlConfig; protected $jsonLDConfig; protected $sitemapConfig; protected $canonicalConfig; protected $metaConfig; protected $faviconConfig; protected $redirectsConfig; protected $productListJson = null; protected static $langs = null; protected $logger; public $max_image_size; protected $routesDisabled = false; public function __construct() { $this->name = 'arseopro'; $this->tab = 'seo'; $this->version = '1.8.8'; $this->author = 'Areama'; $this->controllers = array('ajax'); $this->need_instance = 0; $this->bootstrap = true; if ($this->is17()) { $this->ps_versions_compliancy = array( 'min' => '1.7', 'max' => _PS_VERSION_ ); } $this->module_key = '93755410d6412f7524e43646ad0379bb'; parent::__construct(); $this->displayName = $this->l('SeoPro - All-In-One SEO'); $this->description = $this->l('Improve your SEO - clean URLs, OpenGraph tags, Twitter tags, meta tags, redirects, sitemaps, JSON-LD microdata and much more!'); $this->confirmUninstall = $this->l('Are you sure you want to delete all data?'); $this->initConfig(); } public function getOverridesVersion() { $versions = array(); $dispatcher = Dispatcher::getInstance(); if (method_exists($dispatcher, 'arSeoProOverrideVersion')) { $versions['Dispatcher'] = $dispatcher->arSeoProOverrideVersion(); } else { $versions['Dispatcher'] = 'unknown'; } $fo = new FrontController(); if (method_exists($fo, 'arSeoProOverrideVersion')) { $versions['FrontController'] = $fo->arSeoProOverrideVersion(); } else { $versions['FrontController'] = 'unknown'; } $link = Context::getContext()->link; if (method_exists($link, 'arSeoProOverrideVersion')) { $versions['Link'] = $link->arSeoProOverrideVersion(); } else { $versions['Link'] = 'unknown'; } return $versions; } /** * * @return ArSeoProLogger */ public function getLogger() { if (empty($this->logger)) { $this->logger = ArSeoProLogger::getInstance(); } return $this->logger; } protected function initConfig() { $this->urlConfig = new ArSeoProUrls($this); $this->jsonLDConfig = new ArSeoProJsonLD($this); $this->sitemapConfig = new ArSeoProSitemap($this); $this->faviconConfig = new ArSeoProFavicon($this, 'arsf_'); $this->canonicalConfig = new ArSeoProCanonical($this, 'arscc_'); $this->redirectsConfig = new ArSeoProRedirects($this, 'arsr_'); } public function getController() { return $this->context->controller; } public function getControllerId() { return (isset($this->context->controller->php_self) && $this->context->controller->php_self)? $this->context->controller->php_self : null; } public static function getProductAnchor($id, $id_product_attribute, $with_id = false) { $attributes = Product::getAttributesParams($id, $id_product_attribute); $anchor = '#'; $sep = Configuration::get('PS_ATTRIBUTE_ANCHOR_SEPARATOR'); foreach ($attributes as &$a) { foreach ($a as &$b) { $b = str_replace($sep, '_', Tools::link_rewrite($b)); } $anchor .= '/' . ($with_id && isset($a['id_attribute']) && $a['id_attribute'] ? $a['id_attribute_group'] . '|' . (int)$a['id_attribute'] . $sep : '') . $a['group'] . $sep . $a['name']; } return $anchor; } public function assignAttributes() { if ($this->getControllerId() == 'product' && Tools::getValue('ajax', 'false') == 'false' && Tools::getValue('id_product', 'false') != 'false') { $attributes = Product::getProductAttributesIds(Tools::getValue('id_product')); if (is_array($attributes)) { if (count($attributes) > 0) { $this->context->controller->addJS($this->_path.'views/js/script.js'); $json = array(); foreach ($attributes as $combination) { $json[str_replace("#/", "", self::getProductAnchor(Tools::getValue('id_product'), (int)$combination['id_product_attribute'], false))] = str_replace("#/", "", self::getProductAnchor(Tools::getValue('id_product'), (int)$combination['id_product_attribute'], true)); } Media::addJsDef(array( 'arSEOAttributes' => $json, 'arSEORemoveIdFromHash' => (int)$this->urlConfig->product->remove_anchor_id )); } } } } public function hookDisplayHeader($params) { $content = ''; $this->faviconConfig->loadFromConfig(); $faviconFilename = pathinfo($this->faviconConfig->icon, PATHINFO_FILENAME); $faviconExt = pathinfo($this->faviconConfig->icon, PATHINFO_EXTENSION); $id_shop = Context::getContext()->shop->id; if ($this->getControllerId() == 'product' && $this->is17()) { $this->assignAttributes(); } /*if (empty($this->faviconConfig->icon)) { return null; }*/ if (file_exists($this->getUploadPath() . 'manifest' . $id_shop . '.json')) { $manifestFileName = 'manifest' . $id_shop . '.json'; } else { $manifestFileName = 'manifest.json'; } $faviconVars = array( 'moduleUploadUrl' => $this->getUploadsUrl(), 'faviconConfig' => $this->faviconConfig, 'faviconFilename' => $faviconFilename, 'faviconExt' => $faviconExt, 'faviconSizes' => $this->faviconConfig->faviconSizes(), 'appleTouchSizes' => $this->faviconConfig->appleTouchIconSizes(), 'msTileSizes' => $this->faviconConfig->msTileSizes(), 'manifestFileName' => $manifestFileName, 'id_shop' => $id_shop ); $vars = array( 'domain' => Tools::getShopDomainSsl(false), 'url' => Tools::getShopDomainSsl(true) . $_SERVER['REQUEST_URI'], 'sitename' => Configuration::get('PS_SHOP_NAME'), 'faviconConfig' => $this->faviconConfig, ); $content .= $this->render('head_favicon.tpl', $faviconVars); if ($this->getController() instanceof CategoryController || $this->getController() instanceof CategoryControllerCore) { if ($row = ArSeoProMetaTable::getRowByRelation($this->context->controller->getCategory()->id, Context::getContext()->language->id, 'category')) { $metaData = new ArSeoProMetaData($this, $row, $this->context->controller->getCategory(), Context::getContext()->language->id); $metaData->prepareData(); $vars['metaData'] = $metaData; $content .= $this->render('head_meta.tpl', $vars); } } elseif ($this->getControllerId() == 'product') { if ($row = ArSeoProMetaTable::getRowByRelation($this->context->controller->getProduct()->id, Context::getContext()->language->id, 'product')) { $metaData = new ArSeoProMetaData($this, $row, $this->context->controller->getProduct(), Context::getContext()->language->id); $metaData->prepareData(); $vars['metaData'] = $metaData; $content .= $this->render('head_meta.tpl', $vars); } } elseif ($this->getControllerId() == 'manufacturer') { $id = Tools::getValue('id_manufacturer'); $brand = new Manufacturer($id, Context::getContext()->language->id); if ($row = ArSeoProMetaTable::getRowByRelation($id, Context::getContext()->language->id, 'brand')) { $metaData = new ArSeoProMetaData($this, $row, $brand, Context::getContext()->language->id); $metaData->prepareData(); $vars['metaData'] = $metaData; $content .= $this->render('head_meta.tpl', $vars); } } else { $meta = Meta::getMetaByPage($this->getControllerId(), Context::getContext()->language->id); if (!empty($meta)) { if ($row = ArSeoProMetaTable::getRowByRelation($meta['id_meta'], Context::getContext()->language->id, 'metapage')) { $model = new Meta($meta['id_meta'], Context::getContext()->language->id); $metaData = new ArSeoProMetaData($this, $row, $model, Context::getContext()->language->id); $metaData->prepareData(); $vars['metaData'] = $metaData; $content .= $this->render('head_meta.tpl', $vars); } } } if ($this->getCanonicalConfig()->enable) { $content .= $this->getCanonicalConfig()->getCanonicalData($params); } return $content; } public function registerFilters() { $smarty = Context::getContext()->smarty; $smarty->registerFilter('output', array(Module::getInstanceByName($this->name), 'parseTemplate')); } public function parseTemplate($output, $smarty = null) { return $this->jsonLDConfig->cleanUpMicrodata($output); } public function hookDisplayFooter($params) { if ($this->is16()) { return $this->hookDisplayBeforeBodyClosingTag($params); } } public function hookDisplayBeforeBodyClosingTag($params) { $content = array(); $this->jsonLDConfig->loadAllFromConfig(); if (!$this->jsonLDConfig->general->enable) { return null; } if ($this->jsonLDConfig->general->cleanup) { $this->registerFilters(); } if ($this->jsonLDConfig->general->breadcrumbs && method_exists(Context::getContext()->controller, 'getBreadcrumbLinks') && is_callable(array(Context::getContext()->controller, 'getBreadcrumbLinks'))) { try { $breadcrumbs = Context::getContext()->controller->getBreadcrumbLinks(); $breadcrumbsData = $this->jsonLDConfig->buildBreadcrumbsJson($breadcrumbs); $content[] = $this->render('jsonld.tpl', array( 'jsonData' => json_encode($breadcrumbsData, JSON_UNESCAPED_UNICODE) )); } catch (Exception $e) { // some exception. Ignore it } } if ((Context::getContext()->controller instanceof ProductController || Context::getContext()->controller instanceof ProductControllerCore) && $this->jsonLDConfig->product->enable) { $product = Context::getContext()->controller->getProduct(); if ($product) { $ipa = Tools::getValue('id_product_attribute')? Tools::getValue('id_product_attribute') : $product->cache_default_attribute; $jsonData = $this->jsonLDConfig->buildProductJson($product, $ipa); $content[] = $this->render('jsonld.tpl', array( 'jsonData' => json_encode($jsonData, JSON_UNESCAPED_UNICODE) )); } } if ($this->is17()) { if (Context::getContext()->controller instanceof ProductListingFrontController && $this->jsonLDConfig->product->enable_list && !empty($this->productListJson)) { $content[] = $this->render('jsonld.tpl', array( 'jsonData' => json_encode($this->productListJson, JSON_UNESCAPED_UNICODE) )); } } elseif ($this->is16()) { if (Context::getContext()->controller instanceof CategoryController && $this->jsonLDConfig->product->enable_list && !empty($this->productListJson)) { $content[] = $this->render('jsonld.tpl', array( 'jsonData' => json_encode($this->productListJson, JSON_UNESCAPED_UNICODE) )); } } if ($this->jsonLDConfig->general->store) { $storeData = $this->jsonLDConfig->buildStoreJson(); $content[] = $this->render('jsonld.tpl', array( 'jsonData' => json_encode($storeData) )); } return implode(PHP_EOL, $content); } public function hookActionProductSearchAfter($params) { if ($this->is17() && isset($params['result'])) { $this->jsonLDConfig->loadAllFromConfig(); if (!$this->jsonLDConfig->general->enable || !$this->jsonLDConfig->product->enable_list) { return null; } $this->productListJson = $this->jsonLDConfig->buildProductListJson($params['result']->getProducts()); } } public function hookActionProductListModifier($params) { if ($this->is16() && isset($params['cat_products'])) { $this->jsonLDConfig->loadAllFromConfig(); if (!$this->jsonLDConfig->general->enable) { return null; } $this->productListJson = $this->jsonLDConfig->buildProductListJson($params['cat_products']); } } public function hookActionAdminMetaAfterWriteRobotsFile($params) { if (isset($params['write_fd']) && $params['write_fd']) { if (!Shop::isFeatureActive()) { $host = Tools::getHttpHost(Configuration::get('PS_SSL_ENABLED')); fwrite($params['write_fd'], "\n" . 'Host: ' . $host . "\n"); } $generator = new ArSeoProSitemapGenerator($this, Context::getContext()->shop->id); $generator->setIndexPath($this->getIndexSitemapPath(false)); $generator->updateRobots(); } } public function hookDisplayAdminNavBarBeforeEnd($params) { $moduleConfig = false; $productForm = false; $controller = $this->context->controller; if ($controller instanceof AdminModulesController || $controller instanceof AdminModulesControllerCore) { if (Tools::getValue('configure') == $this->name) { $moduleConfig = true; } } if (isset($controller->php_self) && $controller->php_self == 'AdminProducts') { $productForm = true; } return $this->render('admin_head.tpl', array( 'path' => $this->getPath(), 'arSEOAjaxURL' => $this->context->link->getAdminLink('AdminArSeoUrls'), 'moduleConfig' => $moduleConfig, 'productForm' => $productForm )); return null; } /** * * @return ArSeoProUrls */ public function getUrlConfig() { return $this->urlConfig; } /** * * @return ArSeoProMeta */ public function getMetaConfig() { return $this->metaConfig; } /** * * @return ArSeoProFavicon */ public function getFaviconConfig() { return $this->faviconConfig; } /** * * @return ArSeoProRedirects */ public function getRedirectsConfig() { if (!$this->redirectsConfig->isLoaded()) { $this->redirectsConfig->loadFromConfig(); } return $this->redirectsConfig; } /** * * @return ArSeoProCanonical */ public function getCanonicalConfig() { if (!$this->canonicalConfig->isLoaded()) { $this->canonicalConfig->loadFromConfig(); } return $this->canonicalConfig; } public function hookActionDispatcher($params) { return $this->urlConfig->dispatcher($params); } public function hookModuleRoutes($params) { if (!$this->routesDisabled) { return $this->urlConfig->getRoutes($params); } } public function disableRoutes($value) { $this->routesDisabled = $value; } /** * * @return ArSeoProInstaller */ public function getInstaller() { if (!$this->installer) { $this->installer = new ArSeoProInstaller($this); } return $this->installer; } public function install() { return $this->getInstaller()->prepareOverrides() && parent::install() && $this->getInstaller()->install(); } public function uninstall() { return parent::uninstall() && $this->getInstaller()->uninstall(); } public function getForms() { return array( $this->urlConfig->general, $this->urlConfig->product, $this->urlConfig->category, $this->urlConfig->manufacturer, $this->urlConfig->supplier, $this->urlConfig->cms, $this->urlConfig->cmsCategory, $this->jsonLDConfig->general, $this->jsonLDConfig->product, $this->jsonLDConfig->advanced, $this->sitemapConfig->categories, $this->sitemapConfig->cms, $this->sitemapConfig->general, $this->sitemapConfig->manufacturers, $this->sitemapConfig->products, $this->sitemapConfig->suppliers, $this->sitemapConfig->meta, $this->sitemapConfig->smartblog, $this->sitemapConfig->prestablog, $this->sitemapConfig->simpleblog, $this->sitemapConfig->faqs, $this->faviconConfig, $this->canonicalConfig, $this->redirectsConfig ); } public function getContent() { if ((bool)Tools::getValue('clearGlobalCache')) { $this->clearGlobalCache(); $this->html .= $this->displayConfirmation($this->l('Cache cleared')); } if ($this->isSubmit()) { if ($this->postValidate()) { $this->postProcess(); } } $this->html .= $this->renderForm(); return $this->html; } public function isSubmit() { foreach ($this->getAllowedSubmits() as $submit) { if (Tools::isSubmit($submit)) { return true; } } } public function getAllowedSubmits() { $submits = array(); foreach ($this->getForms() as $model) { $submits[] = get_class($model); } return $submits; } public function postProcess() { foreach ($this->getForms() as $model) { if (Tools::isSubmit(get_class($model))) { $model->populate(); if ($model->saveToConfig()) { $this->html .= $this->displayConfirmation($this->l('Settings updated')); } else { $this->postValidate(); } } } } public function postValidate() { foreach ($this->getForms() as $model) { if (Tools::isSubmit(get_class($model))) { $model->loadFromConfig(); $model->populate(); if (!$model->validate()) { foreach ($model->getErrors() as $errors) { foreach ($errors as $error) { $this->html .= $this->displayError($error); } } return false; } return true; } } } public function renderForm() { $this->max_image_size = (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? : 0; $this->fields_form = array(); $helper->identifier = $this->identifier; $helper->submit_action = 'btnSubmit'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', true).'&configure=' .$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'fields_value' => $this->getConfigFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id, 'path' => $this->getPath(), ); $helper->base_folder = dirname(__FILE__); $helper->base_tpl = '/views/templates/admin/arseopro/helpers/form/form.tpl'; $nflLastTime = null; if ($time = Configuration::get('ARSEO_NFL_TIME')) { $nflLastTime = date('Y-m-d H:i:s', $time); } $categoriesHelper = new HelperTreeCategories('arseo-categories'); $categoriesHelper->setUseCheckBox(true); $sitemapCategoriesHelper = new HelperTreeCategories('arseo-sitemap-category-tree'); $sitemapCategoriesHelper->setUseCheckBox(true); //->setUseSearch(true); $metaCategoriesHelper = new HelperTreeCategories('arseo-meta-categories'); $metaCategoriesHelper->setUseCheckBox(true); $fbImageUploader = new HelperImageUploader('arseopro_fb_upload_image'); $fbImageUploader ->setMultiple(false) ->setTitle($this->l('Select file')) ->setUseAjax(true) ->setMaxFiles(1) ->setTemplateDirectory($this->getPath(true) . 'views/templates/admin/arseopro/helpers/uploader/') ->setUrl(Context::getContext()->link->getAdminLink('AdminArSeoMeta').'&ajax=1&action=uploadFbCustomImage'); $twImageUploader = new HelperImageUploader('arseopro_tw_upload_image'); $twImageUploader ->setMultiple(false) ->setTitle($this->l('Select file')) ->setUseAjax(true) ->setMaxFiles(1) ->setTemplateDirectory($this->getPath(true) . 'views/templates/admin/arseopro/helpers/uploader/') ->setUrl(Context::getContext()->link->getAdminLink('AdminArSeoMeta').'&ajax=1&action=uploadTwCustomImage'); $sql = 'SELECT id_category FROM `' . ArSeoProSitemapCategory::getTableName() . '` WHERE id_shop=' . (int)Context::getContext()->shop->id . ' AND `export`=1'; $categories = Db::getInstance()->executeS($sql); $selectedCategories = array(); foreach ($categories as $row) { $selectedCategories[] = $row['id_category']; } $sitemapCategoriesHelper->setSelectedCategories($selectedCategories); if (!$this->isDirectoryExists($this->getSitemapPath(Context::getContext()->shop->id))) { $this->createDirectory($this->getSitemapPath(Context::getContext()->shop->id)); } $dispatcher = Dispatcher::getInstance(); $context = Context::getContext(); $shops = self::getShops(); $langs = array(); foreach (Language::getLanguages() as $l) { $langs[$l['id_lang']] = $l; } if (!is_null($context) && isset($context->smarty) && !is_null($context->smarty)) { $context->smarty->assign(array( 'form' => $helper, 'urlGeneralFormParams' => array($this->getForm($this->urlConfig->general)), 'urlProductFormParams' => array($this->getForm($this->urlConfig->product)), 'urlCategoryFormParams' => array($this->getForm($this->urlConfig->category)), 'urlManufacturerFormParams' => array($this->getForm($this->urlConfig->manufacturer)), 'urlSupplierFormParams' => array($this->getForm($this->urlConfig->supplier)), 'urlCMSFormParams' => array($this->getForm($this->urlConfig->cms)), 'urlCMSCategoryFormParams' => array($this->getForm($this->urlConfig->cmsCategory)), 'jsonldGeneralFormParams' => array($this->getForm($this->jsonLDConfig->general)), 'jsonldProductFormParams' => array($this->getForm($this->jsonLDConfig->product)), 'jsonldAdvancedFormParams' => array($this->getForm($this->jsonLDConfig->advanced)), 'sitemapProductsFormParams' => array($this->getForm($this->sitemapConfig->products)), 'sitemapCategoriesFormParams' => array($this->getForm($this->sitemapConfig->categories)), 'sitemapManufacturersFormParams' => array($this->getForm($this->sitemapConfig->manufacturers)), 'sitemapSuppliersFormParams' => array($this->getForm($this->sitemapConfig->suppliers)), 'sitemapCMSFormParams' => array($this->getForm($this->sitemapConfig->cms)), 'sitemapGeneralFormParams' => array($this->getForm($this->sitemapConfig->general)), 'sitemapMetaFormParams' => array($this->getForm($this->sitemapConfig->meta)), 'sitemapSmartblogFormParams' => ArSeoProSitemap::isSmartBlogInstalled()? array($this->getForm($this->sitemapConfig->smartblog)) : null, 'sitemapPrestablogFormParams' => ArSeoProSitemap::isPrestaBlogInstalled()? array($this->getForm($this->sitemapConfig->prestablog)) : null, 'sitemapSimpleblogFormParams' => ArSeoProSitemap::isSimpleBlogInstalled()? array($this->getForm($this->sitemapConfig->simpleblog)) : null, 'sitemapFAQFormParams' => ArSeoProSitemap::isFAQsInstalled()? array($this->getForm($this->sitemapConfig->faqs)) : null, 'smartblogEnabled' => ArSeoProSitemap::isSmartBlogInstalled(), 'prestablogEnabled' => ArSeoProSitemap::isPrestaBlogInstalled(), 'simpleblogEnabled' => ArSeoProSitemap::isSimpleBlogInstalled(), 'FAQEnabled' => ArSeoProSitemap::isFAQsInstalled(), 'faviconFormParams' => array($this->getForm($this->faviconConfig)), 'canonicalFormParams' => array($this->getForm($this->canonicalConfig)), 'redirectsFormParams' => array($this->getForm($this->redirectsConfig)), 'sitemapConfig' => $this->sitemapConfig, 'link' => $this->context->link, 'path' => $this->getPath(), 'name' => $this->displayName, 'version' => $this->version, 'activeTab' => $this->getActiveTab(), 'activeSubTab' => $this->getActiveSubTab(), 'ajaxUrl' => $this->getAjaxUrl(), 'moduleUrl' => $this->getModuleBaseUrl(), 'serverUrl' => Tools::getShopDomainSsl(true), 'moduleId' => self::ADDONS_ID, 'authorId' => self::AUTHOR_ID, 'nflLastTime' => $nflLastTime, 'multishop' => Shop::isFeatureActive(), 'langs' => Language::getLanguages(), 'categoriesTree' => $categoriesHelper->render(), 'metaCategoriesTree' => $metaCategoriesHelper->render(), 'sitemapCategoriesHelper' => $sitemapCategoriesHelper->render(), 'id_shop' => Context::getContext()->shop->id, 'shops' => $shops, 'memoryLimit' => ini_get('memory_limit'), 'maxExecutionTime' => ini_get('max_execution_time'), 'target' => 'arseo-url-rule-form_rule', 'fbImageUploader' => $fbImageUploader->render(), 'twImageUploader' => $twImageUploader->render(), 'keywords' => self::getProductKeywords(), 'max_image_size' => (int)$this->max_image_size, 'maxImageSize' => $this->formatBytes((int)$this->max_image_size), 'twitterTypes' => $this->getTwitterTypes(), 'languages' => $this->context->controller->getLanguages(), 'defaultFormLanguage' => (int)(Configuration::get('PS_LANG_DEFAULT')), 'sitemapDir' => $this->getSitemapPath(Context::getContext()->shop->id), 'sitemapIndexDir' => $this->getIndexSitemapPath(), 'sitemapDirWritable' => is_writable($this->getSitemapPath(Context::getContext()->shop->id)), 'indexSitemapDirWriteable' => is_writable($this->getIndexSitemapPath(true)), 'sitemapCronUrl' => $this->getSitemapCronUrl(Context::getContext()->shop->id), 'multishop' => Shop::isFeatureActive(), 'currentShopId' => Context::getContext()->shop->id, 'currentShopSitemapToken' => Configuration::get('ARSEO_SITEMAP_TOKEN', null, null, Context::getContext()->shop->id), 'metaPages' => $this->getMetaPages(), 'isRootWriteable' => is_writable(_PS_ROOT_DIR_), 'isRootSitemapWriteable' => is_writable($this->normalizePath(_PS_ROOT_DIR_ . '/sitemaps/')), 'psRootDir' => _PS_ROOT_DIR_, 'overridesDisabled' => Configuration::get('PS_DISABLE_OVERRIDES'), 'preformanceSettingsUrl' => $this->context->link->getAdminLink('AdminPerformance'), 'overridesVersion' => $this->getOverridesVersion(), 'arSEOProVersion' => $this->version, 'routes' => method_exists($dispatcher, 'getRoutes') ? $dispatcher->getRoutes() : false, 'langs' => $langs )); return $this->display(__FILE__, 'config.tpl'); } } public function getMetaPages() { $sql = 'SELECT * FROM `' . _DB_PREFIX_ . 'meta` m ' . 'LEFT JOIN `' . _DB_PREFIX_ . 'meta_lang` ml ON m.id_meta = ml.id_meta ' . 'WHERE m.page NOT IN("pagenotfound", "addresses", "discount", "history", "identity", "my-account", "order-follow", "order-slip", "attachment") ' . 'AND ((ml.url_rewrite IS NOT NULL AND ml.url_rewrite != "") OR m.page = "index")' . 'AND ml.id_lang = ' . (int)Context::getContext()->language->id . ' AND ml.id_shop = ' . (int)Context::getContext()->shop->id; $res = Db::getInstance()->executeS($sql); foreach ($res as $k => $page) { $res[$k]['url'] = Context::getContext()->link->getPageLink($page['page'], null, Context::getContext()->language->id); } return $res; } public function getShops() { if (Shop::isFeatureActive()) { $shops = Shop::getShops(); } else { $shops = array(Shop::getShop(Context::getContext()->shop->id)); } foreach ($shops as $k => $shop) { $shops[$k]['sitemapCronUrl'] = $this->getSitemapCronUrl($shop['id_shop']); $shops[$k]['sitemapUrl'] = $this->getIndexSitemapUrl($shop['id_shop']); $lastgen = Configuration::get('ARSEO_SITEMAP_GEN', null, null, $shop['id_shop']); $shops[$k]['sitemapLastegen'] = $lastgen? date('Y-m-d H:i:s', $lastgen) : null; $shops[$k]['sitemap_token'] = Configuration::get('ARSEO_SITEMAP_TOKEN', null, null, $shop['id_shop']); } return $shops; } public function getLanguages($active = true, $id_shop = false) { if (self::$langs === null) { $languages = Language::getLanguages($active, $id_shop); self::$langs = array(); if ($languages) { foreach ($languages as $language) { self::$langs[] = (int)$language['id_lang']; } } } return self::$langs; } public 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); $bytes /= pow(1024, $pow); return round($bytes, $precision) . ' ' . $units[$pow]; } public function getRedirect($id) { return new ArSeoProRedirectTable($id); } public function redirect() { if (Configuration::get('ARSR_ENABLE')) { $uri = $_SERVER['REQUEST_URI']; $url = $this->getShopDomain() . $uri; $shopId = Context::getContext()->shop->id; $lang = Context::getContext()->language->iso_code; $sql = 'SELECT * FROM '._DB_PREFIX_.'arseopro_redirect '. 'WHERE `from` = "'.pSQL($uri).'" OR `from` = "' . pSQL($url) . '" ' . 'AND id_shop IN(0, '.(int)$shopId.') '. 'AND status = 1 ' . 'ORDER BY id_redirect DESC'; if (!$redirect = Db::getInstance()->getRow($sql)) { $uri = preg_replace("{^/{$lang}/}is", '/{lang}/', $uri); $url = $this->getShopDomain() . $uri; $sql = 'SELECT * FROM '._DB_PREFIX_.'arseopro_redirect '. 'WHERE `from` = "'.pSQL($uri).'" OR `from` = "' . pSQL($url) . '" '. 'AND id_shop IN(0, '.(int)$shopId.') '. 'AND status = 1 ' . 'ORDER BY id_redirect DESC'; $redirect = Db::getInstance()->getRow($sql); } if ($redirect) { $model = $this->getRedirect($redirect['id_redirect']); $headers = array( $model->getRedirectHeader() ); if (Configuration::get('ARSR_DEBUG')) { echo 'Rule ID: ' . $model->id . '
'; echo 'Rule: ' . $model->from . '
'; echo 'Redirect type: ' . $model->getRedirectHeader() . '
'; echo 'Redirect to: ' . $model->getRedirectToUrl($lang) . ''; die(); } $model->use_times ++; $model->last_used_at = date('Y-m-d H:i:s'); Tools::redirect($model->getRedirectToUrl($lang), __PS_BASE_URI__, null, $headers); } } } public function render($file, $params = array()) { $context = Context::getContext(); if (!is_null($context) && isset($context->smarty) && !is_null($context->smarty)) { $context->smarty->assign($params); return $this->display(__FILE__, $file); } } public function getActiveTab() { foreach ($this->getForms() as $model) { if (Tools::isSubmit(get_class($model))) { return $model::getConfigTab(); } } if (Tools::getValue('activeTab')) { return Tools::getValue('activeTab'); } return null; } public function getActiveSubTab() { foreach ($this->getForms() as $model) { if (Tools::isSubmit(get_class($model))) { return get_class($model); } } return null; } public function getFormConfigs() { $configs = array(); foreach ($this->getForms() as $form) { $configs[] = $this->getForm($form); } return $configs; } public function getForm($model) { $model->populate(); $model->validate(false); $config = $model->getFormHelperConfig(); return array( 'form' => array( 'name' => get_class($model), 'legend' => array( 'title' => $model->getFormTitle(), 'icon' => $model->getFormIcon() ), 'input' => $config, 'submit' => array( 'name' => get_class($model), 'class' => $this->is15()? 'button' : null, 'title' => $this->l('Save'), ) ) ); } public function getAjaxUrl() { return array( 'default' => $this->context->link->getAdminLink('AdminArSeo'), 'url' => $this->context->link->getAdminLink('AdminArSeoUrls'), 'meta' => $this->context->link->getAdminLink('AdminArSeoMeta'), 'redirect' => $this->context->link->getAdminLink('AdminArSeoRedirects'), 'sitemap' => $this->context->link->getAdminLink('AdminArSeoSitemap'), 'sitemapProduct' => $this->context->link->getAdminLink('AdminArSeoSitemapProduct'), 'sitemapSupplier' => $this->context->link->getAdminLink('AdminArSeoSitemapSupplier'), 'sitemapManufacturer' => $this->context->link->getAdminLink('AdminArSeoSitemapManufacturer'), 'sitemapCms' => $this->context->link->getAdminLink('AdminArSeoSitemapCms'), 'sitemapMeta' => $this->context->link->getAdminLink('AdminArSeoSitemapMeta'), 'sitemapCategory' => $this->context->link->getAdminLink('AdminArSeoSitemapCategory'), 'robots' => $this->context->link->getAdminLink('AdminArSeoRobots'), 'sitemapGenerate' => $this->getSitemapCronUrl(null, true, true) ); } public function getSitemapCronUrl($id_shop, $relative = false, $noToken = false) { if ($id_shop == null) { if ($noToken) { $url = Context::getContext()->link->getModuleLink($this->name, 'ajax'); } else { $url = Context::getContext()->link->getModuleLink($this->name, 'ajax') . '?token=' . Configuration::get('ARSEO_SITEMAP_TOKEN', null, null, $id_shop); } } else { if ($noToken) { $url = Context::getContext()->link->getModuleLink($this->name, 'ajax') . '?id_shop=' . $id_shop; } else { $url = Context::getContext()->link->getModuleLink($this->name, 'ajax') . '?id_shop=' . $id_shop . '&token=' . ConfigurationCore::get('ARSEO_SITEMAP_TOKEN', null, null, $id_shop); } } if (!$relative) { return $url; } return preg_replace('{https?://.*?/}is', '/', $url); } public function getUploadPath() { $path = dirname(__FILE__) . '/uploads/'; if (!is_dir($path)) { mkdir($path, 0755, true); } return $path; } public function getUploadsUrl() { return $this->getModuleBaseUrl() . 'uploads/'; } public function getConfigFieldsValues() { $values = array(); foreach ($this->getForms() as $model) { $model->loadFromConfig(); $model->populate(); foreach ($model->getAttributes() as $attr => $value) { $values[$model->getConfigAttribueName($attr)] = $value; } } return $values; } public function getTwitterTypes() { return array( 'summary' => $this->l('Summary'), 'summary_large_image' => $this->l('Summary with large image') ); } public static function getProductKeywords() { return array( 'name' => 'Product name', 'description' => 'Product description', 'description_short' => 'Product short description', 'reference' => 'Product reference', 'manufacturer' => 'Product manufacturer', 'features' => 'Product features', 'default_cat_name' => 'Product category name', 'category_list' => 'All product categories', 'price' => 'Product retail price', 'reduce_price' => 'Product specific price', 'price_wt' => 'Product pre-tax retail price', 'reduce_price_wt' => 'Product pre-tax specific price', 'reduction_percent' => 'Product reduction percent', 'shop_name' => 'Shop name' ); } public static function getCategoryKeywords() { return array( 'name' => 'Category name', 'description' => 'Category description', 'meta_title' => 'Category meta title', 'meta_description' => 'Category meta description', 'meta_keywords' => 'Category meta keywords', 'parent_category' => 'Parent category', 'parent_categories' => 'All parent categories', 'shop_name' => 'Shop name' ); } public static function getMetaKeywords() { return array( 'meta_title' => 'Page meta title', 'meta_description' => 'Page meta description', 'meta_keywords' => 'Page meta keywords', 'shop_name' => 'Shop name' ); } public static function getBrandKeywords() { return array( 'meta_title' => 'Page meta title', 'meta_description' => 'Page meta description', 'meta_keywords' => 'Page meta keywords', 'name' => 'Manufacturer name', 'short_description' => 'Manufacturer short description', 'description' => 'Manufacturer description', 'shop_name' => 'Shop name' ); } public function getShopDomain() { $ssl = (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')); $shop = Context::getContext()->shop; $base = ($ssl ? 'https://' . $shop->domain_ssl : 'http://' . $shop->domain); return $base; } public function hookActionObjectProductUpdateBefore($params) { if ($this->getRedirectsConfig()->auto_create) { if (isset($params['object']) && $params['object']) { $product = $params['object']; if ($product instanceof Product || $product instanceof ProductCore) { $category = Category::getLinkRewrite((int) $product->id_category_default, (int)Context::getContext()->language->id); $oldProduct = new Product($product->id, true); $oldCategory = Category::getLinkRewrite((int) $oldProduct->id_category_default, (int)Context::getContext()->language->id); $shopDomain = $this->getShopDomain(); foreach (Language::getLanguages() as $lang) { $link = Context::getContext()->link->getProductLink($product, $product->link_rewrite[$lang['id_lang']], $category, null, (int)$lang['id_lang']); $oldLink = Context::getContext()->link->getProductLink($oldProduct, $oldProduct->link_rewrite[$lang['id_lang']], $oldCategory, null, (int)$lang['id_lang']); $link = str_replace($shopDomain, '', $link); $oldLink = str_replace($shopDomain, '', $oldLink); if ($link != $oldLink) { $sql = 'DELETE FROM `' . _DB_PREFIX_ . ArSeoProRedirectTable::TABLE_NAME . '` WHERE `from` = "' . pSQL($link) . '"'; Db::getInstance()->execute($sql); $model = new ArSeoProRedirectTable(); $model->from = pSQL($oldLink); $model->to = pSQL($link); $model->type = 302; $model->status = 1; $model->id_shop = Context::getContext()->shop->id; $model->created_at = date('Y-m-d H:i:s'); $model->save(); } } } } } } public function hookActionProductUpdate($params) { if ($this->getCanonicalConfig()->enable && $this->getCanonicalConfig()->product) { $id_product = (int) Tools::getValue('id_product'); $urls = array(); foreach (Language::getLanguages() as $language) { $urls[$language['id_lang']] = Tools::getValue('ARSEO_customCanonical_' . $language['id_lang']); } $active = Tools::getValue('ARSEO_customCanonicalActive'); ArSeoProCanonicalProduct::deleteCanonicalURL($id_product); foreach ($urls as $id_lang => $url) { if (!empty($url)) { ArSeoProCanonicalProduct::addCanonicalURL($id_product, $url, $active, $id_lang); } } } } public function hookDisplayAdminProductsSeoStepBottom($params) { if ($this->getCanonicalConfig()->enable && $this->getCanonicalConfig()->product) { if ($this->is17()) { $id_product = $params['id_product']; } else { $id_product = (int) Tools::getValue('id_product'); } $active = 0; $rows = ArSeoProCanonicalProduct::getCanonicalURL($id_product); $productCanonical = array(); foreach ($rows as $row) { $productCanonical[$row['id_lang']] = $row['url']; if ($row['active'] != 0) { $active = 1; } } $data = array( 'product_canonical' => $productCanonical, 'active' => $active, 'default_form_language' => $this->context->language->id, 'languages' => Language::getLanguages(), 'current_url' => $this->context->link->getAdminLink('AdminProducts'), ); return $this->render('canonical_product.tpl', $data); } } public function hookDisplayBackOfficeCategory($params) { if ($this->getCanonicalConfig()->enable && $this->getCanonicalConfig()->category) { $id_category = Tools::getValue("id_category"); if (($id_category == null || $id_category =='') && $params['request'] != null) { $id_category = (int)$params['category']->id_category != null ? (int)$params['category']->id_category : (int) Tools::getValue('id_category'); if (!$id_category) { $id_category = $params['request']->get('categoryId'); } } if ($id_category != null && $id_category != '') { $rows = ArSeoProCanonicalCategory::getCanonicalURL($id_category); } else { $rows = array(); } $active = 0; $category_canonical = array(); foreach ($rows as $row) { $category_canonical[$row['id_lang']] = $row['url']; if ($row['active'] != 0) { $active = 1; } } $language = new Language($this->context->controller->default_form_language); $data = array( 'category_canonical' => $category_canonical, 'active' => $active, 'default_form_language' => $this->context->controller->default_form_language, 'languages' => $this->context->controller->_languages, 'languageObj' => $language, ); if ($this->is176()) { return $this->render('canonical_category176.tpl', $data); } else { return $this->render('canonical_category.tpl', $data); } } } public function hookActionCategoryUpdate($params) { if ($this->getCanonicalConfig()->enable && $this->getCanonicalConfig()->category) { $id_category = (int)$params['category']->id_category != null ? (int)$params['category']->id_category : (int) Tools::getValue('id_category'); $urls = array(); foreach (Language::getLanguages() as $language) { $urls[$language['id_lang']] = Tools::getValue('ARSEO_customCanonical_' . $language['id_lang']); } $active = Tools::getValue('ARSEO_customCanonicalActive'); ArSeoProCanonicalCategory::deleteCanonicalURL($id_category); foreach ($urls as $id_lang => $url) { if (!empty($url)) { ArSeoProCanonicalCategory::addCanonicalURL($id_category, $url, $active, $id_lang); } } } } public function hookActionObjectProductAddAfter($params) { if (!$this->active) { return ; } if (!empty($params['object'])) { $product = $params['object']; $defCategory = $product->getDefaultCategory(); $id_shop = Context::getContext()->shop->id; if ($rules = ArSeoProRuleTable::getRules($defCategory, null, $id_shop)) { foreach ($rules as $row) { $rule = new ArSeoProRuleTable($row['id_rule']); $this->generateProductRewrite($rule, $product->id); } } if ($metaRules = ArSeoProMetaTable::getRules('product', $defCategory, null, $id_shop)) { foreach ($metaRules as $row) { $rule = new ArSeoProMetaTable($row['id_rule']); $this->generateProductMeta($rule, $product->id); } } } } public function hookActionObjectProductUpdateAfter($params) { return $this->hookActionObjectProductAddAfter($params); } public function generateProductRewrite(ArSeoProRuleTable $rule, $id) { $meta = array(); $langs = array(); if ($rule->id_lang == 0) { foreach (Language::getLanguages() as $lang) { $langs[] = $lang['id_lang']; } } else { $langs[] = $rule->id_lang; } foreach ($langs as $id_lang) { $meta[$id_lang] = $this->generateProductRewriteForLang($rule, $id, $id_lang); } return $meta; } public function generateProductRewriteForLang(ArSeoProRuleTable $rule, $id, $id_lang) { $product = new Product($id, false, $id_lang); $metaData = new ArSeoProMetaData($this, get_object_vars($rule), $product, $id_lang); $metaData->prepareData(array('rule'), false); $link_rewrite = strip_tags($this->toLinkRewrite($metaData->rule)); if ($product->link_rewrite != $link_rewrite) { $sql = 'UPDATE `' . _DB_PREFIX_ . "product_lang` SET `link_rewrite` = '" . bqSQL($link_rewrite) . "' WHERE id_product = " . (int)$id . ' AND id_lang = ' . (int)$id_lang . ' AND id_shop = ' . (int)$rule->id_shop; Db::getInstance()->execute($sql); } return $metaData; } public function toLinkRewrite($str) { return Tools::link_rewrite($str); } public function generateProductMeta(ArSeoProMetaTable $rule, $id) { $meta = array(); $langs = array(); if ($rule->id_lang == 0) { foreach (Language::getLanguages() as $lang) { $langs[] = $lang['id_lang']; } } else { $langs[] = $rule->id_lang; } foreach ($langs as $id_lang) { $meta[$id_lang] = $this->generateProductMetaForLang($rule, $id, $id_lang); } return $meta; } public function generateProductMetaForLang(ArSeoProMetaTable $rule, $id, $id_lang) { $product = new Product($id, false, $id_lang); $metaData = new ArSeoProMetaData($this, get_object_vars($rule), $product, $id_lang); $metaData->prepareData(array('meta_title', 'meta_description', 'meta_keywords'), false); if ($product->meta_title != bqSQL($metaData->meta_title) || $product->meta_description != bqSQL($metaData->meta_description) || $product->meta_keywords != bqSQL($metaData->meta_keywords)) { $sql = 'UPDATE `' . _DB_PREFIX_ . "product_lang` SET `meta_title` = '" . bqSQL($metaData->meta_title) . "', `meta_description` = '" . bqSQL($metaData->meta_description) . "', `meta_keywords` = '" . bqSQL($metaData->meta_keywords) . "' WHERE id_product = " . (int)$id . ' AND id_lang = ' . (int)$id_lang . ' AND id_shop = ' . (int)$rule->id_shop; Db::getInstance()->execute($sql); } return $metaData; } public function generateCategoryMeta(ArSeoProMetaTable $rule, $id) { $meta = array(); $langs = array(); if ($rule->id_lang == 0) { foreach (Language::getLanguages() as $lang) { $langs[] = $lang['id_lang']; } } else { $langs[] = $rule->id_lang; } foreach ($langs as $id_lang) { $meta[$id_lang] = $this->generateCategoryMetaForLang($rule, $id, $id_lang); } return $meta; } public function generateMetaPageMeta(ArSeoProMetaTable $rule, $id) { $meta = array(); $langs = array(); if ($rule->id_lang == 0) { foreach (Language::getLanguages() as $lang) { $langs[] = $lang['id_lang']; } } else { $langs[] = $rule->id_lang; } foreach ($langs as $id_lang) { $meta[$id_lang] = $this->generateMetaPageMetaForLang($rule, $id, $id_lang); } return $meta; } public function generateMetaPageMetaForLang(ArSeoProMetaTable $rule, $id, $id_lang) { $meta = new Meta($id, $id_lang); $metaData = new ArSeoProMetaData($this, get_object_vars($rule), $meta, $id_lang); $metaData->prepareData(array('meta_title', 'meta_description', 'meta_keywords'), false); $update = array(); if (!empty($metaData->meta_title)) { $update[] = "`title` = '" . bqSQL($metaData->meta_title) . "'"; } if (!empty($metaData->meta_description)) { $update[] = "`description` = '" . bqSQL($metaData->meta_description) . "'"; } if (!empty($metaData->meta_keywords)) { $update[] = "`keywords` = '" . bqSQL($metaData->meta_keywords) . "'"; } if ($update) { if ($meta->title != bqSQL($metaData->meta_title) || $meta->description != bqSQL($metaData->meta_description) || $meta->keywords != bqSQL($metaData->meta_keywords)) { $sql = 'UPDATE `' . _DB_PREFIX_ . "meta_lang` " . "SET " . implode(', ', $update) . " " . "WHERE id_meta = " . (int)$id . ' AND id_lang = ' . (int)$id_lang . ' AND id_shop = ' . (int)$rule->id_shop; Db::getInstance()->execute($sql); } } return $metaData; } public function generateBrandMeta(ArSeoProMetaTable $rule, $id) { $meta = array(); $langs = array(); if ($rule->id_lang == 0) { foreach (Language::getLanguages() as $lang) { $langs[] = $lang['id_lang']; } } else { $langs[] = $rule->id_lang; } foreach ($langs as $id_lang) { $meta[$id_lang] = $this->generateBrandMetaForLang($rule, $id, $id_lang); } return $meta; } public function generateBrandMetaForLang(ArSeoProMetaTable $rule, $id, $id_lang) { $brand = new Manufacturer($id, $id_lang); $metaData = new ArSeoProMetaData($this, get_object_vars($rule), $brand, $id_lang); $metaData->prepareData(array('meta_title', 'meta_description', 'meta_keywords'), false); $update = array(); if (!empty($metaData->meta_title)) { $update[] = "`meta_title` = '" . bqSQL($metaData->meta_title) . "'"; } if (!empty($metaData->meta_description)) { $update[] = "`meta_description` = '" . bqSQL($metaData->meta_description) . "'"; } if (!empty($metaData->meta_keywords)) { $update[] = "`meta_keywords` = '" . bqSQL($metaData->meta_keywords) . "'"; } if ($update) { if ($brand->meta_title != bqSQL($metaData->meta_title) || $brand->meta_description != bqSQL($metaData->meta_description) || $brand->meta_keywords != bqSQL($metaData->meta_keywords)) { $sql = 'UPDATE `' . _DB_PREFIX_ . "manufacturer_lang` " . "SET " . implode(', ', $update) . " " . "WHERE id_manufacturer = " . (int)$id . ' AND id_lang = ' . (int)$id_lang; Db::getInstance()->execute($sql); } } return $metaData; } public function generateCategoryMetaForLang(ArSeoProMetaTable $rule, $id, $id_lang) { $category = new Category($id, $id_lang); $metaData = new ArSeoProMetaData($this, get_object_vars($rule), $category, $id_lang); $metaData->prepareData(array('meta_title', 'meta_description', 'meta_keywords'), false); if ($category->meta_title != bqSQL($metaData->meta_title) || $category->meta_description != bqSQL($metaData->meta_description) || $category->meta_keywords != bqSQL($metaData->meta_keywords)) { $sql = 'UPDATE `' . _DB_PREFIX_ . "category_lang` SET `meta_title` = '" . bqSQL($metaData->meta_title) . "', `meta_description` = '" . bqSQL($metaData->meta_description) . "', `meta_keywords` = '" . bqSQL($metaData->meta_keywords) . "' WHERE id_category = " . (int)$id . ' AND id_lang = ' . (int)$id_lang . ' AND id_shop = ' . (int)$rule->id_shop; Db::getInstance()->execute($sql); } return $metaData; } public function is15() { if ((version_compare(_PS_VERSION_, '1.5.0', '>=') === true) && (version_compare(_PS_VERSION_, '1.6.0', '<') === true)) { return true; } return false; } public function is16() { if ((version_compare(_PS_VERSION_, '1.6.0', '>=') === true) && (version_compare(_PS_VERSION_, '1.7.0', '<') === true)) { return true; } return false; } public function is17() { if ((version_compare(_PS_VERSION_, '1.7.0', '>=') === true) && (version_compare(_PS_VERSION_, '1.8.0', '<') === true)) { return true; } return false; } public function is174() { if ((version_compare(_PS_VERSION_, '1.7.4', '>=') === true) && (version_compare(_PS_VERSION_, '1.8.0', '<') === true)) { return true; } return false; } public function is176() { if ((version_compare(_PS_VERSION_, '1.7.6', '>=') === true) && (version_compare(_PS_VERSION_, '1.8.0', '<') === true)) { return true; } return false; } public function is178x() { if ((version_compare(_PS_VERSION_, '1.7.8', '>=') === true) && (version_compare(_PS_VERSION_, '1.8.0', '<') === true)) { return true; } return false; } public function getSitemapPath($id_shop, $abs = true) { $path = $this->normalizePath($this->getSitemapBasePath($abs) . '/sitemaps/shop_' . $id_shop . '/'); if ($abs && !is_dir($path)) { @mkdir($path, 0777, true); } return $abs? $path : '/sitemaps/shop_' . $id_shop . '/'; } public function normalizePath($path) { $path = preg_replace('{\/+}is', '/', $path); return str_replace(':/', '://', $path); } public function getIndexSitemapUrl($id_shop) { return $this->normalizePath($this->getBaseUrl($id_shop) . $this->getSitemapBasePath(false) . '/' . $this->getIndexSitemapPath(false) . 'sitemap_shop_' . $id_shop . '.xml'); } public function getIndexSitemapPath($abs = true) { if (is_writable(_PS_ROOT_DIR_)) { return $abs? _PS_ROOT_DIR_ : '/'; } else { return $abs? ($this->normalizePath($this->getPath(true) . '/sitemaps/')) : '/sitemaps/'; } } public function getRootPath($abs = true) { return $abs? _PS_ROOT_DIR_ : '/'; } public function getSitemapBasePath($abs) { $absPath = $this->normalizePath($this->getRootPath(true) . '/'); $relPath = $this->normalizePath($this->getRootPath(false) . '/'); if (!is_dir($absPath)) { mkdir($absPath, 0777, true); } if (is_writable($absPath)) { return $abs? $absPath : $relPath; } $absPath = $this->normalizePath($this->getPath(true) . '/'); $relPath = $this->normalizePath($this->getPath(false) . '/'); if (!is_dir($absPath)) { mkdir($absPath, 0777, true); } return $abs? $absPath : $relPath; } public function getPath($abs = false) { if ($abs) { return _PS_MODULE_DIR_ . $this->name . '/'; } return $this->_path; } public function isWritable($dir) { return is_writable($this->getPath(true) . $dir); } public function isDirectoryExists($dir) { return is_dir($this->getPath(true) . $dir); } public function createDirectory($dir) { return mkdir($this->getPath(true) . $dir, 0777, true); } public function getBaseUrl($id_shop = null) { return ArSeoProTools::getShopDomainSsl($id_shop, true, true).__PS_BASE_URI__ . '/'; } public function getModuleBaseUrl($id_shop = null) { return ArSeoProTools::getShopDomainSsl($id_shop, true, true).__PS_BASE_URI__ . 'modules/' . $this->name . '/'; } public function smartyAssign($var) { $this->context->smarty->assign($var); } public function clearGlobalCache() { Tools::clearSmartyCache(); Tools::clearXMLCache(); Media::clearCache(); if (method_exists('Tools', 'generateIndex')) { Tools::generateIndex(); } return true; } }