Jump to content
DanieleDev

Path url pagina categoria

Recommended Posts

Buona sera, sto avendo dei problemi per configurare il path delle pagine categorie in modo tale che le sottocategorie appaiano nel path non subito dopo la root ma dopo la categoria padre in questo modo: www.miosito.it/categoriaPadre/categoriaFiglia

Sapete come fare? Grazie mille in anticipo

Share this post


Link to post
Share on other sites

Ciao @DanieleDev,

a naso sento che devi fare un'override del dispatcher (/classes/Dispatcher.php), ma forse qualche accortezza anche nel controller delle categorie andrebbe fatto (/controllers/front/listing/CategoryController.php), mi raccomando, override, quindi utilizza la cartella override, non modificare i file che ti ho indicato direttamente 😊

 

Share this post


Link to post
Share on other sites
14 hours ago, marsaldev said:

Ciao @DanieleDev,

a naso sento che devi fare un'override del dispatcher (/classes/Dispatcher.php), ma forse qualche accortezza anche nel controller delle categorie andrebbe fatto (/controllers/front/listing/CategoryController.php), mi raccomando, override, quindi utilizza la cartella override, non modificare i file che ti ho indicato direttamente 😊

 

Grazie, ma c'è qualche guida che indichi cosa cambiare all'interno di quei file?

Share this post


Link to post
Share on other sites

Ciao @DanieleDev,

non mi ci sono mai imbattuto in questa modifica, non c'è una guida in quanto sono modifiche abbastanza particolari, ad ogni modo non è impossibile da raggiungere, puoi provare a studiarti il dispatcher per capire come PrestaShop costruisce le rotte, le regole le trovi nella variabile $default_routes, e creare il tuo rewrite, altrimenti ho fatto una ricerca rapida su addons e sembra che questo modulo faccia proprio quello che serve a te (è una delle tante funzioni):

https://addons.prestashop.com/it/url-redirect/16633-pretty-url-rimuovere-id-e-numeri-dalle-url.html

Share this post


Link to post
Share on other sites
3 minutes ago, marsaldev said:

Ciao @DanieleDev,

non mi ci sono mai imbattuto in questa modifica, non c'è una guida in quanto sono modifiche abbastanza particolari, ad ogni modo non è impossibile da raggiungere, puoi provare a studiarti il dispatcher per capire come PrestaShop costruisce le rotte, le regole le trovi nella variabile $default_routes, e creare il tuo rewrite, altrimenti ho fatto una ricerca rapida su addons e sembra che questo modulo faccia proprio quello che serve a te (è una delle tante funzioni):

https://addons.prestashop.com/it/url-redirect/16633-pretty-url-rimuovere-id-e-numeri-dalle-url.html

Grazie mille della disponibilità, ho trovato questa guida, ma non mi è stata di aiuto è un po vecchia 

Sicuramente opterò per un modulo. Grazie ancora

 

 

Share this post


Link to post
Share on other sites

Però vedo che in fondo hanno postato anche porzioni di codice, è stata modificata anche la classe Link (dovresti trovarla sempre in /classes/), secondo me puoi uscirtene se ti studi un po' quello che hanno scritto 😊

Tempo permettendo posso vedere se riesco a produrre questa modifica, come ti dicevo non è impossibile 😊

Se hai problemi di tempo, con il modulo fai molto prima.

Share this post


Link to post
Share on other sites
1 minute ago, marsaldev said:

Però vedo che in fondo hanno postato anche porzioni di codice, è stata modificata anche la classe Link (dovresti trovarla sempre in /classes/), secondo me puoi uscirtene se ti studi un po' quello che hanno scritto 😊

Tempo permettendo posso vedere se riesco a produrre questa modifica, come ti dicevo non è impossibile 😊

Se hai problemi di tempo, con il modulo fai molto prima.

Si ho fatto delle prove, ma sono stretto con i tempi per studiarmi una soluzione :).
Però è qualcosa di interessante da sapere, se dovessi riuscire a trovare una soluzione sarò tutto orecchi :)
A presto e grazie ancora

Share this post


Link to post
Share on other sites

Allora, preso spunto dal post in inglese, le operazioni da fare sono:

1. Override della classe Dispatcher (va sovrascritta tutta la variabile $default_routes)

/override/classes/Dispatcher.php

