Aggiungere un hook in prestashop 1.3

share

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…

Commenti

Ho provato a seguire le tue istruzioni per installare un hook in Prestashop 1.4 ma non ho ottenuto nessun risultato.
Mi puoi aiutare?

Ciao,Scusa per il ritardo nella risposta, ma mi sono sposato da poco ed ho del tutto trascurato il sito. Purtroppo non posso aiutarti, l'unica esperienza che ho avuto con presta é con la versione 1.3, per cui se il codice di cui sopra non funziona non saprei aiutarti... Ma magari hai giá risolto, in tal caso se si tratta di sottigliezze ti invito a pubblicarle in un commento, in modo da condividere la tua conoscenza con noi

Aggiungi un commento