// fixed item edition for AdminAddresses

git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@8897 b9a71923-0436-4b27-9f14-aed3839534dd
This commit is contained in:
tDidierjean
2011-09-29 16:25:58 +00:00
parent 093c743141
commit 923eb2cd21
4 changed files with 418 additions and 53 deletions
+372 -11
View File
@@ -32,6 +32,8 @@ class AdminControllerCore extends Controller
/** @var string Security token */
public $token;
protected $_object;
/** @var string shop | group_shop */
public $shopLinkType;
@@ -80,7 +82,9 @@ class AdminControllerCore extends Controller
protected $noLink;
protected $specificConfirmDelete;
protected $colorOnBackground;
/** @string Action to perform : 'edit', 'view', 'add', ... */
protected $action;
protected $_includeContainer = true;
public function __construct()
{
@@ -97,6 +101,7 @@ class AdminControllerCore extends Controller
$controller = substr($controller,0,-10);
parent::__construct();
// if this->template is empty,
// generate the filename from the classname, without "Controller" suffix
if (empty($this->template))
@@ -127,6 +132,8 @@ class AdminControllerCore extends Controller
);
if (!$this->identifier) $this->identifier = 'id_'.$this->table;
if (!$this->_defaultOrderBy) $this->_defaultOrderBy = $this->identifier;
$this->tabAccess = Profile::getProfileAccess($this->context->employee->id_profile, $this->id);
// Fix for AdminHome
if ($controller == 'AdminHome')
$_POST['token'] = $this->token;
@@ -387,7 +394,6 @@ class AdminControllerCore extends Controller
{
$object = new $this->className();
$this->copyFromPost($object, $this->table);
// d($object);
if (!$object->add())
$this->_errors[] = Tools::displayError('An error occurred while creating object.').' <b>'.$this->table.' ('.Db::getInstance()->getMsgError().')</b>';
elseif (($_POST[$this->identifier] = $object->id /* voluntary */) AND $this->postImage($object->id) AND !sizeof($this->_errors) AND $this->_redirect)
@@ -516,6 +522,77 @@ class AdminControllerCore extends Controller
}
}
/**
* Display form
*/
public function displayForm($firstCall = true)
{
$content = '';
$allowEmployeeFormLang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
if ($allowEmployeeFormLang && !$this->context->cookie->employee_form_lang)
$this->context->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 ($this->context->cookie->employee_form_lang == $lang['id_lang'])
$useLangFromCookie = true;
if (!$useLangFromCookie)
$this->_defaultFormLanguage = (int)(Configuration::get('PS_LANG_DEFAULT'));
else
$this->_defaultFormLanguage = (int)($this->context->cookie->employee_form_lang);
// Only if it is the first call to displayForm, otherwise it has already been defined
if ($firstCall)
{
$content .='
<script type="text/javascript">
$(document).ready(function() {
id_language = '.$this->_defaultFormLanguage.';
languages = new Array();';
foreach ($this->_languages AS $k => $language)
$content .= '
languages['.$k.'] = {
id_lang: '.(int)$language['id_lang'].',
iso_code: \''.$language['iso_code'].'\',
name: \''.htmlentities($language['name'], ENT_COMPAT, 'UTF-8').'\'
};';
$content .= '
displayFlags(languages, id_language, '.$allowEmployeeFormLang.');
});
</script>';
}
return $content;
}
/**
* 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();
}
/**
* Check if the token is valid, else display a warning page
*/
@@ -562,8 +639,7 @@ class AdminControllerCore extends Controller
}
public function display()
{
if(!empty($this->content))
$this->context->smarty->assign('content', $this->content);
$this->context->smarty->assign('content', $this->content);
$this->context->smarty->assign('meta_title',$this->meta_title);
@@ -574,24 +650,23 @@ class AdminControllerCore extends Controller
$default_tpl = substr($class_name,0,-10).'.tpl';
if (file_exists($this->context->smarty->template_dir.'/'.$default_tpl))
{
$this->template = $default_tpl;
$this->template = $default_tpladdress;
}
else
$this->template = 'content.tpl';
}
else
$content = $this->context->smarty->fetch($this->template);
$page = $this->context->smarty->fetch($this->template);
if ($this->content_only)
echo $content;
echo $page;
else
{
$this->context->smarty->assign('warnings',$this->warnings);
$content = $this->context->smarty->fetch($this->template);
$page = $this->context->smarty->fetch($this->template);
}
$this->context->smarty->assign('content',$content);
$this->context->smarty->assign('page', $page);
$this->context->smarty->display($this->layout);
}
@@ -764,6 +839,41 @@ class AdminControllerCore extends Controller
*/
public function initContent()
{
if ($this->_errors)
$this->content = $this->displayErrors();
else
{
if ($this->action == 'edit' && $this->id_entity)
{
$this->content .= $this->displayForm();
if ($this->tabAccess['view']){
if (Tools::getValue('back'))
$this->context->smarty->assign('back', Tools::safeOutput(Tools::getValue('back')));
else
$this->context->smarty->assign('back', Tools::safeOutput(Tools::getValue(self::$currentIndex.'&token='.$this->token)));
}
// move to form.tpl
$this->content .= '<br /><br /><a href="'.((Tools::getValue('back')) ? Tools::getValue('back') : self::$currentIndex.'&token='.$this->token).'"><img src="../img/admin/arrow2.gif" /> '.((Tools::getValue('back')) ? $this->l('Back') : $this->l('Back to list')).'</a><br />';
}
elseif ($this->action == 'list')
{
$this->getList($this->context->language->id);
$helper = new HelperList();
$helper->view = $this->view;
$helper->edit = $this->edit;
$helper->delete = $this->delete;
$helper->duplicate = $this->duplicate;
$helper::$currentIndex = self::$currentIndex;
$helper->table = $this->table;
$helper->shopLink = $this->shopLink;
$helper->shopLinkType = $this->shopLinkType;
$helper->identifier = $this->identifier;
$helper->token = $this->token;
$this->content .= $helper->generateList($this->_list, $this->fieldsDisplay);
}
}
}
/**
@@ -916,11 +1026,52 @@ class AdminControllerCore extends Controller
}
elseif (strncmp($key, $this->table.'OrderBy', 7) === 0 OR strncmp($key, $this->table.'Orderway', 12) === 0)
$this->context->cookie->$key = $value;
// Code from postProcess
if (isset($_GET['update'.$this->table]) && isset($_GET['id_'.$this->table]))
{
if ($this->tabAccess['edit'] === '1' OR ($this->table == 'employee' AND $this->context->employee->id == Tools::getValue('id_employee')))
{
$this->action = 'edit';
$this->id_entity = (int)$_GET['id_'.$this->table];
}
else
$this->_errors[] = Tools::displayError('You do not have permission to edit here.');
}
}
/**
* Display errors
*/
public function displayErrors()
{
p($this->_errors);
if ($nbErrors = count($this->_errors) AND $this->_includeContainer)
{
$content = '<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)
$content .= $this->_errors[0];
else
{
$content .= $nbErrors.' '.$this->l('errors').'<br /><ol>';
foreach ($this->_errors AS $error)
$content .= '<li>'.$error.'</li>';
$content .= '</ol>';
}
$content .= '</div>';
}
// @TODO includesubtab
$this->includeSubTab('displayErrors');
return $content;
}
/**
@@ -1027,4 +1178,214 @@ class AdminControllerCore extends Controller
$this->_list = Db::getInstance()->ExecuteS($sql);
$this->_listTotal = Db::getInstance()->getValue('SELECT FOUND_ROWS() AS `'._DB_PREFIX_.$this->table.'`');
}
/**
* 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);
}
/**
* 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 ($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() { }
/**
* Display object details
*/
public function viewDetails() {}
/**
* 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;
}
/**
* 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'])];
}
}
protected function updateAssoShop($id_object = false)
{
if (!Shop::isMultiShopActivated())
return ;
$shopAsso = Shop::getAssoTables();
$groupShopAsso = GroupShop::getAssoTables();
if (isset($shopAsso[$this->table]) && $shopAsso[$this->table]['type'] == 'shop')
$type = 'shop';
else if (isset($groupShopAsso[$this->table]) && $groupShopAsso[$this->table]['type'] == 'group_shop')
$type = 'group_shop';
else
return ;
$assos = array();
foreach ($_POST AS $k => $row)
{
if (!preg_match('/^checkBox'.Tools::toCamelCase($type, true).'Asso_'.$this->table.'_([0-9]+)?_([0-9]+)$/Ui', $k, $res))
continue;
$id_asso_object = (!empty($res[1]) ? $res[1] : $id_object);
$assos[] = array('id_object' => (int)$id_asso_object, 'id_'.$type => (int)$res[2]);
}
Db::getInstance()->Execute('DELETE FROM '._DB_PREFIX_.$this->table.'_'.$type.($id_object ? ' WHERE `'.$this->identifier.'`='.(int)$id_object : ''));
foreach ($assos AS $asso)
Db::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.$this->table.'_'.$type.' (`'.pSQL($this->identifier).'`, id_'.$type.')
VALUES('.(int)$asso['id_object'].', '.(int)$asso['id_'.$type].')');
}
/**
* 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;
}
}