1946 lines
77 KiB
PHP
Executable File
1946 lines
77 KiB
PHP
Executable File
<?php
|
|
/*
|
|
* 2007-2011 PrestaShop
|
|
*
|
|
* 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:
|
|
* http://opensource.org/licenses/osl-3.0.php
|
|
* 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 license@prestashop.com 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 http://www.prestashop.com for more information.
|
|
*
|
|
* @author PrestaShop SA <contact@prestashop.com>
|
|
* @copyright 2007-2011 PrestaShop SA
|
|
* @version Release: $Revision: 9871 $
|
|
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
|
* International Registered Trademark & Property of PrestaShop SA
|
|
*/
|
|
|
|
abstract class AdminTabCore
|
|
{
|
|
/** @var integer Tab id */
|
|
public $id = -1;
|
|
|
|
/** @var string Associated table name */
|
|
public $table;
|
|
|
|
/** @var string Object identifier inside the associated table */
|
|
protected $identifier = false;
|
|
|
|
/** @var string Tab name */
|
|
public $name;
|
|
|
|
/** @var string Security token */
|
|
public $token;
|
|
|
|
/** @var boolean Automatically join language table if true */
|
|
public $lang = false;
|
|
|
|
/** @var boolean Tab Automatically displays edit/delete icons if true */
|
|
public $edit = false;
|
|
|
|
/** @var boolean Tab Automatically displays view icon if true */
|
|
public $view = false;
|
|
|
|
/** @var boolean Tab Automatically displays delete icon if true */
|
|
public $delete = false;
|
|
|
|
/** @var boolean Table records are not deleted but marked as deleted */
|
|
public $deleted = false;
|
|
|
|
/** @var boolean Tab Automatically displays duplicate icon if true */
|
|
public $duplicate = false;
|
|
|
|
/** @var boolean Content line is clickable if true */
|
|
public $noLink = false;
|
|
|
|
/** @var boolean select other required fields */
|
|
public $requiredDatabase = false;
|
|
|
|
/** @var boolean Tab Automatically displays '$color' as background color on listing if true */
|
|
public $colorOnBackground = false;
|
|
|
|
/** @var string Add fields into data query to display list */
|
|
protected $_select;
|
|
|
|
/** @var string Join tables into data query to display list */
|
|
protected $_join;
|
|
|
|
/** @var string Add conditions into data query to display list */
|
|
protected $_where;
|
|
|
|
/** @var string Group rows into data query to display list */
|
|
protected $_group;
|
|
|
|
/** @var string Having rows into data query to display list */
|
|
protected $_having;
|
|
|
|
/** @var array Name and directory where class image are located */
|
|
public $fieldImageSettings = array();
|
|
|
|
/** @var string Image type */
|
|
public $imageType = 'jpg';
|
|
|
|
/** @var array Fields to display in list */
|
|
public $fieldsDisplay = array();
|
|
|
|
/** @var array Cache for query results */
|
|
protected $_list = array();
|
|
|
|
/** @var integer Number of results in list */
|
|
protected $_listTotal = 0;
|
|
|
|
/** @var array WHERE clause determined by filter fields */
|
|
protected $_filter;
|
|
|
|
/** @var array Temporary SQL table WHERE clause determinated by filter fields */
|
|
protected $_tmpTableFilter = '';
|
|
|
|
/** @var array Number of results in list per page (used in select field) */
|
|
protected $_pagination = array(20, 50, 100, 300);
|
|
|
|
/** @var string ORDER BY clause determined by field/arrows in list header */
|
|
protected $_orderBy;
|
|
|
|
/** @var string Default ORDER BY clause when $_orderBy is not defined */
|
|
protected $_defaultOrderBy = false;
|
|
|
|
/** @var string Order way (ASC, DESC) determined by arrows in list header */
|
|
protected $_orderWay;
|
|
|
|
/** @var integer Max image size for upload */
|
|
protected $maxImageSize = 2000000;
|
|
|
|
/** @var array Errors displayed after post processing */
|
|
public $_errors = array();
|
|
|
|
/** @var array Confirmations displayed after post processing */
|
|
protected $_conf;
|
|
|
|
/** @var object Object corresponding to the tab */
|
|
protected $_object = false;
|
|
|
|
/** @var array tabAccess */
|
|
public $tabAccess;
|
|
|
|
/** @var string specificConfirmDelete */
|
|
public $specificConfirmDelete = NULL;
|
|
|
|
protected $identifiersDnd = array('id_product' => 'id_product', 'id_category' => 'id_category_to_move','id_cms_category' => 'id_cms_category_to_move', 'id_cms' => 'id_cms');
|
|
|
|
/** @var bool Redirect or not ater a creation */
|
|
protected $_redirect = true;
|
|
|
|
protected $_languages = NULL;
|
|
protected $_defaultFormLanguage = NULL;
|
|
|
|
protected $_includeObj = array();
|
|
protected $_includeVars = false;
|
|
protected $_includeContainer = true;
|
|
|
|
public $ajax = false;
|
|
|
|
/**
|
|
* if true, ajax-tab will not wait 1 sec
|
|
* @var boolean
|
|
*/
|
|
public $ignore_sleep = false;
|
|
|
|
public static $tabParenting = array(
|
|
'AdminProducts' => 'AdminCatalog',
|
|
'AdminCategories' => 'AdminCatalog',
|
|
'AdminCMS' => 'AdminCMSContent',
|
|
'AdminCMSCategories' => 'AdminCMSContent',
|
|
'AdminOrdersStates' => 'AdminStatuses',
|
|
'AdminAttributeGenerator' => 'AdminProducts',
|
|
'AdminAttributes' => 'AdminAttributesGroups',
|
|
'AdminFeaturesValues' => 'AdminFeatures',
|
|
'AdminReturnStates' => 'AdminStatuses',
|
|
'AdminStatsTab' => 'AdminStats'
|
|
);
|
|
|
|
public function __construct()
|
|
{
|
|
global $cookie;
|
|
|
|
$this->id = Tab::getCurrentTabId();
|
|
$this->_conf = array(
|
|
1 => $this->l('Deletion successful'), 2 => $this->l('Selection successfully deleted'),
|
|
3 => $this->l('Creation successful'), 4 => $this->l('Update successful'),
|
|
5 => $this->l('Status update successful'), 6 => $this->l('Settings update successful'),
|
|
7 => $this->l('Image successfully deleted'), 8 => $this->l('Module downloaded successfully'),
|
|
9 => $this->l('Thumbnails successfully regenerated'), 10 => $this->l('Message sent to the customer'),
|
|
11 => $this->l('Comment added'), 12 => $this->l('Module installed successfully'),
|
|
13 => $this->l('Module uninstalled successfully'), 14 => $this->l('Language successfully copied'),
|
|
15 => $this->l('Translations successfully added'), 16 => $this->l('Module transplanted successfully to hook'),
|
|
17 => $this->l('Module removed successfully from hook'), 18 => $this->l('Upload successful'),
|
|
19 => $this->l('Duplication completed successfully'), 20 => $this->l('Translation added successfully but the language has not been created'),
|
|
21 => $this->l('Module reset successfully'), 22 => $this->l('Module deleted successfully'),
|
|
23 => $this->l('Localization pack imported successfully'), 24 => $this->l('Refund Successful'),
|
|
25 => $this->l('Images successfully moved'));
|
|
if (!$this->identifier) $this->identifier = 'id_'.$this->table;
|
|
if (!$this->_defaultOrderBy) $this->_defaultOrderBy = $this->identifier;
|
|
$className = get_class($this);
|
|
if ($className == 'AdminCategories' OR $className == 'AdminProducts')
|
|
$className = 'AdminCatalog';
|
|
$this->token = Tools::getAdminToken($className.(int)$this->id.(int)$cookie->id_employee);
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* use translations files to replace english expression.
|
|
*
|
|
* @param mixed $string term or expression in english
|
|
* @param string $class
|
|
* @param boolean $addslashes if set to true, the return value will pass through addslashes(). Otherwise, stripslashes().
|
|
* @param boolean $htmlentities if set to true(default), the return value will pass through htmlentities($string, ENT_QUOTES, 'utf-8')
|
|
* @return string the translation if available, or the english default text.
|
|
*/
|
|
protected function l($string, $class = 'AdminTab', $addslashes = FALSE, $htmlentities = TRUE)
|
|
{
|
|
// if the class is extended by a module, use modules/[module_name]/xx.php lang file
|
|
$currentClass = get_class($this);
|
|
if (Module::getModuleNameFromClass($currentClass))
|
|
{
|
|
$string = str_replace('\'', '\\\'', $string);
|
|
return Module::findTranslation(Module::$classInModule[$currentClass], $string, $currentClass);
|
|
}
|
|
global $_LANGADM;
|
|
|
|
if ($class == __CLASS__)
|
|
$class = 'AdminTab';
|
|
|
|
$key = md5(str_replace('\'', '\\\'', $string));
|
|
$str = (key_exists(get_class($this).$key, $_LANGADM)) ? $_LANGADM[get_class($this).$key] : ((key_exists($class.$key, $_LANGADM)) ? $_LANGADM[$class.$key] : $string);
|
|
$str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str;
|
|
return str_replace('"', '"', ($addslashes ? addslashes($str) : stripslashes($str)));
|
|
}
|
|
|
|
/**
|
|
* ajaxDisplay is the default ajax return sytem
|
|
*
|
|
* @return void
|
|
*/
|
|
public function displayAjax()
|
|
{
|
|
}
|
|
/**
|
|
* Manage page display (form, list...)
|
|
*
|
|
* @global string $currentIndex Current URL in order to keep current Tab
|
|
*/
|
|
public function display()
|
|
{
|
|
global $currentIndex, $cookie;
|
|
|
|
// Include other tab in current tab
|
|
if ($this->includeSubTab('display', array('submitAdd2', 'add', 'update', 'view'))){}
|
|
|
|
// Include current tab
|
|
elseif ((Tools::getValue('submitAdd'.$this->table) AND sizeof($this->_errors)) OR isset($_GET['add'.$this->table]))
|
|
{
|
|
if ($this->tabAccess['add'] === '1')
|
|
{
|
|
$this->displayForm();
|
|
if ($this->tabAccess['view'])
|
|
echo '<br /><br /><a href="'.((Tools::getValue('back')) ? Tools::getValue('back') : $currentIndex.'&token='.$this->token).'"><img src="../img/admin/arrow2.gif" /> '.((Tools::getValue('back')) ? $this->l('Back') : $this->l('Back to list')).'</a><br />';
|
|
}
|
|
else
|
|
echo $this->l('You do not have permission to add here');
|
|
}
|
|
elseif (isset($_GET['update'.$this->table]))
|
|
{
|
|
if ($this->tabAccess['edit'] === '1' OR ($this->table == 'employee' AND $cookie->id_employee == Tools::getValue('id_employee')))
|
|
{
|
|
$this->displayForm();
|
|
if ($this->tabAccess['view'])
|
|
echo '<br /><br /><a href="'.((Tools::getValue('back')) ? Tools::getValue('back') : $currentIndex.'&token='.$this->token).'"><img src="../img/admin/arrow2.gif" /> '.((Tools::getValue('back')) ? $this->l('Back') : $this->l('Back to list')).'</a><br />';
|
|
}
|
|
else
|
|
echo $this->l('You do not have permission to edit here');
|
|
}
|
|
elseif (isset($_GET['view'.$this->table]))
|
|
$this->{'view'.$this->table}();
|
|
|
|
else
|
|
{
|
|
$this->getList((int)($cookie->id_lang));
|
|
$this->displayList();
|
|
$this->displayOptionsList();
|
|
$this->displayRequiredFields();
|
|
$this->includeSubTab('display');
|
|
}
|
|
}
|
|
|
|
public function displayRequiredFields()
|
|
{
|
|
global $currentIndex;
|
|
if (!$this->tabAccess['add'] OR !$this->tabAccess['delete'] === '1' OR !$this->requiredDatabase)
|
|
return;
|
|
$rules = call_user_func_array(array($this->className, 'getValidationRules'), array($this->className));
|
|
$required_class_fields = array($this->identifier);
|
|
foreach ($rules['required'] AS $required)
|
|
$required_class_fields[] = $required;
|
|
|
|
echo '<br />
|
|
<p><a href="#" onclick="if ($(\'.requiredFieldsParameters:visible\').length == 0) $(\'.requiredFieldsParameters\').slideDown(\'slow\'); else $(\'.requiredFieldsParameters\').slideUp(\'slow\'); return false;"><img src="../img/admin/duplicate.gif" alt="" /> '.$this->l('Set required fields for this section').'</a></p>
|
|
<fieldset style="display:none" class="width1 requiredFieldsParameters">
|
|
<legend>'.$this->l('Required Fields').'</legend>
|
|
<form name="updateFields" action="'.$currentIndex.'&submitFields'.$this->table.'=1&token='.$this->token.'" method="post">
|
|
<p><b>'.$this->l('Select the fields you would like to be required for this section.').'<br />
|
|
<table cellspacing="0" cellpadding="0" class="table width1 clear">
|
|
<tr>
|
|
<th><input type="checkbox" onclick="checkDelBoxes(this.form, \'fieldsBox[]\', this.checked)" class="noborder" name="checkme"></th>
|
|
<th>'.$this->l('Field Name').'</th>
|
|
</tr>';
|
|
|
|
$object = new $this->className();
|
|
$res = $object->getFieldsRequiredDatabase();
|
|
|
|
$required_fields = array();
|
|
foreach ($res AS $row)
|
|
$required_fields[(int)$row['id_required_field']] = $row['field_name'];
|
|
|
|
|
|
$table_fields = Db::getInstance()->ExecuteS('SHOW COLUMNS FROM '.pSQL(_DB_PREFIX_.$this->table));
|
|
$irow = 0;
|
|
foreach ($table_fields AS $field)
|
|
{
|
|
if (in_array($field['Field'], $required_class_fields))
|
|
continue;
|
|
echo '<tr class="'.($irow++ % 2 ? 'alt_row' : '').'">
|
|
<td class="noborder"><input type="checkbox" name="fieldsBox[]" value="'.$field['Field'].'" '.(in_array($field['Field'], $required_fields) ? 'checked="checked"' : '').' /></td>
|
|
<td>'.$field['Field'].'</td>
|
|
</tr>';
|
|
}
|
|
echo '</table><br />
|
|
<center><input style="margin-left:15px;" class="button" type="submit" value="'.$this->l(' Save ').'" name="submitFields" /></center>
|
|
</fieldset>';
|
|
}
|
|
|
|
public function includeSubTab($methodname, $actions = array())
|
|
{
|
|
if (!isset($this->_includeTab) OR !is_array($this->_includeTab))
|
|
return false;
|
|
$key = 0;
|
|
$inc = false;
|
|
foreach ($this->_includeTab as $subtab => $extraVars)
|
|
{
|
|
/* New tab loading */
|
|
$classname = 'Admin'.$subtab;
|
|
if ($module = Db::getInstance()->getValue('SELECT `module` FROM `'._DB_PREFIX_.'tab` WHERE `class_name` = \''.pSQL($classname).'\'') AND file_exists(_PS_MODULE_DIR_.'/'.$module.'/'.$classname.'.php'))
|
|
include_once(_PS_MODULE_DIR_.'/'.$module.'/'.$classname.'.php');
|
|
elseif (file_exists(PS_ADMIN_DIR.'/tabs/'.$classname.'.php'))
|
|
include_once('tabs/'.$classname.'.php');
|
|
if (!isset($this->_includeObj[$key]))
|
|
$this->_includeObj[$key] = new $classname;
|
|
$adminTab = $this->_includeObj[$key];
|
|
$adminTab->token = $this->token;
|
|
|
|
/* Extra variables addition */
|
|
if (!empty($extraVars) AND is_array($extraVars))
|
|
foreach ($extraVars AS $varKey => $varValue)
|
|
$adminTab->$varKey = $varValue;
|
|
|
|
/* Actions management */
|
|
foreach ($actions as $action)
|
|
{
|
|
switch ($action)
|
|
{
|
|
case 'submitAdd1':
|
|
if (Tools::getValue('submitAdd'.$adminTab->table))
|
|
$ok_inc = true;
|
|
break;
|
|
case 'submitAdd2':
|
|
if (Tools::getValue('submitAdd'.$adminTab->table) AND sizeof($adminTab->_errors))
|
|
$ok_inc = true;
|
|
break;
|
|
case 'submitDel':
|
|
if (Tools::getValue('submitDel'.$adminTab->table))
|
|
$ok_inc = true;
|
|
break;
|
|
case 'submitFilter':
|
|
if (Tools::isSubmit('submitFilter'.$adminTab->table))
|
|
$ok_inc = true;
|
|
case 'submitReset':
|
|
if (Tools::isSubmit('submitReset'.$adminTab->table))
|
|
$ok_inc = true;
|
|
default:
|
|
if (isset($_GET[$action.$adminTab->table]))
|
|
$ok_inc = true;
|
|
}
|
|
}
|
|
$inc = false;
|
|
if ((isset($ok_inc) AND $ok_inc) OR !sizeof($actions))
|
|
{
|
|
if (!$adminTab->viewAccess())
|
|
{
|
|
echo Tools::displayError('Access denied');
|
|
return false;
|
|
}
|
|
if (!sizeof($actions))
|
|
if (($methodname == 'displayErrors' AND sizeof($adminTab->_errors)) OR $methodname != 'displayErrors')
|
|
echo (isset($this->_includeTabTitle[$key]) ? '<h2>'.$this->_includeTabTitle[$key].'</h2>' : '');
|
|
if ($adminTab->_includeVars)
|
|
foreach ($adminTab->_includeVars AS $var => $value)
|
|
$adminTab->$var = $this->$value;
|
|
$adminTab->$methodname();
|
|
$inc = true;
|
|
}
|
|
$key++;
|
|
}
|
|
return $inc;
|
|
}
|
|
|
|
/**
|
|
* Manage page display (form, list...)
|
|
*
|
|
* @param string $className Allow to validate a different class than the current one
|
|
*/
|
|
public function validateRules($className = false)
|
|
{
|
|
if (!$className)
|
|
$className = $this->className;
|
|
|
|
/* Class specific validation rules */
|
|
$rules = call_user_func(array($className, 'getValidationRules'), $className);
|
|
|
|
if ((sizeof($rules['requiredLang']) OR sizeof($rules['sizeLang']) OR sizeof($rules['validateLang'])))
|
|
{
|
|
/* Language() instance determined by default language */
|
|
$defaultLanguage = new Language((int)(Configuration::get('PS_LANG_DEFAULT')));
|
|
|
|
/* All availables languages */
|
|
$languages = Language::getLanguages(false);
|
|
}
|
|
|
|
/* Checking for required fields */
|
|
foreach ($rules['required'] AS $field)
|
|
if (($value = Tools::getValue($field)) == false AND (string)$value != '0')
|
|
if (!Tools::getValue($this->identifier) OR ($field != 'passwd' AND $field != 'no-picture'))
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is required');
|
|
|
|
/* Checking for multilingual required fields */
|
|
foreach ($rules['requiredLang'] AS $fieldLang)
|
|
if (($empty = Tools::getValue($fieldLang.'_'.$defaultLanguage->id)) === false OR $empty !== '0' AND empty($empty))
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).'</b> '.$this->l('is required at least in').' '.$defaultLanguage->name;
|
|
|
|
/* Checking for maximum fields sizes */
|
|
foreach ($rules['size'] AS $field => $maxLength)
|
|
if (Tools::getValue($field) !== false AND Tools::strlen(Tools::getValue($field)) > $maxLength)
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')';
|
|
|
|
/* Checking for maximum multilingual fields size */
|
|
foreach ($rules['sizeLang'] AS $fieldLang => $maxLength)
|
|
foreach ($languages AS $language)
|
|
if (Tools::getValue($fieldLang.'_'.$language['id_lang']) !== false AND Tools::strlen(Tools::getValue($fieldLang.'_'.$language['id_lang'])) > $maxLength)
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].')</b> '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max, html chars including').')';
|
|
|
|
/* Overload this method for custom checking */
|
|
$this->_childValidation();
|
|
|
|
/* Checking for fields validity */
|
|
foreach ($rules['validate'] AS $field => $function)
|
|
if (($value = Tools::getValue($field)) !== false AND !empty($value) AND ($field != 'passwd'))
|
|
if (!Validate::$function($value))
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is invalid');
|
|
|
|
/* Checking for passwd_old validity */
|
|
if (($value = Tools::getValue('passwd')) != false)
|
|
{
|
|
if ($className == 'Employee' AND !Validate::isPasswdAdmin($value))
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), 'passwd', $className).'</b> '.$this->l('is invalid');
|
|
elseif ($className == 'Customer' AND !Validate::isPasswd($value))
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), 'passwd', $className).'</b> '.$this->l('is invalid');
|
|
}
|
|
|
|
/* Checking for multilingual fields validity */
|
|
foreach ($rules['validateLang'] AS $fieldLang => $function)
|
|
foreach ($languages AS $language)
|
|
if (($value = Tools::getValue($fieldLang.'_'.$language['id_lang'])) !== false AND !empty($value))
|
|
if (!Validate::$function($value))
|
|
$this->_errors[] = $this->l('the field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].')</b> '.$this->l('is invalid');
|
|
}
|
|
|
|
/**
|
|
* Overload this method for custom checking
|
|
*/
|
|
protected function _childValidation() { }
|
|
|
|
/**
|
|
* Overload this method for custom checking
|
|
*
|
|
* @param integer $id Object id used for deleting images
|
|
* TODO This function will soon be deprecated. Use ObjectModel->deleteImage instead.
|
|
*/
|
|
public function deleteImage($id)
|
|
{
|
|
$dir = null;
|
|
/* Deleting object images and thumbnails (cache) */
|
|
if (key_exists('dir', $this->fieldImageSettings))
|
|
{
|
|
$dir = $this->fieldImageSettings['dir'].'/';
|
|
if (file_exists(_PS_IMG_DIR_.$dir.$id.'.'.$this->imageType) AND !unlink(_PS_IMG_DIR_.$dir.$id.'.'.$this->imageType))
|
|
return false;
|
|
}
|
|
if (file_exists(_PS_TMP_IMG_DIR_.$this->table.'_'.$id.'.'.$this->imageType) AND !unlink(_PS_TMP_IMG_DIR_.$this->table.'_'.$id.'.'.$this->imageType))
|
|
return false;
|
|
if (file_exists(_PS_TMP_IMG_DIR_.$this->table.'_mini_'.$id.'.'.$this->imageType) AND !unlink(_PS_TMP_IMG_DIR_.$this->table.'_mini_'.$id.'.'.$this->imageType))
|
|
return false;
|
|
$types = ImageType::getImagesTypes();
|
|
foreach ($types AS $imageType)
|
|
if (file_exists(_PS_IMG_DIR_.$dir.$id.'-'.stripslashes($imageType['name']).'.'.$this->imageType) AND !unlink(_PS_IMG_DIR_.$dir.$id.'-'.stripslashes($imageType['name']).'.'.$this->imageType))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* ajaxPreProcess is a method called in ajax-tab.php before displayConf().
|
|
*
|
|
* @return void
|
|
*/
|
|
public function ajaxPreProcess()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* ajaxProcess is the default handle method for request with ajax-tab.php
|
|
*
|
|
* @return void
|
|
*/
|
|
public function ajaxProcess()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Manage page processing
|
|
*
|
|
* @global string $currentIndex Current URL in order to keep current Tab
|
|
*/
|
|
public function postProcess()
|
|
{
|
|
global $currentIndex, $cookie;
|
|
if (!isset($this->table))
|
|
return false;
|
|
|
|
// set token
|
|
$token = Tools::getValue('token') ? Tools::getValue('token') : $this->token;
|
|
|
|
// Sub included tab postProcessing
|
|
$this->includeSubTab('postProcess', array('status', 'submitAdd1', 'submitDel', 'delete', 'submitFilter', 'submitReset'));
|
|
|
|
/* Delete object image */
|
|
if (isset($_GET['deleteImage']))
|
|
{
|
|
if (Validate::isLoadedObject($object = $this->loadObject()))
|
|
if (($object->deleteImage()))
|
|
Tools::redirectAdmin($currentIndex.'&add'.$this->table.'&'.$this->identifier.'='.Tools::getValue($this->identifier).'&conf=7&token='.$token);
|
|
$this->_errors[] = Tools::displayError('An error occurred during image deletion (cannot load object).');
|
|
}
|
|
|
|
/* Delete object */
|
|
elseif (isset($_GET['delete'.$this->table]))
|
|
{
|
|
if ($this->tabAccess['delete'] === '1')
|
|
{
|
|
if (Validate::isLoadedObject($object = $this->loadObject()) AND isset($this->fieldImageSettings))
|
|
{
|
|
// check if request at least one object with noZeroObject
|
|
if (isset($object->noZeroObject) AND sizeof(call_user_func(array($this->className, $object->noZeroObject))) <= 1)
|
|
$this->_errors[] = Tools::displayError('You need at least one object.').' <b>'.$this->table.'</b><br />'.Tools::displayError('You cannot delete all of the items.');
|
|
else
|
|
{
|
|
if ($this->deleted)
|
|
{
|
|
$object->deleteImage();
|
|
$object->deleted = 1;
|
|
if ($object->update())
|
|
Tools::redirectAdmin($currentIndex.'&conf=1&token='.$token);
|
|
}
|
|
elseif ($object->delete())
|
|
Tools::redirectAdmin($currentIndex.'&conf=1&token='.$token);
|
|
$this->_errors[] = Tools::displayError('An error occurred during deletion.');
|
|
}
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('An error occurred while deleting object.').' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)');
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('You do not have permission to delete here.');
|
|
}
|
|
|
|
/* Change object statuts (active, inactive) */
|
|
elseif ((isset($_GET['status'.$this->table]) OR isset($_GET['status'])) AND Tools::getValue($this->identifier))
|
|
{
|
|
if ($this->tabAccess['edit'] === '1')
|
|
{
|
|
if (Validate::isLoadedObject($object = $this->loadObject()))
|
|
{
|
|
if ($object->toggleStatus())
|
|
Tools::redirectAdmin($currentIndex.'&conf=5'.((($id_category = (int)(Tools::getValue('id_category'))) AND Tools::getValue('id_product')) ? '&id_category='.$id_category : '').'&token='.$token);
|
|
else
|
|
$this->_errors[] = Tools::displayError('An error occurred while updating status.');
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)');
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('You do not have permission to edit here.');
|
|
}
|
|
/* Move an object */
|
|
elseif (isset($_GET['position']))
|
|
{
|
|
if ($this->tabAccess['edit'] !== '1')
|
|
$this->_errors[] = Tools::displayError('You do not have permission to edit here.');
|
|
elseif (!Validate::isLoadedObject($object = $this->loadObject()))
|
|
$this->_errors[] = Tools::displayError('An error occurred while updating status for object.').' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)');
|
|
elseif (!$object->updatePosition((int)(Tools::getValue('way')), (int)(Tools::getValue('position'))))
|
|
$this->_errors[] = Tools::displayError('Failed to update the position.');
|
|
else
|
|
Tools::redirectAdmin($currentIndex.'&'.$this->table.'Orderby=position&'.$this->table.'Orderway=asc&conf=5'.(($id_identifier = (int)(Tools::getValue($this->identifier))) ? ('&'.$this->identifier.'='.$id_identifier) : '').'&token='.$token);
|
|
}
|
|
/* Delete multiple objects */
|
|
elseif (Tools::getValue('submitDel'.$this->table))
|
|
{
|
|
if ($this->tabAccess['delete'] === '1')
|
|
{
|
|
if (isset($_POST[$this->table.'Box']))
|
|
{
|
|
$object = new $this->className();
|
|
if (isset($object->noZeroObject) AND
|
|
// Check if all object will be deleted
|
|
(sizeof(call_user_func(array($this->className, $object->noZeroObject))) <= 1 OR sizeof($_POST[$this->table.'Box']) == sizeof(call_user_func(array($this->className, $object->noZeroObject)))))
|
|
$this->_errors[] = Tools::displayError('You need at least one object.').' <b>'.$this->table.'</b><br />'.Tools::displayError('You cannot delete all of the items.');
|
|
else
|
|
{
|
|
$result = true;
|
|
if ($this->deleted)
|
|
{
|
|
foreach(Tools::getValue($this->table.'Box') as $id)
|
|
{
|
|
$toDelete = new $this->className($id);
|
|
$toDelete->deleted = 1;
|
|
$result = $result AND $toDelete->update();
|
|
}
|
|
}
|
|
else
|
|
$result = $object->deleteSelection(Tools::getValue($this->table.'Box'));
|
|
|
|
if ($result)
|
|
Tools::redirectAdmin($currentIndex.'&conf=2&token='.$token);
|
|
$this->_errors[] = Tools::displayError('An error occurred while deleting selection.');
|
|
}
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('You must select at least one element to delete.');
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('You do not have permission to delete here.');
|
|
}
|
|
|
|
/* Create or update an object */
|
|
elseif (Tools::getValue('submitAdd'.$this->table))
|
|
{
|
|
/* Checking fields validity */
|
|
$this->validateRules();
|
|
if (!sizeof($this->_errors))
|
|
{
|
|
$id = (int)(Tools::getValue($this->identifier));
|
|
|
|
/* Object update */
|
|
if (isset($id) AND !empty($id))
|
|
{
|
|
if ($this->tabAccess['edit'] === '1' OR ($this->table == 'employee' AND $cookie->id_employee == Tools::getValue('id_employee') AND Tools::isSubmit('updateemployee')))
|
|
{
|
|
$object = new $this->className($id);
|
|
if (Validate::isLoadedObject($object))
|
|
{
|
|
/* Specific to objects which must not be deleted */
|
|
if ($this->deleted AND $this->beforeDelete($object))
|
|
{
|
|
// Create new one with old objet values
|
|
$objectNew = new $this->className($object->id);
|
|
$objectNew->id = NULL;
|
|
$objectNew->date_add = '';
|
|
$objectNew->date_upd = '';
|
|
|
|
// Update old object to deleted
|
|
$object->deleted = 1;
|
|
$object->update();
|
|
|
|
// Update new object with post values
|
|
$this->copyFromPost($objectNew, $this->table);
|
|
$result = $objectNew->add();
|
|
if (Validate::isLoadedObject($objectNew))
|
|
$this->afterDelete($objectNew, $object->id);
|
|
}
|
|
else
|
|
{
|
|
$this->copyFromPost($object, $this->table);
|
|
$result = $object->update();
|
|
}
|
|
if (!$result)
|
|
$this->_errors[] = Tools::displayError('An error occurred while updating object.').' <b>'.$this->table.'</b> ('.Db::getInstance()->getMsgError().')';
|
|
elseif ($this->postImage($object->id) AND !sizeof($this->_errors))
|
|
{
|
|
$parent_id = (int)(Tools::getValue('id_parent', 1));
|
|
$this->afterUpdate($object);
|
|
// Specific back redirect
|
|
if ($back = Tools::getValue('back'))
|
|
Tools::redirectAdmin(urldecode($back).'&conf=4');
|
|
// Specific scene feature
|
|
if (Tools::getValue('stay_here') == 'on' || Tools::getValue('stay_here') == 'true' || Tools::getValue('stay_here') == '1')
|
|
Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=4&updatescene&token='.$token);
|
|
// Save and stay on same form
|
|
if (Tools::isSubmit('submitAdd'.$this->table.'AndStay'))
|
|
Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=4&update'.$this->table.'&token='.$token);
|
|
// Save and back to parent
|
|
if (Tools::isSubmit('submitAdd'.$this->table.'AndBackToParent'))
|
|
Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$parent_id.'&conf=4&token='.$token);
|
|
// Default behavior (save and back)
|
|
Tools::redirectAdmin($currentIndex.($parent_id ? '&'.$this->identifier.'='.$object->id : '').'&conf=4&token='.$token);
|
|
}
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('An error occurred while updating object.').' <b>'.$this->table.'</b> '.Tools::displayError('(cannot load object)');
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('You do not have permission to edit here.');
|
|
}
|
|
|
|
/* Object creation */
|
|
else
|
|
{
|
|
if ($this->tabAccess['add'] === '1')
|
|
{
|
|
$object = new $this->className();
|
|
$this->copyFromPost($object, $this->table);
|
|
if (!$object->add())
|
|
$this->_errors[] = Tools::displayError('An error occurred while creating object.').' <b>'.$this->table.' ('.mysql_error().')</b>';
|
|
elseif (($_POST[$this->identifier] = $object->id /* voluntary */) AND $this->postImage($object->id) AND !sizeof($this->_errors) AND $this->_redirect)
|
|
{
|
|
$parent_id = (int)(Tools::getValue('id_parent', 1));
|
|
$this->afterAdd($object);
|
|
// Save and stay on same form
|
|
if (Tools::isSubmit('submitAdd'.$this->table.'AndStay'))
|
|
Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$object->id.'&conf=3&update'.$this->table.'&token='.$token);
|
|
// Save and back to parent
|
|
if (Tools::isSubmit('submitAdd'.$this->table.'AndBackToParent'))
|
|
Tools::redirectAdmin($currentIndex.'&'.$this->identifier.'='.$parent_id.'&conf=3&token='.$token);
|
|
// Default behavior (save and back)
|
|
Tools::redirectAdmin($currentIndex.($parent_id ? '&'.$this->identifier.'='.$object->id : '').'&conf=3&token='.$token);
|
|
}
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('You do not have permission to add here.');
|
|
}
|
|
}
|
|
$this->_errors = array_unique($this->_errors);
|
|
}
|
|
|
|
/* Cancel all filters for this tab */
|
|
elseif (isset($_POST['submitReset'.$this->table]))
|
|
{
|
|
$filters = $cookie->getFamily($this->table.'Filter_');
|
|
foreach ($filters AS $cookieKey => $filter)
|
|
if (strncmp($cookieKey, $this->table.'Filter_', 7 + Tools::strlen($this->table)) == 0)
|
|
{
|
|
$key = substr($cookieKey, 7 + Tools::strlen($this->table));
|
|
/* Table alias could be specified using a ! eg. alias!field */
|
|
$tmpTab = explode('!', $key);
|
|
$key = (count($tmpTab) > 1 ? $tmpTab[1] : $tmpTab[0]);
|
|
if (array_key_exists($key, $this->fieldsDisplay))
|
|
unset($cookie->$cookieKey);
|
|
}
|
|
if (isset($cookie->{'submitFilter'.$this->table}))
|
|
unset($cookie->{'submitFilter'.$this->table});
|
|
if (isset($cookie->{$this->table.'Orderby'}))
|
|
unset($cookie->{$this->table.'Orderby'});
|
|
if (isset($cookie->{$this->table.'Orderway'}))
|
|
unset($cookie->{$this->table.'Orderway'});
|
|
unset($_POST);
|
|
}
|
|
|
|
/* Submit options list */
|
|
elseif (Tools::getValue('submitOptions'.$this->table))
|
|
{
|
|
$this->updateOptions($token);
|
|
}
|
|
|
|
/* Manage list filtering */
|
|
elseif (Tools::isSubmit('submitFilter'.$this->table) OR $cookie->{'submitFilter'.$this->table} !== false)
|
|
{
|
|
$_POST = array_merge($cookie->getFamily($this->table.'Filter_'), (isset($_POST) ? $_POST : array()));
|
|
foreach ($_POST AS $key => $value)
|
|
{
|
|
/* Extracting filters from $_POST on key filter_ */
|
|
if ($value != NULL AND !strncmp($key, $this->table.'Filter_', 7 + Tools::strlen($this->table)))
|
|
{
|
|
$key = Tools::substr($key, 7 + Tools::strlen($this->table));
|
|
/* Table alias could be specified using a ! eg. alias!field */
|
|
$tmpTab = explode('!', $key);
|
|
$filter = count($tmpTab) > 1 ? $tmpTab[1] : $tmpTab[0];
|
|
if ($field = $this->filterToField($key, $filter))
|
|
{
|
|
$type = (array_key_exists('filter_type', $field) ? $field['filter_type'] : (array_key_exists('type', $field) ? $field['type'] : false));
|
|
if (($type == 'date' OR $type == 'datetime') AND is_string($value))
|
|
$value = unserialize($value);
|
|
$key = isset($tmpTab[1]) ? $tmpTab[0].'.`'.bqSQL($tmpTab[1]).'`' : '`'.bqSQL($tmpTab[0]).'`';
|
|
if (array_key_exists('tmpTableFilter', $field))
|
|
$sqlFilter = & $this->_tmpTableFilter;
|
|
elseif (array_key_exists('havingFilter', $field))
|
|
$sqlFilter = & $this->_filterHaving;
|
|
else
|
|
$sqlFilter = & $this->_filter;
|
|
|
|
/* Only for date filtering (from, to) */
|
|
if (is_array($value))
|
|
{
|
|
if (isset($value[0]) AND !empty($value[0]))
|
|
{
|
|
if (!Validate::isDate($value[0]))
|
|
$this->_errors[] = Tools::displayError('\'from:\' date format is invalid (YYYY-MM-DD)');
|
|
else
|
|
$sqlFilter .= ' AND '.$key.' >= \''.pSQL(Tools::dateFrom($value[0])).'\'';
|
|
}
|
|
|
|
if (isset($value[1]) AND !empty($value[1]))
|
|
{
|
|
if (!Validate::isDate($value[1]))
|
|
$this->_errors[] = Tools::displayError('\'to:\' date format is invalid (YYYY-MM-DD)');
|
|
else
|
|
$sqlFilter .= ' AND '.$key.' <= \''.pSQL(Tools::dateTo($value[1])).'\'';
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$sqlFilter .= ' AND ';
|
|
if ($type == 'int' OR $type == 'bool')
|
|
$sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`' OR $key == '`active`') ? 'a.' : '').pSQL($key).' = '.(int)($value).' ';
|
|
elseif ($type == 'decimal')
|
|
$sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`') ? 'a.' : '').pSQL($key).' = '.(float)($value).' ';
|
|
elseif ($type == 'select')
|
|
$sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`') ? 'a.' : '').pSQL($key).' = \''.pSQL($value).'\' ';
|
|
else
|
|
$sqlFilter .= (($key == $this->identifier OR $key == '`'.$this->identifier.'`') ? 'a.' : '').pSQL($key).' LIKE \'%'.pSQL($value).'%\' ';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
elseif (Tools::isSubmit('submitFields') AND $this->requiredDatabase AND $this->tabAccess['add'] === '1' AND $this->tabAccess['delete'] === '1')
|
|
{
|
|
if (!is_array($fields = Tools::getValue('fieldsBox')))
|
|
$fields = array();
|
|
|
|
$object = new $this->className();
|
|
if (!$object->addFieldsRequiredDatabase($fields))
|
|
$this->_errors[] = Tools::displayError('Error in updating required fields');
|
|
else
|
|
Tools::redirectAdmin($currentIndex.'&conf=4&token='.$token);
|
|
}
|
|
}
|
|
|
|
protected function updateOptions($token)
|
|
{
|
|
global $currentIndex;
|
|
|
|
if ($this->tabAccess['edit'] === '1')
|
|
{
|
|
foreach ($this->_fieldsOptions as $key => $field)
|
|
{
|
|
|
|
if ($this->validateField(Tools::getValue($key), $field))
|
|
{
|
|
// check if a method updateOptionFieldName is available
|
|
$method_name = 'updateOption'.Tools::toCamelCase($key, true);
|
|
if (method_exists($this, $method_name))
|
|
$this->$method_name(Tools::getValue($key));
|
|
elseif ($field['type'] == 'textLang' OR $field['type'] == 'textareaLang')
|
|
{
|
|
$languages = Language::getLanguages(false);
|
|
$list = array();
|
|
foreach ($languages as $language)
|
|
{
|
|
$val = (isset($field['cast']) ? $field['cast'](Tools::getValue($key.'_'.$language['id_lang'])) : Tools::getValue($key.'_'.$language['id_lang']));
|
|
if (Validate::isCleanHtml($val))
|
|
$list[$language['id_lang']] = $val;
|
|
else
|
|
$this->_errors[] = Tools::displayError('Can not add configuration '.$key.' for lang '.Language::getIsoById((int)$language['id_lang']));
|
|
}
|
|
Configuration::updateValue($key, $list);
|
|
}
|
|
else
|
|
{
|
|
$val = (isset($field['cast']) ? $field['cast'](Tools::getValue($key)) : Tools::getValue($key));
|
|
if (Validate::isCleanHtml($val))
|
|
Configuration::updateValue($key, $val);
|
|
else
|
|
$this->_errors[] = Tools::displayError('Can not add configuration '.$key);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if (count($this->_errors) <= 0)
|
|
Tools::redirectAdmin($currentIndex.'&conf=6&token='.$token);
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('You do not have permission to edit here.');
|
|
}
|
|
|
|
protected function validateField($value, $field)
|
|
{
|
|
if (isset($field['validation']))
|
|
{
|
|
$validate = new Validate();
|
|
if (method_exists($validate, $field['validation']))
|
|
{
|
|
if (!Validate::$field['validation']($value))
|
|
{
|
|
$this->_errors[] = Tools::displayError($field['title'].' : Incorrect value');
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
protected function uploadImage($id, $name, $dir, $ext = false)
|
|
{
|
|
if (isset($_FILES[$name]['tmp_name']) AND !empty($_FILES[$name]['tmp_name']))
|
|
{
|
|
// Delete old image
|
|
if (Validate::isLoadedObject($object = $this->loadObject()))
|
|
$object->deleteImage();
|
|
else
|
|
return false;
|
|
|
|
// Check image validity
|
|
if ($error = checkImage($_FILES[$name], $this->maxImageSize))
|
|
$this->_errors[] = $error;
|
|
elseif (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($_FILES[$name]['tmp_name'], $tmpName))
|
|
return false;
|
|
else
|
|
{
|
|
$_FILES[$name]['tmp_name'] = $tmpName;
|
|
// Copy new image
|
|
if (!imageResize($tmpName, _PS_IMG_DIR_.$dir.$id.'.'.$this->imageType, NULL, NULL, ($ext ? $ext : $this->imageType)))
|
|
$this->_errors[] = Tools::displayError('An error occurred while uploading image.');
|
|
if (sizeof($this->_errors))
|
|
return false;
|
|
if ($this->afterImageUpload())
|
|
{
|
|
unlink($tmpName);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
protected function uploadIco($name, $dest)
|
|
{
|
|
|
|
if (isset($_FILES[$name]['tmp_name']) AND !empty($_FILES[$name]['tmp_name']))
|
|
{
|
|
/* Check ico validity */
|
|
if ($error = checkIco($_FILES[$name], $this->maxImageSize))
|
|
$this->_errors[] = $error;
|
|
|
|
/* Copy new ico */
|
|
elseif (!copy($_FILES[$name]['tmp_name'], $dest))
|
|
$this->_errors[] = Tools::displayError('an error occurred while uploading favicon: '.$_FILES[$name]['tmp_name'].' to '.$dest);
|
|
}
|
|
return !sizeof($this->_errors) ? true : false;
|
|
}
|
|
|
|
/**
|
|
* Overload this method for custom checking
|
|
*
|
|
* @param integer $id Object id used for deleting images
|
|
* @return boolean
|
|
*/
|
|
protected function postImage($id)
|
|
{
|
|
if (isset($this->fieldImageSettings['name']) AND isset($this->fieldImageSettings['dir']))
|
|
return $this->uploadImage($id, $this->fieldImageSettings['name'], $this->fieldImageSettings['dir'].'/');
|
|
elseif (!empty($this->fieldImageSettings))
|
|
foreach ($this->fieldImageSettings AS $image)
|
|
if (isset($image['name']) AND isset($image['dir']))
|
|
$this->uploadImage($id, $image['name'], $image['dir'].'/');
|
|
return !sizeof($this->_errors) ? true : false;
|
|
}
|
|
|
|
/**
|
|
* Copy datas from $_POST to object
|
|
*
|
|
* @param object &$object Object
|
|
* @param string $table Object table
|
|
*/
|
|
protected function copyFromPost(&$object, $table)
|
|
{
|
|
/* Classical fields */
|
|
foreach ($_POST AS $key => $value)
|
|
if (key_exists($key, $object) AND $key != 'id_'.$table)
|
|
{
|
|
/* Do not take care of password field if empty */
|
|
if ($key == 'passwd' AND Tools::getValue('id_'.$table) AND empty($value))
|
|
continue;
|
|
/* Automatically encrypt password in MD5 */
|
|
if ($key == 'passwd' AND !empty($value))
|
|
$value = Tools::encrypt($value);
|
|
$object->{$key} = $value;
|
|
}
|
|
|
|
/* Multilingual fields */
|
|
$rules = call_user_func(array(get_class($object), 'getValidationRules'), get_class($object));
|
|
if (sizeof($rules['validateLang']))
|
|
{
|
|
$languages = Language::getLanguages(false);
|
|
foreach ($languages AS $language)
|
|
foreach (array_keys($rules['validateLang']) AS $field)
|
|
if (isset($_POST[$field.'_'.(int)($language['id_lang'])]))
|
|
$object->{$field}[(int)($language['id_lang'])] = $_POST[$field.'_'.(int)($language['id_lang'])];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display errors
|
|
*/
|
|
public function displayErrors()
|
|
{
|
|
if ($nbErrors = count($this->_errors) AND $this->_includeContainer)
|
|
{
|
|
echo '<script type="text/javascript">
|
|
$(document).ready(function() {
|
|
$(\'#hideError\').unbind(\'click\').click(function(){
|
|
$(\'.error\').hide(\'slow\', function (){
|
|
$(\'.error\').remove();
|
|
});
|
|
return false;
|
|
});
|
|
});
|
|
</script>
|
|
<div class="error"><span style="float:right"><a id="hideError" href=""><img alt="X" src="../img/admin/close.png" /></a></span><img src="../img/admin/error2.png" />';
|
|
if (count($this->_errors) == 1)
|
|
echo $this->_errors[0];
|
|
else
|
|
{
|
|
echo $nbErrors.' '.$this->l('errors').'<br /><ol>';
|
|
foreach ($this->_errors AS $error)
|
|
echo '<li>'.$error.'</li>';
|
|
echo '</ol>';
|
|
}
|
|
echo '</div>';
|
|
}
|
|
$this->includeSubTab('displayErrors');
|
|
}
|
|
|
|
/**
|
|
* Display a warning message
|
|
*
|
|
* @param string $warn Warning message to display
|
|
*/
|
|
public function displayWarning($warn)
|
|
{
|
|
$str_output = '';
|
|
if (!empty($warn))
|
|
{
|
|
$str_output .= '<script type="text/javascript">
|
|
$(document).ready(function() {
|
|
$(\'#linkSeeMore\').unbind(\'click\').click(function(){
|
|
$(\'#seeMore\').show(\'slow\');
|
|
$(this).hide();
|
|
$(\'#linkHide\').show();
|
|
return false;
|
|
});
|
|
$(\'#linkHide\').unbind(\'click\').click(function(){
|
|
$(\'#seeMore\').hide(\'slow\');
|
|
$(this).hide();
|
|
$(\'#linkSeeMore\').show();
|
|
return false;
|
|
});
|
|
$(\'#hideWarn\').unbind(\'click\').click(function(){
|
|
$(\'.warn\').hide(\'slow\', function (){
|
|
$(\'.warn\').remove();
|
|
});
|
|
return false;
|
|
});
|
|
});
|
|
</script>
|
|
<div class="warn">';
|
|
if (!is_array($warn))
|
|
$str_output .= '<img src="../img/admin/warn2.png" />'.$warn;
|
|
else
|
|
{ $str_output .= '<span style="float:right"><a id="hideWarn" href=""><img alt="X" src="../img/admin/close.png" /></a></span><img src="../img/admin/warn2.png" />'.
|
|
(count($warn) > 1 ? $this->l('There are') : $this->l('There is')).' '.count($warn).' '.(count($warn) > 1 ? $this->l('warnings') : $this->l('warning'))
|
|
.'<span style="margin-left:20px;" id="labelSeeMore">
|
|
<a id="linkSeeMore" href="#" style="text-decoration:underline">'.$this->l('Click here to see more').'</a>
|
|
<a id="linkHide" href="#" style="text-decoration:underline;display:none">'.$this->l('Hide warning').'</a></span><ul style="display:none;" id="seeMore">';
|
|
foreach($warn as $val)
|
|
$str_output .= '<li>'.$val.'</li>';
|
|
$str_output .= '</ul>';
|
|
}
|
|
$str_output .= '</div>';
|
|
}
|
|
echo $str_output;
|
|
}
|
|
|
|
/**
|
|
* Display confirmations
|
|
*/
|
|
public function displayConf()
|
|
{
|
|
if ($conf = Tools::getValue('conf'))
|
|
echo '
|
|
<div class="conf">
|
|
<img src="../img/admin/ok2.png" alt="" /> '.$this->_conf[(int)($conf)].'
|
|
</div>';
|
|
}
|
|
|
|
/**
|
|
* Get the current objects' list form the database
|
|
*
|
|
* @param integer $id_lang Language used for display
|
|
* @param string $orderBy ORDER BY clause
|
|
* @param string $_orderWay Order way (ASC, DESC)
|
|
* @param integer $start Offset in LIMIT clause
|
|
* @param integer $limit Row count in LIMIT clause
|
|
*/
|
|
public function getList($id_lang, $orderBy = NULL, $orderWay = NULL, $start = 0, $limit = NULL)
|
|
{
|
|
global $cookie;
|
|
|
|
/* Manage default params values */
|
|
if (empty($limit))
|
|
$limit = ((!isset($cookie->{$this->table.'_pagination'})) ? $this->_pagination[1] : $limit = $cookie->{$this->table.'_pagination'});
|
|
|
|
if (!Validate::isTableOrIdentifier($this->table))
|
|
die (Tools::displayError('Table name is invalid:').' "'.$this->table.'"');
|
|
|
|
if (empty($orderBy))
|
|
$orderBy = $cookie->__get($this->table.'Orderby') ? $cookie->__get($this->table.'Orderby') : $this->_defaultOrderBy;
|
|
if (empty($orderWay))
|
|
$orderWay = $cookie->__get($this->table.'Orderway') ? $cookie->__get($this->table.'Orderway') : 'ASC';
|
|
|
|
$limit = (int)(Tools::getValue('pagination', $limit));
|
|
$cookie->{$this->table.'_pagination'} = $limit;
|
|
|
|
/* Check params validity */
|
|
if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay)
|
|
OR !is_numeric($start) OR !is_numeric($limit)
|
|
OR !Validate::isUnsignedId($id_lang))
|
|
die(Tools::displayError('get list params is not valid'));
|
|
|
|
/* Determine offset from current page */
|
|
if ((isset($_POST['submitFilter'.$this->table]) OR
|
|
isset($_POST['submitFilter'.$this->table.'_x']) OR
|
|
isset($_POST['submitFilter'.$this->table.'_y'])) AND
|
|
!empty($_POST['submitFilter'.$this->table]) AND
|
|
is_numeric($_POST['submitFilter'.$this->table]))
|
|
$start = (int)($_POST['submitFilter'.$this->table] - 1) * $limit;
|
|
|
|
/* Cache */
|
|
$this->_lang = (int)($id_lang);
|
|
$this->_orderBy = $orderBy;
|
|
$this->_orderWay = Tools::strtoupper($orderWay);
|
|
|
|
/* SQL table : orders, but class name is Order */
|
|
$sqlTable = $this->table == 'order' ? 'orders' : $this->table;
|
|
|
|
if ($this->table == 'category'
|
|
&& !Tools::getIsset('id_category')) {
|
|
$orderWay = 'DESC';
|
|
}
|
|
|
|
/* Query in order to get results with all fields */
|
|
$sql = 'SELECT SQL_CALC_FOUND_ROWS
|
|
'.($this->_tmpTableFilter ? ' * FROM (SELECT ' : '').'
|
|
'.($this->lang ? 'b.*, ' : '').'a.*'.(isset($this->_select) ? ', '.$this->_select.' ' : '').'
|
|
FROM `'._DB_PREFIX_.$sqlTable.'` a
|
|
'.($this->lang ? 'LEFT JOIN `'._DB_PREFIX_.$this->table.'_lang` b ON (b.`'.$this->identifier.'` = a.`'.$this->identifier.'` AND b.`id_lang` = '.(int)($id_lang).')' : '').'
|
|
'.(isset($this->_join) ? $this->_join.' ' : '').'
|
|
WHERE 1 '.(isset($this->_where) ? $this->_where.' ' : '').($this->deleted ? 'AND a.`deleted` = 0 ' : '').(isset($this->_filter) ? $this->_filter : '').'
|
|
'.(isset($this->_group) ? $this->_group.' ' : '').'
|
|
'.((isset($this->_filterHaving) || isset($this->_having)) ? 'HAVING ' : '').(isset($this->_filterHaving) ? ltrim($this->_filterHaving, ' AND ') : '').(isset($this->_having) ? $this->_having.' ' : '').'
|
|
ORDER BY '.(($orderBy == $this->identifier) ? 'a.' : '').'`'.pSQL($orderBy).'` '.pSQL($orderWay).
|
|
($this->_tmpTableFilter ? ') tmpTable WHERE 1'.$this->_tmpTableFilter : '').'
|
|
LIMIT '.(int)($start).','.(int)($limit);
|
|
|
|
$this->_list = Db::getInstance()->ExecuteS($sql);
|
|
$this->_listTotal = Db::getInstance()->getValue('SELECT FOUND_ROWS() AS `'._DB_PREFIX_.$this->table.'`');
|
|
|
|
}
|
|
|
|
/**
|
|
* Display image aside object form
|
|
*
|
|
* @param integer $id Object id
|
|
* @param string $image Local image filepath
|
|
* @param integer $size Image width
|
|
* @param integer $id_image Image id (for products with several images)
|
|
* @param string $token Employee token used in the image deletion link
|
|
* @param boolean $disableCache When turned on a timestamp will be added to the image URI to disable the HTTP cache
|
|
*
|
|
* @global string $currentIndex Current URL in order to keep current Tab
|
|
*/
|
|
public function displayImage($id, $image, $size, $id_image = NULL, $token = NULL, $disableCache = false)
|
|
{
|
|
global $currentIndex;
|
|
|
|
if (!isset($token) OR empty($token))
|
|
$token = $this->token;
|
|
if ($id AND file_exists($image))
|
|
echo '
|
|
<div id="image" >
|
|
'.cacheImage($image, $this->table.'_'.(int)($id).'.'.$this->imageType, $size, $this->imageType, $disableCache).'
|
|
<p align="center">'.$this->l('File size').' '.(filesize($image) / 1000).'kb</p>
|
|
<a href="'.$currentIndex.'&'.$this->identifier.'='.(int)($id).'&token='.$token.($id_image ? '&id_image='.(int)($id_image) : '').'&deleteImage=1">
|
|
<img src="../img/admin/delete.gif" alt="'.$this->l('Delete').'" /> '.$this->l('Delete').'</a>
|
|
</div>';
|
|
}
|
|
|
|
/**
|
|
* Display list header (filtering, pagination and column names)
|
|
*
|
|
* @global string $currentIndex Current URL in order to keep current Tab
|
|
*/
|
|
public function displayListHeader($token = NULL)
|
|
{
|
|
global $currentIndex, $cookie;
|
|
$isCms = false;
|
|
if (preg_match('/cms/Ui', $this->identifier))
|
|
$isCms = true;
|
|
$id_cat = Tools::getValue('id_'.($isCms ? 'cms_' : '').'category');
|
|
|
|
if (!isset($token) OR empty($token))
|
|
$token = $this->token;
|
|
|
|
/* Determine total page number */
|
|
$totalPages = ceil($this->_listTotal / Tools::getValue('pagination', (isset($cookie->{$this->table.'_pagination'}) ? $cookie->{$this->table.'_pagination'} : $this->_pagination[0])));
|
|
if (!$totalPages) $totalPages = 1;
|
|
|
|
echo '<a name="'.$this->table.'"> </a>';
|
|
echo '<form method="post" action="'.$currentIndex;
|
|
if (Tools::getIsset($this->identifier))
|
|
echo '&'.$this->identifier.'='.(int)(Tools::getValue($this->identifier));
|
|
echo '&token='.$token;
|
|
if (Tools::getIsset($this->table.'Orderby'))
|
|
echo '&'.$this->table.'Orderby='.urlencode($this->_orderBy).'&'.$this->table.'Orderway='.urlencode(strtolower($this->_orderWay));
|
|
echo '#'.$this->table.'" class="form">
|
|
<input type="hidden" id="submitFilter'.$this->table.'" name="submitFilter'.$this->table.'" value="0">
|
|
<table>
|
|
<tr>
|
|
<td style="vertical-align: bottom;">
|
|
<span style="float: left;">';
|
|
|
|
/* Determine current page number */
|
|
$page = (int)(Tools::getValue('submitFilter'.$this->table));
|
|
if (!$page) $page = 1;
|
|
if ($page > 1)
|
|
echo '
|
|
<input type="image" src="../img/admin/list-prev2.gif" onclick="getE(\'submitFilter'.$this->table.'\').value=1"/>
|
|
<input type="image" src="../img/admin/list-prev.gif" onclick="getE(\'submitFilter'.$this->table.'\').value='.($page - 1).'"/> ';
|
|
echo $this->l('Page').' <b>'.$page.'</b> / '.$totalPages;
|
|
if ($page < $totalPages)
|
|
echo '
|
|
<input type="image" src="../img/admin/list-next.gif" onclick="getE(\'submitFilter'.$this->table.'\').value='.($page + 1).'"/>
|
|
<input type="image" src="../img/admin/list-next2.gif" onclick="getE(\'submitFilter'.$this->table.'\').value='.$totalPages.'"/>';
|
|
echo ' | '.$this->l('Display').'
|
|
<select name="pagination">';
|
|
/* Choose number of results per page */
|
|
$selectedPagination = Tools::getValue('pagination', (isset($cookie->{$this->table.'_pagination'}) ? $cookie->{$this->table.'_pagination'} : NULL));
|
|
foreach ($this->_pagination AS $value)
|
|
echo '<option value="'.(int)($value).'"'.($selectedPagination == $value ? ' selected="selected"' : (($selectedPagination == NULL && $value == $this->_pagination[1]) ? ' selected="selected2"' : '')).'>'.(int)($value).'</option>';
|
|
echo '
|
|
</select>
|
|
/ '.(int)($this->_listTotal).' '.$this->l('result(s)').'
|
|
</span>
|
|
<span style="float: right;">
|
|
<input type="submit" name="submitReset'.$this->table.'" value="'.$this->l('Reset').'" class="button" />
|
|
<input type="submit" id="submitFilterButton_'.$this->table.'" name="submitFilter" value="'.$this->l('Filter').'" class="button" />
|
|
</span>
|
|
<span class="clear"></span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>';
|
|
|
|
/* Display column names and arrows for ordering (ASC, DESC) */
|
|
if (array_key_exists($this->identifier,$this->identifiersDnd) AND $this->_orderBy == 'position')
|
|
{
|
|
echo '
|
|
<script type="text/javascript" src="../js/jquery/jquery.tablednd_0_5.js"></script>
|
|
<script type="text/javascript">
|
|
var token = \''.($token!=NULL ? $token : $this->token).'\';
|
|
var come_from = \''.$this->table.'\';
|
|
var alternate = \''.($this->_orderWay == 'DESC' ? '1' : '0' ).'\';
|
|
</script>
|
|
<script type="text/javascript" src="../js/admin-dnd.js"></script>
|
|
';
|
|
}
|
|
echo '<table'.(array_key_exists($this->identifier,$this->identifiersDnd) ? ' id="'.(((int)(Tools::getValue($this->identifiersDnd[$this->identifier], 1))) ? substr($this->identifier,3,strlen($this->identifier)) : '').'"' : '' ).' class="table'.((array_key_exists($this->identifier,$this->identifiersDnd) AND ($this->_orderBy != 'position 'AND $this->_orderWay != 'DESC')) ? ' tableDnD' : '' ).'" cellpadding="0" cellspacing="0">
|
|
<thead>
|
|
<tr class="nodrag nodrop">
|
|
<th>';
|
|
if ($this->delete)
|
|
echo ' <input type="checkbox" name="checkme" class="noborder" onclick="checkDelBoxes(this.form, \''.$this->table.'Box[]\', this.checked)" />';
|
|
echo ' </th>';
|
|
foreach ($this->fieldsDisplay AS $key => $params)
|
|
{
|
|
echo ' <th '.(isset($params['widthColumn']) ? 'style="width: '.$params['widthColumn'].'px"' : '').'>'.$params['title'];
|
|
if (!isset($params['orderby']) OR $params['orderby'])
|
|
{
|
|
// Cleaning links
|
|
if (Tools::getValue($this->table.'Orderby') && Tools::getValue($this->table.'Orderway'))
|
|
$currentIndex = preg_replace('/&'.$this->table.'Orderby=([a-z _]*)&'.$this->table.'Orderway=([a-z]*)/i', '', $currentIndex);
|
|
echo ' <br />
|
|
<a href="'.$currentIndex.'&'.$this->identifier.'='.$id_cat.'&'.$this->table.'Orderby='.urlencode($key).'&'.$this->table.'Orderway=desc&token='.$token.'"><img border="0" src="../img/admin/down'.((isset($this->_orderBy) AND ($key == $this->_orderBy) AND ($this->_orderWay == 'DESC')) ? '_d' : '').'.gif" /></a>
|
|
<a href="'.$currentIndex.'&'.$this->identifier.'='.$id_cat.'&'.$this->table.'Orderby='.urlencode($key).'&'.$this->table.'Orderway=asc&token='.$token.'"><img border="0" src="../img/admin/up'.((isset($this->_orderBy) AND ($key == $this->_orderBy) AND ($this->_orderWay == 'ASC')) ? '_d' : '').'.gif" /></a>';
|
|
}
|
|
echo ' </th>';
|
|
}
|
|
|
|
/* Check if object can be modified, deleted or detailed */
|
|
if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn'))
|
|
echo ' <th style="width: 52px">'.$this->l('Actions').'</th>';
|
|
echo ' </tr>
|
|
<tr class="nodrag nodrop" style="height: 35px;">
|
|
<td class="center">';
|
|
if ($this->delete)
|
|
echo ' --';
|
|
echo ' </td>';
|
|
|
|
/* Javascript hack in order to catch ENTER keypress event */
|
|
$keyPress = 'onkeypress="formSubmit(event, \'submitFilterButton_'.$this->table.'\');"';
|
|
|
|
/* Filters (input, select, date or bool) */
|
|
foreach ($this->fieldsDisplay AS $key => $params)
|
|
{
|
|
$width = (isset($params['width']) ? ' style="width: '.(int)($params['width']).'px;"' : '');
|
|
echo '<td'.(isset($params['align']) ? ' class="'.$params['align'].'"' : '').'>';
|
|
if (!isset($params['type']))
|
|
$params['type'] = 'text';
|
|
|
|
$value = Tools::getValue($this->table.'Filter_'.(array_key_exists('filter_key', $params) ? $params['filter_key'] : $key));
|
|
if (isset($params['search']) AND !$params['search'])
|
|
{
|
|
echo '--</td>';
|
|
continue;
|
|
}
|
|
switch ($params['type'])
|
|
{
|
|
case 'bool':
|
|
echo '
|
|
<select name="'.$this->table.'Filter_'.$key.'">
|
|
<option value="">--</option>
|
|
<option value="1"'.($value == 1 ? ' selected="selected"' : '').'>'.$this->l('Yes').'</option>
|
|
<option value="0"'.(($value == 0 AND $value != '') ? ' selected="selected"' : '').'>'.$this->l('No').'</option>
|
|
</select>';
|
|
break;
|
|
|
|
case 'date':
|
|
case 'datetime':
|
|
if (is_string($value))
|
|
$value = unserialize($value);
|
|
if (!Validate::isCleanHtml($value[0]) OR !Validate::isCleanHtml($value[1]))
|
|
$value = '';
|
|
$name = $this->table.'Filter_'.(isset($params['filter_key']) ? $params['filter_key'] : $key);
|
|
$nameId = str_replace('!', '__', $name);
|
|
includeDatepicker(array($nameId.'_0', $nameId.'_1'));
|
|
echo $this->l('From').' <input type="text" id="'.$nameId.'_0" name="'.$name.'[0]" value="'.(isset($value[0]) ? $value[0] : '').'"'.$width.' '.$keyPress.' /><br />
|
|
'.$this->l('To').' <input type="text" id="'.$nameId.'_1" name="'.$name.'[1]" value="'.(isset($value[1]) ? $value[1] : '').'"'.$width.' '.$keyPress.' />';
|
|
break;
|
|
|
|
case 'select':
|
|
|
|
if (isset($params['filter_key']))
|
|
{
|
|
echo '<select onchange="$(\'#submitFilter'.$this->table.'\').focus();$(\'#submitFilter'.$this->table.'\').click();" name="'.$this->table.'Filter_'.$params['filter_key'].'" '.(isset($params['width']) ? 'style="width: '.$params['width'].'px"' : '').'>
|
|
<option value=""'.(($value == 0 AND $value != '') ? ' selected="selected"' : '').'>--</option>';
|
|
if (isset($params['select']) AND is_array($params['select']))
|
|
foreach ($params['select'] AS $optionValue => $optionDisplay)
|
|
{
|
|
echo '<option value="'.$optionValue.'"'.((isset($_POST[$this->table.'Filter_'.$params['filter_key']]) AND Tools::getValue($this->table.'Filter_'.$params['filter_key']) == $optionValue AND Tools::getValue($this->table.'Filter_'.$params['filter_key']) != '') ? ' selected="selected"' : '').'>'.$optionDisplay.'</option>';
|
|
}
|
|
echo '</select>';
|
|
break;
|
|
}
|
|
|
|
case 'text':
|
|
default:
|
|
if (!Validate::isCleanHtml($value))
|
|
$value = '';
|
|
echo '<input type="text" name="'.$this->table.'Filter_'.(isset($params['filter_key']) ? $params['filter_key'] : $key).'" value="'.htmlentities($value, ENT_COMPAT, 'UTF-8').'"'.$width.' '.$keyPress.' />';
|
|
}
|
|
echo '</td>';
|
|
}
|
|
|
|
if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn'))
|
|
echo '<td class="center">--</td>';
|
|
|
|
echo '</tr>
|
|
</thead>';
|
|
}
|
|
|
|
public function displayTop()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Display list
|
|
*
|
|
* @global string $currentIndex Current URL in order to keep current Tab
|
|
*/
|
|
public function displayList()
|
|
{
|
|
global $currentIndex;
|
|
|
|
$this->displayTop();
|
|
|
|
if ($this->edit AND (!isset($this->noAdd) OR !$this->noAdd))
|
|
echo '<br /><a href="'.$currentIndex.'&add'.$this->table.'&token='.$this->token.'"><img src="../img/admin/add.gif" border="0" /> '.$this->l('Add new').'</a><br /><br />';
|
|
/* Append when we get a syntax error in SQL query */
|
|
if ($this->_list === false)
|
|
{
|
|
$this->displayWarning($this->l('Bad SQL query'));
|
|
return false;
|
|
}
|
|
|
|
/* Display list header (filtering, pagination and column names) */
|
|
$this->displayListHeader();
|
|
if (!sizeof($this->_list))
|
|
echo '<tr><td class="center" colspan="'.(sizeof($this->fieldsDisplay) + 2).'">'.$this->l('No items found').'</td></tr>';
|
|
|
|
/* Show the content of the table */
|
|
$this->displayListContent();
|
|
|
|
/* Close list table and submit button */
|
|
$this->displayListFooter();
|
|
}
|
|
|
|
public function displayListContent($token = NULL)
|
|
{
|
|
/* Display results in a table
|
|
*
|
|
* align : determine value alignment
|
|
* prefix : displayed before value
|
|
* suffix : displayed after value
|
|
* image : object image
|
|
* icon : icon determined by values
|
|
* active : allow to toggle status
|
|
*/
|
|
|
|
global $currentIndex, $cookie;
|
|
$currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT'));
|
|
|
|
$id_category = 1; // default categ
|
|
|
|
$irow = 0;
|
|
if ($this->_list AND isset($this->fieldsDisplay['position']))
|
|
{
|
|
$positions = array_map(create_function('$elem', 'return (int)($elem[\'position\']);'), $this->_list);
|
|
sort($positions);
|
|
}
|
|
if ($this->_list)
|
|
{
|
|
$isCms = false;
|
|
if (preg_match('/cms/Ui', $this->identifier))
|
|
$isCms = true;
|
|
$keyToGet = 'id_'.($isCms ? 'cms_' : '').'category'.(in_array($this->identifier, array('id_category', 'id_cms_category')) ? '_parent' : '');
|
|
foreach ($this->_list AS $tr)
|
|
{
|
|
$id = $tr[$this->identifier];
|
|
echo '<tr'.(array_key_exists($this->identifier,$this->identifiersDnd) ? ' id="tr_'.(($id_category = (int)(Tools::getValue('id_'.($isCms ? 'cms_' : '').'category', '1'))) ? $id_category : '').'_'.$id.'_'.$tr['position'].'"' : '').($irow++ % 2 ? ' class="alt_row"' : '').' '.((isset($tr['color']) AND $this->colorOnBackground) ? 'style="background-color: '.$tr['color'].'"' : '').'>
|
|
<td class="center">';
|
|
if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete)))
|
|
echo '<input type="checkbox" name="'.$this->table.'Box[]" value="'.$id.'" class="noborder" />';
|
|
echo '</td>';
|
|
foreach ($this->fieldsDisplay AS $key => $params)
|
|
{
|
|
$tmp = explode('!', $key);
|
|
$key = isset($tmp[1]) ? $tmp[1] : $tmp[0];
|
|
echo '
|
|
<td '.(isset($params['position']) ? ' id="td_'.(isset($id_category) AND $id_category ? $id_category : 0).'_'.$id.'"' : '').' class="'.((!isset($this->noLink) OR !$this->noLink) ? 'pointer' : '').((isset($params['position']) AND $this->_orderBy == 'position')? ' dragHandle' : ''). (isset($params['align']) ? ' '.$params['align'] : '').'" ';
|
|
if (!isset($params['position']) AND (!isset($this->noLink) OR !$this->noLink))
|
|
echo ' onclick="document.location = \''.$currentIndex.'&'.$this->identifier.'='.$id.($this->view? '&view' : '&update').$this->table.'&token='.($token!=NULL ? $token : $this->token).'\'">'.(isset($params['prefix']) ? $params['prefix'] : '');
|
|
else
|
|
echo '>';
|
|
if (isset($params['active']) AND isset($tr[$key]))
|
|
$this->_displayEnableLink($token, $id, $tr[$key], $params['active'], Tools::getValue('id_category'), Tools::getValue('id_product'));
|
|
elseif (isset($params['activeVisu']) AND isset($tr[$key]))
|
|
echo '<img src="../img/admin/'.($tr[$key] ? 'enabled.gif' : 'disabled.gif').'"
|
|
alt="'.($tr[$key] ? $this->l('Enabled') : $this->l('Disabled')).'" title="'.($tr[$key] ? $this->l('Enabled') : $this->l('Disabled')).'" />';
|
|
elseif (isset($params['position']))
|
|
{
|
|
if ($this->_orderBy == 'position' AND $this->_orderWay != 'DESC')
|
|
{
|
|
echo '<a'.(!($tr[$key] != $positions[sizeof($positions) - 1]) ? ' style="display: none;"' : '').' href="'.$currentIndex.
|
|
'&'.$keyToGet.'='.(int)($id_category).'&'.$this->identifiersDnd[$this->identifier].'='.$id.'
|
|
&way=1&position='.(int)($tr['position'] + 1).'&token='.($token!=NULL ? $token : $this->token).'">
|
|
<img src="../img/admin/'.($this->_orderWay == 'ASC' ? 'down' : 'up').'.gif"
|
|
alt="'.$this->l('Down').'" title="'.$this->l('Down').'" /></a>';
|
|
|
|
echo '<a'.(!($tr[$key] != $positions[0]) ? ' style="display: none;"' : '').' href="'.$currentIndex.
|
|
'&'.$keyToGet.'='.(int)($id_category).'&'.$this->identifiersDnd[$this->identifier].'='.$id.'
|
|
&way=0&position='.(int)($tr['position'] - 1).'&token='.($token!=NULL ? $token : $this->token).'">
|
|
<img src="../img/admin/'.($this->_orderWay == 'ASC' ? 'up' : 'down').'.gif"
|
|
alt="'.$this->l('Up').'" title="'.$this->l('Up').'" /></a>'; }
|
|
else
|
|
echo (int)($tr[$key] + 1);
|
|
}
|
|
elseif (isset($params['image']))
|
|
{
|
|
// item_id is the product id in a product image context, else it is the image id.
|
|
$item_id = isset($params['image_id']) ? $tr[$params['image_id']] : $id;
|
|
// If it's a product image
|
|
if (isset($tr['id_image']))
|
|
{
|
|
$image = new Image((int)$tr['id_image']);
|
|
$path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$image->getExistingImgPath().'.'.$this->imageType;
|
|
}else
|
|
$path_to_image = _PS_IMG_DIR_.$params['image'].'/'.$item_id.(isset($tr['id_image']) ? '-'.(int)($tr['id_image']) : '').'.'.$this->imageType;
|
|
|
|
echo cacheImage($path_to_image, $this->table.'_mini_'.$item_id.'.'.$this->imageType, 45, $this->imageType);
|
|
}
|
|
elseif (isset($params['icon']) AND (isset($params['icon'][$tr[$key]]) OR isset($params['icon']['default'])))
|
|
echo '<img src="../img/admin/'.(isset($params['icon'][$tr[$key]]) ? $params['icon'][$tr[$key]] : $params['icon']['default'].'" alt="'.$tr[$key]).'" title="'.$tr[$key].'" />';
|
|
elseif (isset($params['price']))
|
|
echo Tools::displayPrice($tr[$key], (isset($params['currency']) ? Currency::getCurrencyInstance((int)($tr['id_currency'])) : $currency), false);
|
|
elseif (isset($params['float']))
|
|
echo rtrim(rtrim($tr[$key], '0'), '.');
|
|
elseif (isset($params['type']) AND $params['type'] == 'date')
|
|
echo Tools::displayDate($tr[$key], (int)$cookie->id_lang);
|
|
elseif (isset($params['type']) AND $params['type'] == 'datetime')
|
|
echo Tools::displayDate($tr[$key], (int)$cookie->id_lang, true);
|
|
elseif (isset($tr[$key]))
|
|
{
|
|
$echo = ($key == 'price' ? round($tr[$key], 2) : isset($params['maxlength']) ? Tools::substr($tr[$key], 0, $params['maxlength']).'...' : $tr[$key]);
|
|
echo isset($params['callback']) ? call_user_func_array(array($this->className, $params['callback']), array($echo, $tr)) : $echo;
|
|
}
|
|
else
|
|
echo '--';
|
|
|
|
echo (isset($params['suffix']) ? $params['suffix'] : '').
|
|
'</td>';
|
|
}
|
|
|
|
if ($this->edit OR $this->delete OR ($this->view AND $this->view !== 'noActionColumn'))
|
|
{
|
|
echo '<td class="center" style="white-space: nowrap;">';
|
|
if ($this->view)
|
|
$this->_displayViewLink($token, $id);
|
|
if ($this->edit)
|
|
$this->_displayEditLink($token, $id);
|
|
if ($this->delete AND (!isset($this->_listSkipDelete) OR !in_array($id, $this->_listSkipDelete)))
|
|
$this->_displayDeleteLink($token, $id);
|
|
if ($this->duplicate)
|
|
$this->_displayDuplicate($token, $id);
|
|
echo '</td>';
|
|
}
|
|
echo '</tr>';
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
protected function _displayEnableLink($token, $id, $value, $active, $id_category = NULL, $id_product = NULL)
|
|
{
|
|
global $currentIndex;
|
|
|
|
echo '<a href="'.$currentIndex.'&'.$this->identifier.'='.$id.'&'.$active.$this->table.
|
|
((int)$id_category AND (int)$id_product ? '&id_category='.$id_category : '').'&token='.($token!=NULL ? $token : $this->token).'">
|
|
<img src="../img/admin/'.($value ? 'enabled.gif' : 'disabled.gif').'"
|
|
alt="'.($value ? $this->l('Enabled') : $this->l('Disabled')).'" title="'.($value ? $this->l('Enabled') : $this->l('Disabled')).'" /></a>';
|
|
}
|
|
|
|
protected function _displayDuplicate($token = NULL, $id)
|
|
{
|
|
global $currentIndex;
|
|
|
|
$_cacheLang['Duplicate'] = $this->l('Duplicate');
|
|
$_cacheLang['Copy images too?'] = $this->l('Copy images too?', __CLASS__, TRUE, FALSE);
|
|
|
|
$duplicate = $currentIndex.'&'.$this->identifier.'='.$id.'&duplicate'.$this->table;
|
|
|
|
echo '
|
|
<a class="pointer" onclick="if (confirm(\''.$_cacheLang['Copy images too?'].'\')) document.location = \''.$duplicate.'&token='.($token!=NULL ? $token : $this->token).'\'; else document.location = \''.$duplicate.'&noimage=1&token='.($token ? $token : $this->token).'\';">
|
|
<img src="../img/admin/duplicate.png" alt="'.$_cacheLang['Duplicate'].'" title="'.$_cacheLang['Duplicate'].'" /></a>';
|
|
}
|
|
|
|
protected function _displayViewLink($token = NULL, $id)
|
|
{
|
|
global $currentIndex;
|
|
|
|
$_cacheLang['View'] = $this->l('View');
|
|
|
|
echo '
|
|
<a href="'.$currentIndex.'&'.$this->identifier.'='.$id.'&view'.$this->table.'&token='.($token!=NULL ? $token : $this->token).'">
|
|
<img src="../img/admin/details.gif" alt="'.$_cacheLang['View'].'" title="'.$_cacheLang['View'].'" /></a>';
|
|
}
|
|
|
|
protected function _displayEditLink($token = NULL, $id)
|
|
{
|
|
global $currentIndex;
|
|
|
|
$_cacheLang['Edit'] = $this->l('Edit');
|
|
|
|
echo '
|
|
<a href="'.$currentIndex.'&'.$this->identifier.'='.$id.'&update'.$this->table.'&token='.($token!=NULL ? $token : $this->token).'">
|
|
<img src="../img/admin/edit.gif" alt="" title="'.$_cacheLang['Edit'].'" /></a>';
|
|
}
|
|
|
|
protected function _displayDeleteLink($token = NULL, $id)
|
|
{
|
|
global $currentIndex;
|
|
|
|
$_cacheLang['Delete'] = $this->l('Delete');
|
|
$_cacheLang['DeleteItem'] = $this->l('Delete item #', __CLASS__, TRUE, FALSE);
|
|
|
|
echo '
|
|
<a href="'.$currentIndex.'&'.$this->identifier.'='.$id.'&delete'.$this->table.'&token='.($token!=NULL ? $token : $this->token).'" onclick="return confirm(\''.$_cacheLang['DeleteItem'].$id.' ?'.
|
|
(!is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : '').'\');">
|
|
<img src="../img/admin/delete.gif" alt="'.$_cacheLang['Delete'].'" title="'.$_cacheLang['Delete'].'" /></a>';
|
|
}
|
|
|
|
/**
|
|
* Close list table and submit button
|
|
*/
|
|
public function displayListFooter($token = NULL)
|
|
{
|
|
echo '</table>';
|
|
if ($this->delete)
|
|
echo '<p><input type="submit" class="button" name="submitDel'.$this->table.'" value="'.$this->l('Delete selection').'" onclick="return confirm(\''.$this->l('Delete selected items?', __CLASS__, TRUE, FALSE).'\');" /></p>';
|
|
echo '
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<input type="hidden" name="token" value="'.($token ? $token : $this->token).'" />
|
|
</form>';
|
|
if (isset($this->_includeTab) AND sizeof($this->_includeTab))
|
|
echo '<br /><br />';
|
|
}
|
|
|
|
/**
|
|
* Options lists
|
|
*/
|
|
public function displayOptionsList()
|
|
{
|
|
global $currentIndex, $cookie, $tab;
|
|
|
|
if (!isset($this->_fieldsOptions) OR !sizeof($this->_fieldsOptions))
|
|
return false;
|
|
|
|
$defaultLanguage = (int)Configuration::get('PS_LANG_DEFAULT');
|
|
$this->_languages = Language::getLanguages(false);
|
|
$tab = Tab::getTab((int)$cookie->id_lang, Tab::getIdFromClassName($tab));
|
|
echo '<br /><br />';
|
|
echo (isset($this->optionTitle) ? '<h2>'.$this->optionTitle.'</h2>' : '');
|
|
echo '
|
|
<script type="text/javascript">
|
|
id_language = Number('.$defaultLanguage.');
|
|
</script>
|
|
<form action="'.$currentIndex.'" id="'.$tab['name'].'" name="'.$tab['name'].'" method="post">
|
|
<fieldset>';
|
|
echo (isset($this->optionTitle) ? '<legend>
|
|
<img src="'.(!empty($tab['module']) && file_exists($_SERVER['DOCUMENT_ROOT']._MODULE_DIR_.$tab['module'].'/'.$tab['class_name'].'.gif') ? _MODULE_DIR_.$tab['module'].'/' : '../img/t/').$tab['class_name'].'.gif" />'
|
|
.$this->optionTitle.'</legend>' : '');
|
|
foreach ($this->_fieldsOptions AS $key => $field)
|
|
{
|
|
$val = Tools::getValue($key, Configuration::get($key));
|
|
if ($field['type'] != 'textLang')
|
|
if (!Validate::isCleanHtml($val))
|
|
$val = Configuration::get($key);
|
|
|
|
echo '<label>'.$field['title'].' </label>
|
|
<div class="margin-form">';
|
|
switch ($field['type'])
|
|
{
|
|
case 'select':
|
|
echo '<select name="'.$key.'">';
|
|
foreach ($field['list'] AS $value)
|
|
echo '<option
|
|
value="'.(isset($field['cast']) ? $field['cast']($value[$field['identifier']]) : $value[$field['identifier']]).'"'.($val == $value[$field['identifier']] ? ' selected="selected"' : '').'>'.$value['name'].'</option>';
|
|
echo '</select>';
|
|
break;
|
|
case 'bool':
|
|
echo '<label class="t" for="'.$key.'_on"><img src="../img/admin/enabled.gif" alt="'.$this->l('Yes').'" title="'.$this->l('Yes').'" /></label>
|
|
<input type="radio" name="'.$key.'" id="'.$key.'_on" value="1"'.($val ? ' checked="checked"' : '').' />
|
|
<label class="t" for="'.$key.'_on"> '.$this->l('Yes').'</label>
|
|
<label class="t" for="'.$key.'_off"><img src="../img/admin/disabled.gif" alt="'.$this->l('No').'" title="'.$this->l('No').'" style="margin-left: 10px;" /></label>
|
|
<input type="radio" name="'.$key.'" id="'.$key.'_off" value="0" '.(!$val ? 'checked="checked"' : '').'/>
|
|
<label class="t" for="'.$key.'_off"> '.$this->l('No').'</label>';
|
|
break;
|
|
case 'textLang':
|
|
foreach ($this->_languages as $language)
|
|
{
|
|
$val = Tools::getValue($key.'_'.$language['id_lang'], Configuration::get($key, $language['id_lang']));
|
|
if (!Validate::isCleanHtml($val))
|
|
$val = Configuration::get($key);
|
|
echo '
|
|
<div id="'.$key.'_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;">
|
|
<input size="'.$field['size'].'" type="text" name="'.$key.'_'.$language['id_lang'].'" value="'.$val.'" />
|
|
</div>';
|
|
}
|
|
$this->displayFlags($this->_languages, $defaultLanguage, $key, $key);
|
|
echo '<br style="clear:both">';
|
|
break;
|
|
case 'textareaLang':
|
|
foreach ($this->_languages as $language)
|
|
{
|
|
$val = Configuration::get($key, $language['id_lang']);
|
|
echo '
|
|
<div id="'.$key.'_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $defaultLanguage ? 'block' : 'none').'; float: left;">
|
|
<textarea rows="'.(int)($field['rows']).'" cols="'.(int)($field['cols']).'" name="'.$key.'_'.$language['id_lang'].'">'.str_replace('\r\n', "\n", $val).'</textarea>
|
|
</div>';
|
|
}
|
|
$this->displayFlags($this->_languages, $defaultLanguage, $key, $key);
|
|
echo '<br style="clear:both">';
|
|
break;
|
|
case 'text':
|
|
default:
|
|
echo '<input type="text" name="'.$key.'" value="'.$val.'" size="'.$field['size'].'" />'.(isset($field['suffix']) ? $field['suffix'] : '');
|
|
}
|
|
|
|
if (isset($field['required']) AND $field['required'])
|
|
echo ' <sup>*</sup>';
|
|
|
|
echo (isset($field['desc']) ? '<p>'.$field['desc'].'</p>' : '');
|
|
echo '</div>';
|
|
}
|
|
echo '<div class="margin-form">
|
|
<input type="submit" value="'.$this->l(' Save ').'" name="submitOptions'.$this->table.'" class="button" />
|
|
</div>
|
|
</fieldset>
|
|
<input type="hidden" name="token" value="'.$this->token.'" />
|
|
</form>';
|
|
}
|
|
|
|
/**
|
|
* Load class object using identifier in $_GET (if possible)
|
|
* otherwise return an empty object, or die
|
|
*
|
|
* @param boolean $opt Return an empty object if load fail
|
|
* @return object
|
|
*/
|
|
protected function loadObject($opt = false)
|
|
{
|
|
if ($id = (int)(Tools::getValue($this->identifier)) AND Validate::isUnsignedId($id))
|
|
{
|
|
if (!$this->_object)
|
|
$this->_object = new $this->className($id);
|
|
if (Validate::isLoadedObject($this->_object))
|
|
return $this->_object;
|
|
$this->_errors[] = Tools::displayError('Object cannot be loaded (not found)');
|
|
}
|
|
elseif ($opt)
|
|
{
|
|
$this->_object = new $this->className();
|
|
return $this->_object;
|
|
}
|
|
else
|
|
$this->_errors[] = Tools::displayError('Object cannot be loaded (identifier missing or invalid)');
|
|
|
|
$this->displayErrors();
|
|
}
|
|
|
|
/**
|
|
* Return field value if possible (both classical and multilingual fields)
|
|
*
|
|
* Case 1 : Return value if present in $_POST / $_GET
|
|
* Case 2 : Return object value
|
|
*
|
|
* @param object $obj Object
|
|
* @param string $key Field name
|
|
* @param integer $id_lang Language id (optional)
|
|
* @return string
|
|
*/
|
|
protected function getFieldValue($obj, $key, $id_lang = NULL)
|
|
{
|
|
if ($id_lang)
|
|
$defaultValue = ($obj->id AND isset($obj->{$key}[$id_lang])) ? $obj->{$key}[$id_lang] : '';
|
|
else
|
|
$defaultValue = isset($obj->{$key}) ? $obj->{$key} : '';
|
|
|
|
return Tools::getValue($key.($id_lang ? '_'.$id_lang : ''), $defaultValue);
|
|
}
|
|
|
|
/**
|
|
* Display form
|
|
*
|
|
* @global string $currentIndex Current URL in order to keep current Tab
|
|
*/
|
|
public function displayForm($firstCall = true)
|
|
{
|
|
global $cookie;
|
|
|
|
$allowEmployeeFormLang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
|
|
if ($allowEmployeeFormLang && !$cookie->employee_form_lang)
|
|
$cookie->employee_form_lang = (int)(Configuration::get('PS_LANG_DEFAULT'));
|
|
$useLangFromCookie = false;
|
|
$this->_languages = Language::getLanguages(false);
|
|
if ($allowEmployeeFormLang)
|
|
foreach ($this->_languages AS $lang)
|
|
if ($cookie->employee_form_lang == $lang['id_lang'])
|
|
$useLangFromCookie = true;
|
|
if (!$useLangFromCookie)
|
|
$this->_defaultFormLanguage = (int)(Configuration::get('PS_LANG_DEFAULT'));
|
|
else
|
|
$this->_defaultFormLanguage = (int)($cookie->employee_form_lang);
|
|
|
|
// Only if it is the first call to displayForm, otherwise it has already been defined
|
|
if ($firstCall)
|
|
{
|
|
echo '
|
|
<script type="text/javascript">
|
|
$(document).ready(function() {
|
|
id_language = '.$this->_defaultFormLanguage.';
|
|
languages = new Array();';
|
|
foreach ($this->_languages AS $k => $language)
|
|
echo '
|
|
languages['.$k.'] = {
|
|
id_lang: '.(int)$language['id_lang'].',
|
|
iso_code: \''.$language['iso_code'].'\',
|
|
name: \''.htmlentities($language['name'], ENT_COMPAT, 'UTF-8').'\'
|
|
};';
|
|
echo '
|
|
displayFlags(languages, id_language, '.$allowEmployeeFormLang.');
|
|
});
|
|
</script>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display object details
|
|
*
|
|
* @global string $currentIndex Current URL in order to keep current Tab
|
|
*/
|
|
public function viewDetails() { global $currentIndex; }
|
|
|
|
/**
|
|
* Called before deletion
|
|
*
|
|
* @param object $object Object
|
|
* @return boolean
|
|
*/
|
|
protected function beforeDelete($object) { return true; }
|
|
|
|
/**
|
|
* Called before deletion
|
|
*
|
|
* @param object $object Object
|
|
* @return boolean
|
|
*/
|
|
protected function afterDelete($object, $oldId) { return true; }
|
|
|
|
protected function afterAdd($object) { return true; }
|
|
|
|
protected function afterUpdate($object) { return true; }
|
|
|
|
/**
|
|
* Check rights to view the current tab
|
|
*
|
|
* @return boolean
|
|
*/
|
|
|
|
protected function afterImageUpload() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Check rights to view the current tab
|
|
*
|
|
* @return boolean
|
|
*/
|
|
|
|
public function viewAccess($disable = false)
|
|
{
|
|
global $cookie;
|
|
|
|
if ($disable)
|
|
return true;
|
|
|
|
$this->tabAccess = Profile::getProfileAccess($cookie->profile, $this->id);
|
|
|
|
if ($this->tabAccess['view'] === '1')
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check for security token
|
|
*/
|
|
public function checkToken()
|
|
{
|
|
$token = Tools::getValue('token');
|
|
return (!empty($token) AND $token === $this->token);
|
|
}
|
|
|
|
/**
|
|
* Display flags in forms for translations
|
|
*
|
|
* @param array $languages All languages available
|
|
* @param integer $default_language Default language id
|
|
* @param string $ids Multilingual div ids in form
|
|
* @param string $id Current div id]
|
|
* @param boolean $return define the return way : false for a display, true for a return
|
|
* @param boolean $use_vars_instead_of_ids use an js vars instead of ids seperate by "¤"
|
|
*/
|
|
public function displayFlags($languages, $default_language, $ids, $id, $return = false, $use_vars_instead_of_ids = false)
|
|
{
|
|
if (sizeof($languages) == 1)
|
|
return false;
|
|
$output = '
|
|
<div class="displayed_flag">
|
|
<img src="../img/l/'.$default_language.'.jpg" class="pointer" id="language_current_'.$id.'" onclick="toggleLanguageFlags(this);" alt="" />
|
|
</div>
|
|
<div id="languages_'.$id.'" class="language_flags">
|
|
'.$this->l('Choose language:').'<br /><br />';
|
|
foreach ($languages as $language)
|
|
if($use_vars_instead_of_ids)
|
|
$output .= '<img src="../img/l/'.(int)($language['id_lang']).'.jpg" class="pointer" alt="'.$language['name'].'" title="'.$language['name'].'" onclick="changeLanguage(\''.$id.'\', '.$ids.', '.$language['id_lang'].', \''.$language['iso_code'].'\');" /> ';
|
|
else
|
|
$output .= '<img src="../img/l/'.(int)($language['id_lang']).'.jpg" class="pointer" alt="'.$language['name'].'" title="'.$language['name'].'" onclick="changeLanguage(\''.$id.'\', \''.$ids.'\', '.$language['id_lang'].', \''.$language['iso_code'].'\');" /> ';
|
|
$output .= '</div>';
|
|
|
|
if ($return)
|
|
return $output;
|
|
echo $output;
|
|
}
|
|
|
|
protected function filterToField($key, $filter)
|
|
{
|
|
foreach ($this->fieldsDisplay AS $field)
|
|
if (array_key_exists('filter_key', $field) AND $field['filter_key'] == $key)
|
|
return $field;
|
|
if (array_key_exists($filter, $this->fieldsDisplay))
|
|
return $this->fieldsDisplay[$filter];
|
|
return false;
|
|
}
|
|
|
|
protected function warnDomainName()
|
|
{
|
|
if ($_SERVER['HTTP_HOST'] != Configuration::get('PS_SHOP_DOMAIN') AND $_SERVER['HTTP_HOST'] != Configuration::get('PS_SHOP_DOMAIN_SSL'))
|
|
$this->displayWarning($this->l('Your are currently connected with the following domain name:').' <span style="color: #CC0000;">'.$_SERVER['HTTP_HOST'].'</span><br />'.
|
|
$this->l('This one is different from the main shop domain name set in "Preferences > SEO & URLs":').' <span style="color: #CC0000;">'.Configuration::get('PS_SHOP_DOMAIN').'</span><br />
|
|
<a href="index.php?tab=AdminMeta&token='.Tools::getAdminTokenLite('AdminMeta').'#SEO%20%26%20URLs">'.
|
|
$this->l('Click here if you want to modify the main shop domain name').'</a>');
|
|
}
|
|
}
|
|
|