Bugfix: risolvere l'errore della pagina delle categorie del blog del tema Transformer per Prestashop

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

In uno shop online che utilizza PrestaShop e il tema Transformer c'era un problema nella visualizzazione della pagina con tutti i post di una categoria del blog.
Il modulo del blog fa parte dell'installazione del tema (è il modulo StBlog).

In pratica l'url "it/blog/2-news" veniva riconosciuto da PrestaShop come un prodotto ed eseguiva quindi il redirect alla pagina di prodotto specifica.
Cercando nei commenti nella pagina di acquisto del tema su ThemeForest l'autore suggeriva di inserire una rotta specifica all'interno del file /classes/Dispatcher.php.

Per evitare di modificare un file del core ho deciso di creare un override creando il file Dispatcher.php all'interno della directory "override/classes/" e modificare secondo le mie esigenze l'array $this->default_routes prima di inizializzare la classe.
Dovendo inserire la nuova rotta prima della rotta dei prodotti (product_rule) ho utilizzato la funzione array_insert_before() di Brad Erickson (questa è la pagina del blog: http://eosrei.net/articles/2011/11/php-arrayinsertafter-arrayinsertbefore ).
Ecco il codice completo della funzione:

<?php

/**
 * Override default routes for StBlogModule category page.
 * 
 * Credits for array insert functions: http://eosrei.net/articles/2011/11/php-arrayinsertafter-arrayinsertbefore
 * 
 * Emanuele Fantin
 */
class Dispatcher extends DispatcherCore {

 protected function __construct()
 {
  // add specific route for category pages
  $new_route = array(
   'controller' => 'category',
   'rule' => 'blog/{blog_id_category}-{rewrite}',
   'keywords' => array(
    'blog_id_category' => array('regexp' => '[0-9]+', 'param' => 'blog_id_category'),
    'rewrite' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
   ),
   'params' => array(
    'fc' => 'module',
    'module' => 'stblog',
   )
  );
  $this->default_routes = $this->_array_insert_before('product_rule', $this->default_routes, 'module-stblog-category', $new_route);

  parent::__construct();
 }

 /*
  * Inserts a new key/value before the key in the array.
  *
  * @param $key
  *   The key to insert before.
  * @param $array
  *   An array to insert in to.
  * @param $new_key
  *   The key to insert.
  * @param $new_value
  *   An value to insert.
  *
  * @return
  *   The new array if the key exists, FALSE otherwise.
  *
  * @see array_insert_after()
  */

 function _array_insert_before($key, array &$array, $new_key, $new_value)
 {
  if (array_key_exists($key, $array))
  {
   $new = array();
   foreach ($array as $k => $value)
   {
    if ($k === $key)
    {
     $new[$new_key] = $new_value;
    }
    $new[$k] = $value;
   }
   return $new;
  }
  return FALSE;
 }

}

 

Per visualizzare correttamente l'override cancellare il file cache/class_index.php in modo che sia ricreato da PrestaShop aggiungendo la nuova classe estesa.

 

Server dedicato

Condividi questo post


Commenti