Jump to content

[ASTUCE] Override/Extends d'une AdminTab via un module


Recommended Posts

Bonjour,

 

J'ai pensé que ca pourrait toujours servir à quelqu'un d'overrider une AdminTab core. Je vous donne ma méthode ci-dessous donc. L'exemple, c'est l'override de l'AdminCatalog mais ca marche avec tout.

 

 

1. structure du module

+ /modules/nom_module
+ classes (répertoire - si besoin)
+ js (répertoire - si besoin)
+ css (répertoire - si besoin)
+ ...etc (autres répertoires - si besoin)
- AdminCatalog.gif (logo de l'AdminTab à overrider ou à étendre)
- AdminCatalog.php (AdminTab à overridé ou à étendre)
- nom_module.php ('controlleur' du module)
- en, es, fr.php (fichiers de trads)
- license.txt (license du module, si besoin)
- logo.gif (votre logo)

 

 

 

2. 'Détournement' de la classe Core à l'install du module

L'idée est simple, il s'agit de prévenir Prestashop que la classe AdminCatalog qui sera utilisée sera désormais celle du module, et ca passe par une gestion des onglets directement via la base de données.

 

Pour ca, j'ai 2 fonctions :

- Remplacement de l'endroit de référence de l'AdminTab par celle du module (pour l'install)

- Remise en l'état de l'AdminTab de référence (pour la désintall)

 

Fonction de déclaration de l'override :

 /**
  * Update a tab classname from a module
  *
  * @author Luc Lérot Freelance <[email protected]>
  *
  * @param string $originalTabClassName Orignal class name of the tab to replace
  * @param array $newTabClassName Class name of new tab
  * @param bool $changeTabIcon Add or not module icond to new tab
  * @return bool
  */
 public function changeAdminTabClass($originalTabClassName, $newTabClassName, $changeTabIcon=false) {
  //Manage Tab Icon
if ($changeTabIcon) {
	@copy(_PS_MODULE_DIR_.$this->name.'/logo.gif', _PS_IMG_DIR_.'t/'.$newTabClassName.'.gif');
	@copy(_PS_MODULE_DIR_.$this->name.'/logo.gif', _PS_MODULE_DIR_.$this->name.'/'.$newTabClassName.'.gif');
}
else {
 @copy(_PS_IMG_DIR_.'t/'.$originalTabClassName.'.gif', _PS_IMG_DIR_.'t/'.$newTabClassName.'.gif');
	@copy(_PS_IMG_DIR_.'t/'.$originalTabClassName.'.gif', _PS_MODULE_DIR_.$this->name.'/'.$newTabClassName.'.gif');
}
//Get id from original Tab class
$idTab = Tab::getIdFromClassName($originalTabClassName);
//If found, proceed to override
if($idTab != 0) {
  $tab = new Tab ($idTab);
  $tab->class_name = $newTabClassName;
  $tab->module = $this->name;
  return $tab->save();
}
return false;
 }

 

 

 

Fonction de remise en état :

 /**
  * Reset a tab from a module
  *
  * @author Luc Lérot Freelance <[email protected]>
  *
  * @param string $originalTabClassName Original class name of the tab
  * @param string $replacedByTabClassName Class name that replaced the orginal one
  * @param string $originalTabModule Module name of original tab
  * @return bool
  */
 public function resetAdminTabClass ($originalTabClassName, $replacedByTabClassName, $originalTabModule=null)
 {
$idTab = Tab::getIdFromClassName($replacedByTabClassName);
if($idTab != 0) {
	$tab = new Tab ($idTab);
	$tab->class_name = $originalTabClassName;
  $tab->module = $originalTabModule;
  return $tab->save();
  }
  return false;
 }

 

 

 

 

3. Utilisation des fonctions à l'install et désintall du module

 

Install :

/**
 * Install procedure
 */
function install () {
 if (
  !parent::install()  
  || !$this->changeAdminTabClass('AdminCatalog','AdminCatalog')
 )
  return false;
 return true;
}

 

 

Désinstall :

/**
 * Uninstall Procedure
 */
function uninstall () {
 if (
  !parent::uninstall()
  OR !$this->resetAdminTabClass('AdminCatalog','AdminCatalog')
 )
  return false;
 return true;
}

 

 

 

4. Astuces

- Les 2 fonctions citées peuvent servir plusieurs fois, et il est tout à fait possible (voire mieux) de les insérer directement dans un override de la classe Module (via le répertoire Override cette fois-ci)

 

- La gestion des trads peut poser pb parfois avec ce genre de procédé (et notamment dans le cas précis d'AdminCatalog ou AdminProducts). Je vous propose donc aussi la fonction l() telle que je l'ai ré-écrite, à insérer dans les override des AdminTabs Core.

 

 /**
 *
 * Override - use translations files to replace english expression.
 *
 * @param mixed $string term or expression in english
 * @param string $class
 * @param boolan $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) {

 global $_LANGADM, $_MODULE;


 //set MD5 key
 $md5Key = md5(str_replace('\'', '\\\'', $string));

 //set module key
 $moduleKey = '';

 //Manage Module translations
 $currentClass = get_class($this);
 if (Module::getModuleNameFromClass($currentClass)) {
  $currentKey = '<{'.strtolower(Module::$classInModule[$currentClass]).'}'.strtolower(_THEME_NAME_).'>'.strtolower($currentClass).'_'.$md5Key;
  $defaultKey = '<{'.strtolower(Module::$classInModule[$currentClass]).'}prestashop>'.strtolower($currentClass).'_'.$md5Key;
 }

 //Tries to find translation within default admin translation or module translations
 if (key_exists('AdminProducts'.$md5Key, $_LANGADM))
  $str = $_LANGADM['AdminProducts'.$md5Key];
 elseif (key_exists('AdminCatalog'.$md5Key, $_LANGADM))
  $str = $_LANGADM['AdminCatalog'.$md5Key];
 elseif (key_exists($defaultKey, $_MODULE))
  $str = $_MODULE[$defaultKey];
 elseif (key_exists($currentKey, $_MODULE))
  $str = $_MODULE[$currentKey];
 else
  $str = $string;

 $str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str;
 return str_replace('"', '"', ($addslashes ? addslashes($str) : stripslashes($str)));
}

Link to comment
Share on other sites

Petite modification pour le point 4. Astuces (Gestion des trads) pour être bien sûr de faire le tour des trads à dispo par défaut (ajout de la recherche sur la clé 'AdminTab')

 

A noter que les clé AdminProducts et AdminCatalog sont spécifiques à l'override de cet exemple.

 

Si l'override concerne AdminCustomers par exemple, il faut bien entendu remplacer les noms des classes AdminProducts et AdminCatalog par 1 seule recherche sur la clé AdminCustomers (mais laisser la recherche sur la clé AdminTab quand même)

 

 /**
 *
 * Override - use translations files to replace english expression.
 *
 * @param mixed $string term or expression in english
 * @param string $class
 * @param boolan $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) {

 global $_LANGADM, $_MODULE;

 //set MD5 key
 $md5Key = md5(str_replace('\'', '\\\'', $string));
 //set module key
 $moduleKey = '';
 //Manage Module translations
 $currentClass = get_class($this);
 if (Module::getModuleNameFromClass($currentClass)) {
  $currentKey = '<{'.strtolower(Module::$classInModule[$currentClass]).'}'.strtolower(_THEME_NAME_).'>'.strtolower($currentClass).'_'.$md5Key;
  $defaultKey = '<{'.strtolower(Module::$classInModule[$currentClass]).'}prestashop>'.strtolower($currentClass).'_'.$md5Key;
 }
 //Tries to find translation within default admin translation or module translations
 if (key_exists('AdminTab'.$md5Key, $_LANGADM))
  $str = $_LANGADM['AdminTab'.$md5Key];
 elseif (key_exists('AdminProducts'.$md5Key, $_LANGADM))
  $str = $_LANGADM['AdminProducts'.$md5Key];
 elseif (key_exists('AdminCatalog'.$md5Key, $_LANGADM))
  $str = $_LANGADM['AdminCatalog'.$md5Key];
 elseif (key_exists($defaultKey, $_MODULE))
  $str = $_MODULE[$defaultKey];
 elseif (key_exists($currentKey, $_MODULE))
  $str = $_MODULE[$currentKey];
 else
  $str = $string;

 $str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str;
 return str_replace('"', '"', ($addslashes ? addslashes($str) : stripslashes($str)));
}

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...