Aggiungere un hook in prestashop 1.3


prestashop

Oggi mi sono imbattuto nella necessitá di aggiungere un hook in PrestaShop 1.3, e data la scarsa documentazione ho dovuno impazzire non poco. Non sono inoltre sicurissimo della procedura che ho seguito, in quanto va a modifica alcuni file del core, ma credo che sia un difetto ancora da sistemare in PrestaShop stesso. Bisogna innanzitutto creare l’hook, ed io l’ho fatto tramite un modulo ad hoc. Le alternative sarebbero creare l’hook direttamente nel database, o in modo piú elegante creare un modulo in grado di interagire con il database e creare/eliminare tutti gli hook di cui si necessita, invece di usare un modulo per ciascuno di essi. Ecco il codice:

// same name of the file php and of the folder
class BlockHookLiveHelp extends Module
{

	function __construct() {
		// the name MUST be the same of the directory/file
		$this->name = 'blockhooklivehelp';
		$this->tab = 'Hooks';
		$this->version = 0.1;

		parent::__construct();

		$this->page = basename(__FILE__, '.php');
		$this->displayName = $this->l('Hook Live');
		$this->description = $this->l('Questo modulo installa un nuovo hook per il live help');
	}

	private function addMyHook($HookName,$HookTitle,$HookDescription) {

		$q = "SELECT `id_hook` FROM `"._DB_PREFIX_."hook`
					WHERE `name` = '$HookName' LIMIT 1";
		if ( ! Db::getInstance()->getRow($q) )  {
			Db::getInstance()->AutoExecute(
				_DB_PREFIX_.'hook',
				array( 'id_hook' => NULL,
					'name' => $HookName,
					'title' => $HookTitle,
					'description' => $HookDescription,
					'position' => '1'
				),
				'INSERT'
			);
		}
	} 

	public function install() {

		$retVal = true;

      /** CREATE HOOK **/
		$this->addMyHook('liveHelp', 'Live Help', 'Hook personalizzato per il live help');

		if ( !parent::install() ) { $retVal = false; }

		return $retVal;
	}

	/* I create a function that will be called from the hook */
	private function delMyHook($HookName) {
		$qd = 'DELETE FROM `'._DB_PREFIX_.'hook_module`
					WHERE `id_hook` IN (
						SELECT `id_hook` FROM `'._DB_PREFIX_."hook`
							WHERE `name` = '$HookName'
					)";
		Db::getInstance()->Execute($qd);

		$qd = 'DELETE FROM `'._DB_PREFIX_."hook`
					WHERE `name` = '$HookName' LIMIT 1";
		Db::getInstance()->Execute($qd) ;
	}

	public function uninstall() {

		if (!parent::uninstall() ) return false;

		/** DROP HOOK **/
		$this->delMyHook('live');

		return true;
	}

} //end of class

Come di consueto questo modulo va salvato nel file /modules/blockhooklivehelp/ blockhooklivehelp.php. Nel file /header.php (ma avrei potuto farlo in qualsiasi file processato prima del template) ho aggiunto:

$smarty->assign(array(
    'HOOK_LIVE_HELP' => Module::hookExec('liveHelp'),
);

Nel file /themes/nometema/header.tpl ho aggiunto, nel posto giusto:

{$HOOK_LIVEHELP}

Infine, in ciscun modulo che deve comparire nell’hook creato ho creato la funzione NomeModulo::liveHelp() che genera il codice HTML da visualizzare. Come ultima cosa ho dovuto agganciare i moduli di cui sopra al nuovo hook, andando in Modules -> Positions -> Transplant a Module. Secondo me la procedura dovrebbe essere piú snella, come avviene con Drupal, magari un giorno metteró mano al core per sistemare la situazione…