2012-07-05 22 views
6

Me gustaría hacer lo anterior. He anulado muchos archivos en el pasado ... bloque, modelo, ayudante ... pero este se me escapa.Magento anula el controlador

Puede alguien ver lo que estoy haciendo mal aquí: (IVE editado este código ... para incluir algunas de las recomendaciones ahora ...)

Heres mi estructura de carpetas (2 posiciones de controlador como una prueba):

/Idigital/Idgeneral/etc/config.xml 
/Idigital/Idgeneral/controllers/Checkout/CartController.php 
/Idigital/Idgeneral/controllers/CartController.php 

Heres mi config.xml:

<?xml version="1.0"?> 
<config> 
<modules> 
    <idigital_idgeneral> 
    <version>0.1.0</version> 
    </idigital_idgeneral> 
</modules> 
<global> 
<blocks> 
     <idgeneral><class>Idigital_Idgeneral_Block</class></idgeneral> 
    </blocks> 
</global> 

<frontend> 
    <routers> 
       <checkout> 
        <use>standard</use> 
        <args> 
         <modules> 
          <Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral> 
         </modules> 
        </args> 
       </checkout> 
      </routers> 
     <layout> 
     <updates> 
      <idgeneral> 
       <file>idigital.xml</file> 
      </idgeneral> 
     </updates> 
    </layout> 
</frontend> 
</config> 

Ihave puesto mi archivo de controlador en 2 lugares para probar. Y aquí está la parte superior de mi archivo primer controlador:

require_once 'Mage/Checkout/controllers/CartController.php'; 
class Idigital_Idgeneral_Checkout_CartController extends Mage_Checkout_CartController 
{ 


public function testAction() 
{ 
    var_dump('inside checkout/cart/test');exit; 
} 

/** 
* Add product to shopping cart action 
*/ 
public function addAction() 
{ 
    blah... 
} 

Ans mi segundo controlador:

require_once 'Mage/Checkout/controllers/CartController.php'; 
class Idigital_Idgeneral_CartController extends Mage_Checkout_CartController 
{ 


public function testAction() 
{ 
    var_dump('inside cart/test');exit; 
} 

/** 
* Add product to shopping cart action 
*/ 
public function addAction() 
{ 
    blah... 
} 

cuando vuelva a:/Pedido/compra/añadir Im dirigida al controlador mago ... no es mi local. (Tengo var_dump stmts en cada uno ... así puedo ver cuál se ejecutó).

cuando visito/Pedido/compra/prueba - me sale un 404 cuando visito/compra/agrego o compra/prueba - me sale un 404 cuando visita/compra/prueba idgeneral o idgeneral/compra/añadir - me sale un 404

+0

Acabo de probar su código de revisión de la publicación n. ° 3 contra un desnudo CE 1.6.2.0. La solicitud de 'checkout/cart/test' me funciona y muestra el resultado esperado (' string (25) '' dentro de checkout/cart/test "'). ¿Cómo se ve el código de activación de su módulo ('app/etc/modules/whatever.xml')? –

+0

intente actualizar su caché –

Respuesta

6
<Idigital_Idgeneral before="Mage_Checkout">Idgeneral_Checkout</Idigital_Idgeneral> 

Debe ser

<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral> 

o tratar de mover el controlador personalizado hasta

../Idigital/Idgeneral/controllers/CartController.php 

y utilizar

<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral</Idigital_Idgeneral> 

También hay un error en su ubicación <modules> etiqueta. Debería ser:

<config> 
    <modules> 
     <idigital_idgeneral> 
      <version>0.1.0</version> 
     </idigital_idgeneral> 
    </modules> 
    <global> 
    ... 
    </global> 