class Dispatcher extends DispatcherCore
{
    /**
     * @var array List of default routes
     */
    public $default_routes = array(
        'category_rule' => array(
            'controller' => 'category',
            'rule' => '{parent_categories:/}{id}-{rewrite}', // This is different from original (maybe it's also not necessary to edit, make a test)
            'keywords' => array(
                'parent_categories' => array('regexp' => '[_a-zA-Z0-9-\/\pL]*'), // This is new
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'supplier_rule' => array(
            'controller' => 'supplier',
            'rule' => 'supplier/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_supplier'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'manufacturer_rule' => array(
            'controller' => 'manufacturer',
            'rule' => 'brand/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_manufacturer'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'cms_rule' => array(
            'controller' => 'cms',
            'rule' => 'content/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'cms_category_rule' => array(
            'controller' => 'cms',
            'rule' => 'content/category/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms_category'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'module' => array(
            'controller' => null,
            'rule' => 'module/{module}{/:controller}',
            'keywords' => array(
                'module' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'module'),
                'controller' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'controller'),
            ),
            'params' => array(
                'fc' => 'module',
            ),
        ),
        'product_rule' => array(
            'controller' => 'product',
            'rule' => '{category:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_product'),
                'id_product_attribute' => array('regexp' => '[0-9]+', 'param' => 'id_product_attribute'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN, 'param' => 'rewrite'),
                'ean13' => array('regexp' => '[0-9\pL]*'),
                'category' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'),
                'reference' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'manufacturer' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'supplier' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'price' => array('regexp' => '[0-9\.,]*'),
                'tags' => array('regexp' => '[a-zA-Z0-9-\pL]*'),
            ),
        ),
        /* Must be after the product and category rules in order to avoid conflict */
        'layered_rule' => array(
            'controller' => 'category',
            'rule' => '{id}-{rewrite}{/:selected_filters}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'),
                /* Selected filters is used by the module blocklayered */
                'selected_filters' => array('regexp' => '.*', 'param' => 'selected_filters'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
    );
}

2. Override della classe Link (va fatto l'intero override del metodo):

/override/classes/Link.php

class Link extends LinkCore
{
    /**
     * Create a link to a category.
     *
     * @param mixed $category Category object (can be an ID category, but deprecated)
     * @param string $alias
     * @param int $idLang
     * @param string $selectedFilters Url parameter to autocheck filters of the module blocklayered
     *
     * @return string
     */
    public function getCategoryLink(
        $category,
        $alias = null,
        $idLang = null,
        $selectedFilters = null,
        $idShop = null,
        $relativeProtocol = false
    ) {
        $dispatcher = Dispatcher::getInstance();

        if (!$idLang) {
            $idLang = Context::getContext()->language->id;
        }

        $url = $this->getBaseLink($idShop, null, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop);

        // Set available keywords
        $params = array();

        if (!is_object($category)) {
            $params['id'] = $category;
        } else {
            $params['id'] = $category->id;
        }

        // Selected filters is used by the module ps_facetedsearch
        $selectedFilters = null === $selectedFilters ? '' : $selectedFilters;

        if (empty($selectedFilters)) {
            $rule = 'category_rule';
        } else {
            $rule = 'layered_rule';
            $params['selected_filters'] = $selectedFilters;
        }

        if (!$alias) {
            $category = $this->getCategoryObject($category, $idLang);
        }
        $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias;
        if ($dispatcher->hasKeyword($rule, $idLang, 'meta_keywords', $idShop)) {
            die('here');
            $category = $this->getCategoryObject($category, $idLang);
            $params['meta_keywords'] = Tools::str2url($category->getFieldByLang('meta_keywords'));
        }
        if ($dispatcher->hasKeyword($rule, $idLang, 'meta_title', $idShop)) {
            $category = $this->getCategoryObject($category, $idLang);
            $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title'));
        }

		// THIS IS THE NEW BLOCK
        if ($dispatcher->hasKeyword($rule, $idLang, 'parent_categories', $idShop) AND $category)
        {
            $category = $this->getCategoryObject($category, $idLang); //RETRIEVING ALL THE PARENT CATEGORIES

            $cats = array();
            foreach ($category->getParentsCategories($idLang) as $cat) {
                //Check root and home category (ID 1 and 2)
                if (!in_array($cat['id_category'], array(1, 2, $category->id))) {
                    $cats[] = $cat['link_rewrite'];
                }
            }
            //THE CATEGORIES ARE BEING ASSIGNED IN THE WRONG ORDER (?)
            $params['parent_categories'] = implode('/', array_reverse($cats)); // ADD THE URL SLASHES TO THE CATEGORIES IN REVERSE ORDER
        }
		// END OF NEW BLOCK

        return $url . Dispatcher::getInstance()->createUrl($rule, $idLang, $params, $this->allow, '', $idShop);
    }
}

3. Andare in Parametri Negozio -> Traffico & SEO e modificare la regola in fondo per quanto riguarda l'url delle categorie:

screen.thumb.png.df16b00d475feb551a6b77a6085ee48a.png

4. Salvare.

 

Alcune note a margine, prendetela come fix rapida, ci sarebbero delle cose da correggere e migliorare ma il risultato finale è quello di avere anche categorie di terzo livello funzionanti, l'unico "neo" è l'id della categoria nell'url, si potrebbe togliere anche quello, ma lascio a voi l'onere :D

Un caro saluto ;)

 

PS: 5. Cancellare la cache

PSS: Testato su PrestaShop 1.7.6.0

Share this post


Link to post
Share on other sites
16 hours ago, marsaldev said:

Allora, preso spunto dal post in inglese, le operazioni da fare sono:

1. Override della classe Dispatcher (va sovrascritta tutta la variabile $default_routes)

/override/classes/Dispatcher.php


class Dispatcher extends DispatcherCore
{
    /**
     * @var array List of default routes
     */
    public $default_routes = array(
        'category_rule' => array(
            'controller' => 'category',
            'rule' => '{parent_categories:/}{id}-{rewrite}', // This is different from original (maybe it's also not necessary to edit, make a test)
            'keywords' => array(
                'parent_categories' => array('regexp' => '[_a-zA-Z0-9-\/\pL]*'), // This is new
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'supplier_rule' => array(
            'controller' => 'supplier',
            'rule' => 'supplier/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_supplier'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'manufacturer_rule' => array(
            'controller' => 'manufacturer',
            'rule' => 'brand/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_manufacturer'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'cms_rule' => array(
            'controller' => 'cms',
            'rule' => 'content/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'cms_category_rule' => array(
            'controller' => 'cms',
            'rule' => 'content/category/{id}-{rewrite}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_cms_category'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
        'module' => array(
            'controller' => null,
            'rule' => 'module/{module}{/:controller}',
            'keywords' => array(
                'module' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'module'),
                'controller' => array('regexp' => '[_a-zA-Z0-9_-]+', 'param' => 'controller'),
            ),
            'params' => array(
                'fc' => 'module',
            ),
        ),
        'product_rule' => array(
            'controller' => 'product',
            'rule' => '{category:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_product'),
                'id_product_attribute' => array('regexp' => '[0-9]+', 'param' => 'id_product_attribute'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN, 'param' => 'rewrite'),
                'ean13' => array('regexp' => '[0-9\pL]*'),
                'category' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'categories' => array('regexp' => '[/_a-zA-Z0-9-\pL]*'),
                'reference' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'manufacturer' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'supplier' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'price' => array('regexp' => '[0-9\.,]*'),
                'tags' => array('regexp' => '[a-zA-Z0-9-\pL]*'),
            ),
        ),
        /* Must be after the product and category rules in order to avoid conflict */
        'layered_rule' => array(
            'controller' => 'category',
            'rule' => '{id}-{rewrite}{/:selected_filters}',
            'keywords' => array(
                'id' => array('regexp' => '[0-9]+', 'param' => 'id_category'),
                /* Selected filters is used by the module blocklayered */
                'selected_filters' => array('regexp' => '.*', 'param' => 'selected_filters'),
                'rewrite' => array('regexp' => self::REWRITE_PATTERN),
                'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
                'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
            ),
        ),
    );
}

2. Override della classe Link (va fatto l'intero override del metodo):

/override/classes/Link.php


class Link extends LinkCore
{
    /**
     * Create a link to a category.
     *
     * @param mixed $category Category object (can be an ID category, but deprecated)
     * @param string $alias
     * @param int $idLang
     * @param string $selectedFilters Url parameter to autocheck filters of the module blocklayered
     *
     * @return string
     */
    public function getCategoryLink(
        $category,
        $alias = null,
        $idLang = null,
        $selectedFilters = null,
        $idShop = null,
        $relativeProtocol = false
    ) {
        $dispatcher = Dispatcher::getInstance();

        if (!$idLang) {
            $idLang = Context::getContext()->language->id;
        }

        $url = $this->getBaseLink($idShop, null, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop);

        // Set available keywords
        $params = array();

        if (!is_object($category)) {
            $params['id'] = $category;
        } else {
            $params['id'] = $category->id;
        }

        // Selected filters is used by the module ps_facetedsearch
        $selectedFilters = null === $selectedFilters ? '' : $selectedFilters;

        if (empty($selectedFilters)) {
            $rule = 'category_rule';
        } else {
            $rule = 'layered_rule';
            $params['selected_filters'] = $selectedFilters;
        }

        if (!$alias) {
            $category = $this->getCategoryObject($category, $idLang);
        }
        $params['rewrite'] = (!$alias) ? $category->link_rewrite : $alias;
        if ($dispatcher->hasKeyword($rule, $idLang, 'meta_keywords', $idShop)) {
            die('here');
            $category = $this->getCategoryObject($category, $idLang);
            $params['meta_keywords'] = Tools::str2url($category->getFieldByLang('meta_keywords'));
        }
        if ($dispatcher->hasKeyword($rule, $idLang, 'meta_title', $idShop)) {
            $category = $this->getCategoryObject($category, $idLang);
            $params['meta_title'] = Tools::str2url($category->getFieldByLang('meta_title'));
        }

		// THIS IS THE NEW BLOCK
        if ($dispatcher->hasKeyword($rule, $idLang, 'parent_categories', $idShop) AND $category)
        {
            $category = $this->getCategoryObject($category, $idLang); //RETRIEVING ALL THE PARENT CATEGORIES

            $cats = array();
            foreach ($category->getParentsCategories($idLang) as $cat) {
                //Check root and home category (ID 1 and 2)
                if (!in_array($cat['id_category'], array(1, 2, $category->id))) {
                    $cats[] = $cat['link_rewrite'];
                }
            }
            //THE CATEGORIES ARE BEING ASSIGNED IN THE WRONG ORDER (?)
            $params['parent_categories'] = implode('/', array_reverse($cats)); // ADD THE URL SLASHES TO THE CATEGORIES IN REVERSE ORDER
        }
		// END OF NEW BLOCK

        return $url . Dispatcher::getInstance()->createUrl($rule, $idLang, $params, $this->allow, '', $idShop);
    }
}

3. Andare in Parametri Negozio -> Traffico & SEO e modificare la regola in fondo per quanto riguarda l'url delle categorie:

screen.thumb.png.df16b00d475feb551a6b77a6085ee48a.png

4. Salvare.

 

Alcune note a margine, prendetela come fix rapida, ci sarebbero delle cose da correggere e migliorare ma il risultato finale è quello di avere anche categorie di terzo livello funzionanti, l'unico "neo" è l'id della categoria nell'url, si potrebbe togliere anche quello, ma lascio a voi l'onere :D

Un caro saluto ;)

 

PS: 5. Cancellare la cache

PSS: Testato su PrestaShop 1.7.6.0

Grazie, ma su prestashop 1.5 non mi sembra funzionare. In ogni caso al momento userò il modulo. Grazie comunque :)

Share this post


Link to post
Share on other sites
8 minutes ago, DanieleDev said:

Grazie, ma su prestashop 1.5 non mi sembra funzionare

Oh my :D

Scusa, ma non era proprio contemplata la versione 1.5, dovrei scavare molto indietro nella memoria 😊

Ovviamente se ti ci vuoi imbattere non farti problemi, posta qui codice che sarò felice di aiutarti.

 

Un caro saluto ;)

 

PS: Controlla la compatibilità del modulo, stiamo parlando di 2 versioni fa

Share this post


Link to post
Share on other sites
52 minutes ago, marsaldev said:

Oh my :D

Scusa, ma non era proprio contemplata la versione 1.5, dovrei scavare molto indietro nella memoria 😊

Ovviamente se ti ci vuoi imbattere non farti problemi, posta qui codice che sarò felice di aiutarti.

 

Un caro saluto ;)

 

PS: Controlla la compatibilità del modulo, stiamo parlando di 2 versioni fa

Noo scusami, intendevo 1.7.5 :) 

Share this post


Link to post
Share on other sites
13 minutes ago, DanieleDev said:

Noo scusami, intendevo 1.7.5 :) 

Ah ecco, strano, non credo ci siano sostanziali differenze 🤷🏻‍♂️

 

Un caro saluto ;)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More