Se un prodotto viene cancellato o disabilitato, la url del prodotto restituisce un errore 404 ed una pagina 404. Un errore http 404 dice anche ai motori dir ricerca che quella pagina non esiste più (e potrà essere rimossa dal motore di ricerca).
Possono esserci casi in cui si vuole modificare questa dinamica e rispondere con un comportamento diverso, che può essere:
- redirect su pagina specifica
- risposta http 200 invece di 404
- personalizzazione della pagina predefinita per errore 404
Come si modifica questo comportamento ?
Il modo più rapido (e il peggiore dal punto di vista della manutenzione dell’applicazione) è modificare direttamente i controller nel punto in cui questa azione viene gestita.
Questa operazione è gestita separatamente da ogni controller
- Prodotto
- Categoria
- Pagina
Controller Prodotto
La gestione di questo evento si trova in “controllers/front/ProductController.php”
questo il codice predefinito
public function init() {. ...if (!Validate::isLoadedObject($this->product)) { header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found'); $this->errors[] = $this->trans('This product is no longer available.', [], 'Shop.Notifications.Error'); $this->setTemplate('errors/404'); return;
Ecco cosa succede
- Dalla Url viene estratto il prodotto da caricare
- Il caricamento del prodotto non va a buon fine (es.: non esiste più)
- Viene generato codice HTTP 404
- Viene caricata la pagina template errors/404
Mostrare un contenuto personalizzato
Ora se vogliamo restituire un codice 200 invece del 404, e personalizzare, basta semplicemente modificare il template di risposta e commentare le funzioni che restituiscono il codice 404.
public function init() {. ...if (!Validate::isLoadedObject($this->product)) { $this->setTemplate('errors/404-product.tpl'); return; ...
Per personalizzare il contenuto si può creare il file template ../errors/404-product.tpl ed inserire in contenuto desiderato
Redirect in Home
Invece per un redirect in homepage, il codice è come segue
...if (!Validate::isLoadedObject($this->product)) { header('HTTP/1.1 302 Moved Temporarily'); header('Cache-Control: no-cache'); header('Location: /' ); exit; ...