    <frontend> 
     .... 
    </frontend> 
... 
</config> 

es decir <modules> no debe estar dentro de <global>

Aquí hay un buen tutorial sobre cómo volcar el árbol de configuración que Magento ve como XML: http://alanstorm.com/magento_config

+0

Hola. THX, intentaré esto. Ya coloqué mi controlador en un nivel (por lo que ahora está en 2 lugares, solo para que pueda probar) ¿Por qué sugieres usar 'Idgeneral_Idgeneral' si quieres decir: 'Idigital_Idgeneral' ... entonces sí, me di cuenta de esto. Y lo intenté Probaré todas sus sugerencias y le responderé. Los controladores parecen ser un dolor. :( – ShaunTheSheep

+1

Malo, tiene razón debe ser Idigital_Idgeneral. Si lo hace, Idigital_Idgeneral combinado con el controlador sube un nivel, debería funcionar. Puede intentar agregar una acción personalizada y pulsar/comprar/carro/customaction para ver si se ilumina – Roscius

+0

Hola, probé todas estas sugerencias. Nada funciona. Agregar una acción de prueba tampoco funcionó ... e intenté esto con todas las sugerencias anteriores ... y borrando el caché cada vez (que también está deshabilitado). What un dolor! Dado que mi acción de prueba no funcionó, debe haber un problema con el enrutamiento ... ¿alguna otra sugerencia? – ShaunTheSheep

0

Bueno ... WONT anula el controlador de carro de caja.

Así que utilicé la URL REESCRIBIR en la VISTA DEL PRODUCTO ... desde este enlace ... cerca de la parte inferior del artículo. Dicen que es un método adecuado ...

http://www.excellencemagentoblog.com/magento-add-product-to-cart-ajax

if(!url){ 
     url = jQuery('#product_addtocart_form').attr('action'); 
} 
url = url.replace("checkout/cart","idgeneral/cart"); 

que trabajó para mí. Me permite romperme. Básicamente llama a MI controlador ... en lugar del controlador de pago.

Gracias por la ayuda ROSCIUS ... apreciado.

También tuve que cambiar mi config .... mi sección de routers ahora se ve así:

<routers> 
     <!-- THIS PART REGISTERS OUR CONTROLLERS FOLDER FOR USE --> 
     <idgeneral> 
      <use>standard</use> 
      <args> 
       <module>Idigital_Idgeneral</module> 
       <frontName>idgeneral</frontName> 
      </args> 
     </idgeneral> 

     <!-- THIS PART WONT WORK TO OVERWRITE OUR MAGE CONTROLLER --> 
     <checkout> 
      <use>standard</use> 
      <args> 
       <modules> 
        <Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral> 
       </modules> 
      </args> 
     </checkout> 
    </routers> 
+0

Tal vez puedo agregar la etiqueta en mi config.xml ???? – ShaunTheSheep

7
  1. Crear carpetas y archivos

    app/code/local/MyNameSpace/MyModule/etc/config.xml 
    app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php 
    app/etc/modules/MyNameSpace_All.xml 
    
  2. Editar/etc módulo /config.xml y Crear aplicación/código/local/MyNameSpace/MyModule/etc/config.xml con el siguiente contenido:

    <?xml version="1.0"?> 
    <config> 
    <modules> 
        <MyNameSpace_MyModule> 
         <version>0.1.0</version> 
        </MyNameSpace_MyModule> 
    </modules> 
    <global> 
        <!-- This rewrite rule could be added to the database instead --> 
        <rewrite> 
         <!-- This is an identifier for your rewrite that should be unique --> 
         <!-- THIS IS THE CLASSNAME IN YOUR OWN CONTROLLER --> 
         <mynamespace_mymodule_checkout_cart> 
          <from><![CDATA[#^/checkout/cart/#]]></from> 
          <!-- 
           - mymodule matches the router frontname below 
           - checkout_cart matches the path to your controller 
    
           Considering the router below, "/mymodule/checkout_cart/" will be 
           "translated" to "/MyNameSpace/MyModule/controllers/Checkout/CartController.php" (?) 
          --> 
          <to>/mymodule/checkout_cart/</to> 
         </mynamespace_mymodule_checkout_cart> 
        </rewrite> 
    </global> 
    <!-- 
    If you want to overload an admin controller this tag should be <admin> instead, 
    or <adminhtml> if youre overloading such stuff (?) 
    --> 
    <frontend> 
        <routers> 
         <mynamespace_mymodule> 
          <!-- should be set to "admin" when overloading admin stuff (?) --> 
          <use>standard</use> 
          <args> 
           <module>MyNameSpace_MyModule</module> 
           <!-- This is used when "catching" the rewrite above --> 
           <frontName>mymodule</frontName> 
          </args> 
         </mynamespace_mymodule> 
        </routers> 
    </frontend> 
    

    Nota: Lo anterior no funcionó para mí cuando anulo el controlador de catálogo/producto. Tuve que usar:

      <from><![CDATA[#^catalog/product/#]]></from> 
          <to>mymodule/mycontroller</to> 
    

    (observe la barra inicial que falta)

    Desde Magento 1.3 simplemente puede añadir su módulo de interfaz al router. Reescrituras no se lo necesite más:

    <?xml version="1.0" encoding="UTF-8"?> 
    <config> 
    <modules> 
        <MyNameSpace_MyModule> 
         <version>0.1.0</version> 
        </MyNameSpace_MyModule> 
    </modules> 
    
    <frontend> 
        <routers> 
         <checkout> 
          <args> 
           <modules> 
            <MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule> 
           </modules> 
          </args> 
         </checkout> 
        </routers> 
    </frontend> 
    

    Tenga en cuenta que se before=”Mage_Checkout” cargar el controlador primero si está disponible y caer de nuevo a Magento de si no.

    Si el controlador se encuentra en otra carpeta, tendrá que modificar el código:
    app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php.

Reemplazar

<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>

con

<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule> 
  1. Editar 'controllers/Checkout/CartController.php'

    Crear app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php con el siguiente contenido: (el único cambio a indexAction() es la adición de un error_log() llamada):

    <?php 
         # Controllers are not autoloaded so we will have to do it manually: 
         require_once 'Mage/Checkout/controllers/CartController.php'; 
         class MyNameSpace_MyModule_Checkout_CartController extends 
             Mage_Checkout_CartController 
        { 
        # Overloaded indexAction 
        public function indexAction() { 
        # Just to make sure 
        error_log('Yes, I did it!'); 
        parent::indexAction(); 
        } 
        } 
    
    1. Edición 'app/etc/modules/MyNameSpace_All.xml' (Esto es para activar su módulo)

      cierto locales

  2. Editar 'app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml' y añadir lo siguiente al utilizar el mismo identificador de actualización como antes:

    <mynamespace_mymodule_checkout_cart_index> 
        <update handle="checkout_cart_index"/> 
        </mynamespace_mymodule_checkout_cart_index> 
    

    (Tenga en cuenta que estas etiquetas parecen ser el caso sensible. Intente usar todas las minúsculas si esto no funciona para usted)

    [por Hendy: Cuando anulo el catálogo/producto/vista usando el método descrito en esta Wiki o aquí, no tuve que hacer lo anterior. Sin embargo, cuando se utiliza el "camino de CMS, que tenía que actualizar manualmente el mango.]

    El punto anterior no funcionó para mí (2009-02-19 por Jonathan M Carvalho)

    descubrí que la presentar al cambio es app/design/frontend/[MyInterface]/[mytheme] /layout/mymodule.xml

    Añadir las siguientes líneas:


    1. Dirige tu navegador a/checkout/cart/ En tu registro de errores de PHP, deberías encontrar 'Sí, lo hice!'.

    Debe ser muy preciso con la expresión regular de reescritura porque los errores son muy difíciles de encontrar.

1

Esto es un poco de notificación en la ruta de inclusión del controlador.

Esta ruta de inclusión puede causar errores si el modo Magento Compilador está encendida.

require_once 'Mage/Checkout/controllers/CartController.php'; 

En lugar de que es bueno para usar

require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'CartController.php'; 

será más seguro.

3

Voy a dejar esto aquí para el próximo desarrollador pobre forzado a trabajar con este jalopy. Muchas de las instrucciones aquí están pegadas desde el magento docs que, como su fuente, es un laberinto retorcido de mala dirección. Bien suficientes quejas ...

Esto funcionó para mí en la versión 1.8

Crear el espacio de nombres y el módulo: /app/código/local/MiNombreEspacio/MyModule

Crea tu config módulo: /app /code/local/MyNameSpace/MyModule/etc/config.xml

<?xml version="1.0" ?> 
<config> 
<modules> 
    <MyNameSpace_MyModule> 
     <version>0.1.0</version> 
    </MyNameSpace_MyModule> 
</modules> 
<frontend> 
    <routers> 
     <checkout> 
      <args> 
       <modules> 
        <MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule> 
       </modules> 
      </args> 
     </checkout> 
    </routers> 
</frontend> 

Crear su controlador: /app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php

<?php 

require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'CartController.php'; 

class MyNameSpace_MyModule_Checkout_CartController extends Mage_Checkout_CartController 
{ 
    public function indexAction() { 
     // /var/log/debug.log should log the output 
     Mage::log('cart index override', null, 'debug.log'); 

     // Call the parent class 
     parent::indexAction(); 
    } 
} 

permitirá a su nuevo módulo: /app/etc/modules/MyNameSpace_All.xml

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

Eso es todo eso es necesario. Ahora ve a celebrar, ¡acabas de pulir un turd! ;)

Cuestiones relacionadas