Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 4 di 5
  • livello avanzato
Indice lezioni

Metodi per l'installazione e la disinstallazione dei plugin di Prestashop

Analizziamo i metodi install() e unistall() che permettono di gestire le funzioni da eseguire nel momento in cui l'amministratore di un negozio basato su Prestashop installa o disinstalla un modulo.
Analizziamo i metodi install() e unistall() che permettono di gestire le funzioni da eseguire nel momento in cui l'amministratore di un negozio basato su Prestashop installa o disinstalla un modulo.
Link copiato negli appunti

Aggiunta dei metodi install/unistall

I metodi install() e unistall() permettono di gestire le funzioni da eseguire quando l'amministratore del negozio installa o disinstalla un modulo. A questo punto aggiungiamo, all'interno del blocco principale del file sample.php, i metodi di installazione e disinstallazione del modulo e delle tabelle SQL. Durante l'installazione di un modulo, è possibile eseguire diverse azioni: copia di file, creazione tabelle SQL e modifica o creazione variabili di configurazione.

Nel nostro caso, quello che dobbiamo fare in fase di installazione è:

  • verificare che il modulo sia effettivamente installato;
  • verificare che il modulo sia collegato all'hook leftColumn in modo che il nostro modulo risulti disponibile nella colonna di sinistra del tema;
  • richiamare la funzione installDB per la creazione e l'inizializzazione delle tabelle sample e sample_lang

Viceversa, il metodo di disinstallazione, elimina semplicemente l'impostazione di configurazione del modulo Sample.

public function install() {
	if (!parent::install() OR !$this->installDB()) // verifica che il modulo e le tabelle db sono effettivamente installato.
		return false;
	if (!$this->registerHook('displayLeftColumn')) // verifica che il modulo è legato all'hook leftColumn.
		$this->registerHook('displayLeftColumn');
	if (!$this->registerHook('displayHeader')) // verifica che il modulo è legato all'hook header.
		$this->registerHook('displayHeader');
	return true;
}
public function uninstall() {
	if (!parent::uninstall() || !$this->uninstallDB() || !$this->unregisterHook('leftColumn') || !$this->unregisterHook('header'))
		return false;
		return true;
}	
private function installDB() {
	$query = '
	CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.'sample (
	`id_sample` int(10) NOT NULL AUTO_INCREMENT,
	PRIMARY KEY(`id_sample`)
	) ENGINE=MyISAM default CHARSET=utf8
	';
	if (!Db::getInstance()->Execute($query))
		return false;
		$query = '
		CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.'sample_lang (
		`id_sample` int(10) NOT NULL AUTO_INCREMENT,
		`id_lang` int(10) NOT NULL,
		`contenuto` text NOT NULL,
		PRIMARY KEY(`id_sample`,`id_lang`)
		) ENGINE=MyISAM default CHARSET=utf8';
	if (!Db::getInstance()->Execute($query))
		return false;
		$sql1 = 'INSERT INTO `'._DB_PREFIX_.'sample` (`id_sample`) VALUES (\'1\')';
		Db::getInstance()->Execute($sql1);
		foreach (Language::getLanguages(false) as $lang)  {
			$sql2 = 'INSERT INTO `'._DB_PREFIX_.'sample_lang` (`id_sample`, `id_lang`, `contenuto`)
			VALUES(1, '.(int)$lang['id_lang'].', \'Hello world!\')';
			Db::getInstance()->Execute($sql2);
		}
	return true;
}
private function uninstallDB()
{
	$query1 = 'DROP TABLE '._DB_PREFIX_.'sample';
	$query2 = 'DROP TABLE '._DB_PREFIX_.'sample_lang';
	if (Db::getInstance()->Execute($query2))
		return Db::getInstance()->Execute($query1);
}

Quindi, tramite il metodo install() e diverse istruzioni IF per controllare eventuali anomalie durante il proceso di installazione, abbiamo registrato il modulo, creato e inizializzato le tabella sample e sample_lang tramite la chiamata a funzione installDB(). Affinchè un modulo possa essere agganciato ad un hook, questo deve essere registrato in Prestashop.

La registrazione modulo->hook viene fatta attraverso il metodo registerHook($nome_hook). E' possibile trovare l'elenco dei nomi degli hook nella sezione "Posizioni", presente all'interno della voce menù "moduli", nel pannello di amministrazione.

  • $this->registerHook('displayLeftColumn') - posizionamento modulo nella colonna sinistra;
  • $this->registerHook('displayHeader') - posizionamento nell'header del sito.

public function install() {
	if (!parent::install() OR !$this->installDB()) // verifica che il modulo e le tabelle db sono effettivamente installato.
		return false;
	if (!$this->registerHook('displayLeftColumn')) // verifica che il modulo è legato all'hook leftColumn.
		$this->registerHook('displayLeftColumn');
	if (!$this->registerHook('displayHeader')) // verifica che il modulo è legato all'hook header.
		$this->registerHook('displayHeader');
	return true;
}

Analogamente, abbiamo creato un modulo unistall() per avere un processo di disinstallazione personalizzato con:

  • rimozione tabelle database con la chiamata alla funzione personalizzata uninstallDB();
  • collegamento hook sinistro e header con il metodo unregisterHook($nome_hook).

public function uninstall() {
	if (!parent::uninstall() || !$this->uninstallDB() || !$this->unregisterHook('leftColumn') || !$this->unregisterHook('header'))
		return false;
		return true;
}

Creazione hook e installazione del modulo sample

Nel metodo install() abbiamo collegato, tramite il metodo $this->registerHook, il modulo nella colonna sinistra del nostro sito. Utilizziamo il metodo hookDisplayLeftColumn(), per visualizzare e passare dei valori al nostro hook, esso preleverà, tramite la classe sampleClass, il valore presente nel campo "contenuto" della tabella sample_lang e passerà il testo nel file template left.tpl presente nella cartella views/templates/hook/left.tpl.

Il hookDisplayHeader() viene utilizzato per inserire del codice nell'intestazione delle pagine. Questo è in genere utilizzato per aggiungere CSS o il codice Javascript. Nel nostro caso aggiungerà un collegamento al file CSS del modulo, /css/style.css.

public function hookDisplayLeftColumn(){
	$content =  sampleClass::getContent();
	$contenuto = new sampleClass((int)$content->id, $this->context->language->id);
	$this->smarty->assign(
		array(
		'content' => $contenuto,
		)
	);
	return $this->display(__FILE__, 'left.tpl');
}
public function hookDisplayHeader(){
	$this->context->controller->addCSS($this->_path.'css/style.css', 'all');
}

Ti consigliamo anche