Envoyer une 404 pour les actions de certains modules Magento

  • De le 21 mars 2014
  • Difficulté : 1/4

Envoyer une 404 pour les actions de certains modules Magento Certains modules ajoutent des actions dont vous n'avez peut être pas l'utilité, et désactiver le module est parfois impossible (utilisé partiellement ou forte dépendance). Avant mise en ligne il est préférable d'envoyer une 404 pour ces pages.

Ce petit module permet de définir les actions dont vous n'avez pas besoin dans le but d'envoyer une 404 aux internautes qui tentent d'y accéder.

Bien que certains modules peuvent être facilement désactivés, par exemple Tag ou Wishlist, ce n'est malheureusement pas toujours le cas. Lorsque les modules sont fortement dépendants une désactivation peut s'avérer complexe. Et ce n'est parfois qu'une partie du module qui est utilisée, c'est généralement le cas pour CatalogSearch.

Dans cette exemple, nous décidons de présenter une page 404 pour les actions suivantes :

  • catalogsearch/advanced/index
  • catalogsearch/advanced/result
  • catalogsearch/term/popular

Notez que la dernière peut être facilement désactivée depuis l'admin, mais nous éviterons une redirection.

Architecture du module

  • app/code/local/Magentix/NoRoute/etc/
  • config.xml
  • app/code/local/Magentix/NoRoute/Model/
  • Observer.php
  • app/etc/modules/
  • Magentix_NoRoute.xml

Développement du module

La première étape consiste à ajouter le fichier de configuration du module.

app/code/local/Magentix/NoRoute/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_NoRoute>
            <version>0.1.0</version>
        </Magentix_NoRoute>
    </modules>
    <global>
        <models>
            <noroute>
                <class>Magentix_NoRoute_Model</class>
            </noroute>
        </models>
    </global>
    <global>
        <events>
            <controller_action_predispatch>
                <observers>
                    <add_no_route>
                        <class>noroute/observer</class>
                        <method>noRoute</method>
                    </add_no_route>
                </observers>
            </controller_action_predispatch>
        </events>
    </global>
</config>

Par le biais de l'événement controller_action_predispatch, nous pouvons capturer l'action avant que celle-ci ne soit exécutée, puis indiquer que l'action sera finalement noroute (Mage_Core_Controller_Varien_Action).

app/code/local/Magentix/NoRoute/Model/Observer.php

<?php

class Magentix_NoRoute_Model_Observer
{

    /**
     * Send a 404 page
     *
     * @param Varien_Event_Observer $observer
     */
    public function noRoute(Varien_Event_Observer $observer)
    {
        $action = $observer->getEvent()->getControllerAction();

        if(in_array(strtolower($action->getFullActionName()), $this->getActions())) {
            $action->norouteAction();
        }

        return;
    }

    /**
     * Retrieve restrictions
     *
     * @return array
     */
    protected function getActions()
    {
        return array(
            'catalogsearch_advanced_index',
            'catalogsearch_advanced_result',
            'catalogsearch_term_popular',
        );
    }

}

Les handles peuvent être facilement retrouvés via les layouts ou par l'analyse des contrôleurs des différents modules.

Reste à déclarer le module.

app/etc/modules/Magentix_NoRoute.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_NoRoute>
            <active>true</active>
            <codePool>local</codePool>
        </Magentix_NoRoute>
    </modules>
</config>

Bonus : désactiver les actions liées au e-commerce

Si vous souhaitez désactiver l'ensemble des actions liées au e-commerce pour ne conserver que les fonctionnalités "catalogue" dans l'optique d'ouvrir à la vente un jour, les restrictions suivantes peuvent être ajoutées (liste non exhaustive, basée sur une version communautaire 1.8).

Je me base ici sur le nom complet de l'action, à vous de modifier pour la désactivation totale des actions du module (/^checkout_(.*)/) ou du contrôleur (/^checkout_onepage_(.*)/).

$action = $observer->getEvent()->getControllerAction();

$action->getFullActionName(); // checkout_onepage_index

