* @copyright 2007-2011 PrestaShop SA * @version Release: $Revision: 7445 $ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class AdminMeta extends AdminTab { public $table = 'meta'; public $className = 'Meta'; public $lang = true; public $edit = true; public $delete = true; public function __construct() { parent::__construct(); $this->fieldsDisplay = array( 'id_meta' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), 'page' => array('title' => $this->l('Page'), 'width' => 120), 'title' => array('title' => $this->l('Title'), 'width' => 120), 'url_rewrite' => array('title' => $this->l('Friendly URL'), 'width' => 120) ); $this->_group = 'GROUP BY a.id_meta'; $this->optionsList = array( 'general' => array( 'title' => $this->l('URLs Setup'), 'fields' => array( 'PS_REWRITING_SETTINGS' => array('title' => $this->l('Friendly URL'), 'desc' => $this->l('Enable only if your server allows URL rewriting (recommended)').'
'.$this->l('If you turn on this feature, you must').' '.$this->l('generate a .htaccess file').'
', 'validation' => 'isBool', 'cast' => 'intval', 'type' => 'bool'), 'PS_CANONICAL_REDIRECT' => array('title' => $this->l('Automatically redirect to Canonical url'), 'desc' => $this->l('Recommended but your theme must be compliant'), 'validation' => 'isBool', 'cast' => 'intval', 'type' => 'bool'), ), ), 'routes' => array( 'title' => $this->l('Schema of URLs'), 'description' => $this->l('You can change here the pattern of your links. There are some available keywords for each route listed below, keywords with * are required. To add a keyword in URL use {keyword} syntax. You can add some text before or after the keyword IF the keyword is not empty with syntax {prepend:keyword:append}, for example {-hey-:meta_title} will add "-hey-my-title" in URL if meta title is set, or nothing. Friendly URL and rewriting Apache option must be activated on your web server to use this functionality.'), 'fields' => array(), ), ); // Display route options only if friendly URL is activated if (Configuration::get('PS_REWRITING_SETTINGS')) { $this->addFieldRoute('product_rule', $this->l('Route to products')); $this->addFieldRoute('category_rule', $this->l('Route to category')); $this->addFieldRoute('supplier_rule', $this->l('Route to supplier')); $this->addFieldRoute('manufacturer_rule', $this->l('Route to manufacturer')); $this->addFieldRoute('cms_rule', $this->l('Route to CMS page')); $this->addFieldRoute('cms_category_rule', $this->l('Route to CMS category')); } } public function addFieldRoute($routeID, $title) { $keywords = array(); foreach (Dispatcher::getInstance()->defaultRoutes[$routeID]['keywords'] as $keyword => $data) $keywords[] = ((isset($data['param'])) ? ''.$keyword.'*' : $keyword); $this->optionsList['routes']['fields']['PS_ROUTE_'.$routeID] = array( 'title' => $title, 'desc' => sprintf($this->l('Keywords: %s'), implode(', ', $keywords)), 'validation' => 'isString', 'type' => 'text', 'size' => 70, 'defaultValue' => Dispatcher::getInstance()->defaultRoutes[$routeID]['rule'], ); } public function displayForm($isMainTab = true) { parent::displayForm(); if (!($meta = $this->loadObject(true))) return; $files = Meta::getPages(true, ($meta->page ? $meta->page : false)); echo ' '; } public function postProcess() { if (Tools::isSubmit('submitAddmeta')) { $langs = Language::getLanguages(true); $default_language = Configuration::get('PS_LANG_DEFAULT'); if (Tools::getValue('page') != 'index') { $defaultLangIsValidated = Validate::isLinkRewrite(Tools::getValue('url_rewrite_'.$default_language)); $englishLangIsValidated = Validate::isLinkRewrite(Tools::getValue('url_rewrite_1')); } else { // index.php can have empty rewrite rule $defaultLangIsValidated = !Tools::getValue('url_rewrite_'.$default_language) OR Validate::isLinkRewrite(Tools::getValue('url_rewrite_'.$default_language)); $englishLangIsValidated = !Tools::getValue('url_rewrite_1') OR Validate::isLinkRewrite(Tools::getValue('url_rewrite_1')); } if (!$defaultLangIsValidated AND !$englishLangIsValidated) { $this->_errors[] = Tools::displayError('Url rewrite field must be filled at least in default or english language.'); return false; } foreach ($langs as $lang) { $current = Tools::getValue('url_rewrite_'.$lang['id_lang']); if (strlen($current) == 0) // Prioritize default language first if ($defaultLangIsValidated) $_POST['url_rewrite_'.$lang['id_lang']] = Tools::getValue('url_rewrite_'.$default_language); else $_POST['url_rewrite_'.$lang['id_lang']] = Tools::getValue('url_rewrite_1'); } Module::hookExec('afterSaveAdminMeta'); } return parent::postProcess(); } public function getList($id_lang, $orderBy = NULL, $orderWay = NULL, $start = 0, $limit = NULL, $id_lang_shop = false) { parent::getList($id_lang, $orderBy, $orderWay, $start, $limit, Context::getContext()->shop->getID()); } /** * Validate route syntax and save it in configuration * * @param string $routeID */ public function checkAndUpdateRoute($routeID) { $defaultRoutes = Dispatcher::getInstance()->defaultRoutes; if (!isset($defaultRoutes[$routeID])) return ; $rule = Tools::getValue('PS_ROUTE_'.$routeID); if (!$rule || $rule == $defaultRoutes[$routeID]['rule']) { Configuration::updateValue('PS_ROUTE_'.$routeID, ''); return ; } $errors = array(); if (!Dispatcher::getInstance()->validateRoute($routeID, $rule, $errors)) { foreach ($errors as $error) $this->_errors[] = sprintf('Keyword "{%1$s}" required for route "%2$s" (rule: "%3$s")', $error, $routeID, htmlspecialchars($rule)); } else Configuration::updateValue('PS_ROUTE_'.$routeID, $rule); } public function updateOptionPsRouteProductRule() { $this->checkAndUpdateRoute('product_rule'); } public function updateOptionPsRouteCategoryRule() { $this->checkAndUpdateRoute('category_rule'); } public function updateOptionPsRouteSupplierRule() { $this->checkAndUpdateRoute('supplier_rule'); } public function updateOptionPsRouteManufacturerRule() { $this->checkAndUpdateRoute('manufacturer_rule'); } public function updateOptionPsRouteCmsRule() { $this->checkAndUpdateRoute('cms_rule'); } public function updateOptionPsRouteCmsCategoryRule() { $this->checkAndUpdateRoute('cms_category_rule'); } }