Pregunta

Fondo

Uso la palabra widget como una vista parcial que tiene su propio controlador (por lo tanto, sus propias acciones) y se coloca en casi todas las páginas. Implemento la representación de esto a través de HMVC, eso es simplemente genial.

Problema

Ahora, el problema es que el propio widget ejecuta acciones. Piense en un widget de carrito de compras. Ese widget se coloca en todas las páginas para que el usuario pueda ver sus cosas todo el tiempo. Y el widget tiene acciones que están relacionadas con él, por ejemplo: RemoveItem, RefreshCart, ApplyDiscountCoupon, etc. Dichas acciones deberían activarse mediante un botón o enlace y el enlace debería ser algo así (en HMVC):

<a href='<?site_url()?>/cart/cart/removeitem/the_item_id'>Remove this item</a>

Ok. Ahora el usuario hace clic en ese enlace, el módulo del carrito y el controlador del carrito se cargan y la acción se ejecuta, la acción debería tener el siguiente aspecto:

function removeitem($itemid)
{
     // remove the item from db
     ...

     // "load the view"  ???
}

Como puede ver, mi pregunta es cómo cargar la vista en un módulo HMVC. La cosa es que si solo cargo la vista del carrito, solo mostrará mi carrito, y no puedo & # 8217; t simplemente redirigir o cargar la página principal porque puede ser cualquier página principal, es decir: el carrito podría estar en cualquier página principal (seleccione el producto, siga comprando, vea los detalles del producto, la información de facturación, el pago, etc.). : /

Otra cosa: un requisito es que no puedo usar AJAX en este proyecto.

¿Sabes cómo HMVC maneja esto?

Gracias de antemano.

¿Fue útil?

Solución

Ok. No hay suerte con la comunidad. Sin embargo encontré una solución. La esperanza sería útil para alguien.

HMVC no tiene una solución natural para esto. Así que decidí usar esta solución:

  1. En cada controlador principal (es decir, sin widget, sin vista parcial), tomo la url actual en la sesión de esta manera (/controllers/keep_buying.php) :

    class Keep_buying extends Controller
    {
        function Keep_buying()
        {
            parent::Controller();
            $this->session->set_userdata('main_uri', uri_string()); 
        }
        ...
    }
    
  2. Luego, en mi widget de vista parcial (vista del módulo HMVC) tengo un enlace normal a mi controlador de widgets (/modules/cart/views/cart_show.php) :

    <a class="button" href="cart/cart/additem">Add Item</a>  
    
  3. En la acción del controlador (acción del controlador del módulo HMVC) recupero la página principal actual, hago cosas y luego redirigí a esa página, que implícitamente entrará en mi flujo de widgets (debido a HMVC).

    class Cart extends Controller
    {
        ...
        function additem()
        {
            $to_redirect = $this->session->userdata('main_uri');
            // add-item work stuff...
            redirect($to_redirect);
        }
    }
    

Eso es. No es el enfoque ideal en mi humilde opinión, pero funciona.

Otros consejos

Sé que este tema tiene más de un año, sin embargo, he buscado en Google para obtener más información sobre la estructura que debe tomar un programa HMVC y cómo se puede implementar en CI, y no he encontrado muchas respuestas.

Estoy bastante seguro de que para que HMVC funcione correctamente, con varios widgets incorporados en todas las páginas de un sitio, deben estar organizados por un controlador principal. Este será el nivel superior de la jerarquía. Déjame intentar dar un ejemplo:

Tienes un sitio con un widget de carrito de compras en cada página. Cuando desee utilizar la funcionalidad del carrito, deberá vincularse a los métodos en el módulo del carrito, por ejemplo:

<a href="cart/add/<?=$item?>">add</a>

El problema con este enlace es que no desea volver a cargar el resto del sitio desde ese módulo. En su lugar, puede enrutar el enlace a través de su controlador principal y hacer que vuelva a cargar el módulo, llamando al método deseado. por ejemplo,

<a href="site_controller/cart_add/<?=$item?>">add</a>

Luego, en el controlador del sitio, simplemente pasará la llamada al método a la vista principal

<?php
function cart_add($item){
$data['cart'] = 'cart/add/'.$item;
$this->load->view('main', $data);
}
?>

La vista llamará al widget del carrito con lo siguiente:

<?php echo modules::run($cart); ?>

Obviamente, esta es una explicación simplificada, y el controlador del sitio principal manejará varios widgets en una vista principal, por lo que pasar los datos correctos deberá gestionarse mejor que simplemente llamar a la vista principal desde un método. Pero espero que esto dé una idea de la estructura a la que me refiero.

Si alguien lee esto y cree que estoy equivocado, me encantaría escuchar otras soluciones que la gente haya encontrado para este problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top