$action->getRequest()->getRequestedRouteName(); // checkout

$action->getRequest()->getRequestedControllerName(); // onepage

$action->getRequest()->getRequestedActionName(); // index

app/code/local/Magentix/NoRoute/Model/Observer.php

/**
 * Retrieve restrictions
 *
 * @return array
 */
protected function getActions()
{
    return array(
        'customer_account_index',
        'customer_account_login',
        'customer_account_create',
        'customer_account_logoutsuccess',
        'customer_account_forgotpassword',
        'customer_account_forgotpasswordpost',
        'customer_account_resetpassword',
        'customer_account_resetpasswordpost',
        'customer_account_confirm',
        'customer_account_confirmation',
        'customer_review_index',
        'customer_review_view',
        'customer_address_index',
        'customer_address_edit',
        'customer_address_new',
        'customer_address_form',
        'customer_address_formpost',
        'customer_address_delete',
        'sales_order_history',
        'sales_order_view',
        'sales_order_invoice',
        'sales_order_shipment',
        'sales_order_creditmemo',
        'sales_order_reorder',
        'sales_order_print',
        'sales_order_printinvoice',
        'sales_order_printshipment',
        'sales_order_printcreditmemo',
        'sales_guest_form',
        'sales_guest_view',
        'sales_guest_invoice',
        'sales_guest_shipment',
        'sales_guest_creditmemo',
        'sales_guest_reorder',
        'sales_guest_print',
        'sales_guest_printinvoice',
        'sales_guest_printshipment',
        'sales_guest_printcreditmemo',
        'sales_download_downloadprofilecustomoption',
        'sales_download_downloadcustomoption',
        'ogone_api_paypage',
        'ogone_api_placeform',
        'moneybookers_processing_payment',
        'moneybookers_processing_placeform',
        'catalog_product_compare_index',
        'catalog_product_compare_add',
        'catalog_product_compare_remove',
        'catalog_product_compare_clear',
        'checkout_cart_index',
        'checkout_cart_add',
        'checkout_cart_addgroup',
        'checkout_cart_configure',
        'checkout_cart_updateitemoptions',
        'checkout_cart_updatepost',
        'checkout_cart_delete',
        'checkout_cart_estimatepost',
        'checkout_cart_estimateupdatepost',
        'checkout_cart_couponpost',
        'checkout_multishipping_index',
        'checkout_multishipping_login',
        'checkout_multishipping_register',
        'checkout_multishipping_addresses',
        'checkout_multishipping_addressespost',
        'checkout_multishipping_backtoaddresses',
        'checkout_multishipping_removeitem',
        'checkout_multishipping_shipping',
        'checkout_multishipping_backtoshipping',
        'checkout_multishipping_shippingpost',
        'checkout_multishipping_billing',
        'checkout_multishipping_backtobilling',
        'checkout_multishipping_overview',
        'checkout_multishipping_overviewpost',
        'checkout_multishipping_success',
        'checkout_onepage_index',
        'checkout_onepage_progress',
        'checkout_onepage_shippingmethod',
        'checkout_onepage_review',
        'checkout_onepage_success',
        'checkout_onepage_failure',
        'checkout_onepage_getadditional',
        'checkout_onepage_getaddress',
        'checkout_onepage_savemethod',
        'checkout_onepage_savebilling',
        'checkout_onepage_saveshipping',
        'checkout_onepage_saveshippingmethod',
        'checkout_onepage_savepayment',
        'checkout_onepage_saveorder',
        'shipping_tracking_ajax',
        'shipping_tracking_popup',
        'catalogsearch_advanced_index',
        'catalogsearch_advanced_result',
        'catalogsearch_term_popular',
        'tag_list_index',
        'tag_product_list',
        'tag_customer_index',
        'tag_customer_view',
        'wishlist_index_index',
        'wishlist_index_share',
        'wishlist_index_configure',
        'wishlist_shared_index',
    );
}
commentaires

Commentez cet article : Envoyer une 404 pour les actions de certains modules Magento