Question

Arrière-plan

J'utilise le mot widget comme une vue partielle ayant son propre contrôleur (donc ses propres actions) et il est placé dans presque toutes les pages. J'implémente le rendu de ceci via HMVC, c'est génial.

Problème

Maintenant, le problème est que le widget lui-même exécute des actions. Pensez à un widget de panier d'achat. Ce widget est placé dans toutes les pages pour permettre à l'utilisateur de voir tout son contenu. Et le widget comporte des actions qui lui sont associées, par exemple: RemoveItem, RefreshCart, ApplyDiscountCoupon, etc. De telles actions doivent être déclenchées par un bouton ou un lien.

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

Ok. Maintenant que l'utilisateur clique sur ce lien, le module de panier et le contrôleur de panier sont chargés et l'action est exécutée. L'action doit ressembler à ceci:

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

     // "load the view"  ???
}

Comme vous pouvez le constater, ma question est de savoir comment charger la vue dans un module HMVC. Le fait est que si je ne charge que la vue panier, il ne montrera que mon panier, et je ne peux pas simplement rediriger ou charger la page principale car il peut s'agir de n'importe quelle page principale, c'est-à-dire: le panier peut figurer sur n'importe quelle page principale (sélectionnez un produit, continuez à acheter, consultez les détails du produit, les informations de facturation, le paiement, etc.). : /

Autre chose: je ne peux pas utiliser AJAX dans ce projet.

Savez-vous comment HMVC gère cela?

Merci d'avance.

Était-ce utile?

La solution

Ok. Pas de chance avec la communauté. Néanmoins, j'ai trouvé une solution de contournement. L’espoir serait utile à quelqu'un.

HMVC n’a pas de solution naturelle à cela. J'ai donc décidé d'utiliser cette solution de contournement:

  1. Dans chaque contrôleur principal (c'est-à-dire, pas de widget, pas de vue partielle), j'attrape l'URL actuelle de la session de cette manière (/ controllers / keep_buying.php) :

    class Keep_buying extends Controller
    {
        function Keep_buying()
        {
            parent::Controller();
            $this->session->set_userdata('main_uri', uri_string()); 
        }
        ...
    }
    
  2. Ensuite, dans mon widget de vue partielle (vue du module HMVC), j'ai un lien normal vers mon contrôleur de widget (/ modules / cart / views / cart_show.php) :

    <a class="button" href="cart/cart/additem">Add Item</a>  
    
  3. Au niveau de l'action du contrôleur (action du contrôleur du module HMVC), je récupère la page principale actuelle, effectue des tâches, puis redirige vers cette page, qui va implicitement se retrouver dans le flux de mon widget (en raison de HMVC).

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

C'est. N'est-ce pas l'approche idéale IMHO, mais fonctionne.

Autres conseils

Je sais que ce sujet a plus d'un an. Cependant, j'ai cherché sur Google pour mieux comprendre la structure qu'un programme HMVC devrait adopter et la manière dont il peut être mis en œuvre dans CI. Je n'ai pas trouvé beaucoup de réponses.

Je suis presque sûr que pour que HMVC fonctionne correctement, avec plusieurs widgets incorporés sur toutes les pages d'un site, ils doivent être orchestrés par un contrôleur principal. Ce sera le plus haut niveau de la hiérarchie. Laissez-moi essayer de donner un exemple:

Vous avez un site avec un widget de panier d'achat sur chaque page. Lorsque vous souhaitez utiliser la fonctionnalité de panier, vous devez créer un lien vers les méthodes du module de panier, par exemple:

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

Le problème en utilisant ce lien est que vous ne voulez pas recharger le reste du site à partir de ce module. Au lieu de cela, vous pouvez acheminer le lien via votre contrôleur principal et le faire recharger le module en appelant la méthode souhaitée. par exemple

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

Ensuite, dans le contrôleur de site, il passera simplement l'appel de méthode à la vue principale

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

La vue appellera le widget panier avec les informations suivantes:

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

Évidemment, il s’agit d’une explication simplifiée, et le contrôleur de site principal gérera plusieurs widgets dans une vue principale. Il est donc préférable de gérer les données correctes que de simplement appeler la vue principale depuis une méthode. Mais j'espère que cela donne une idée de la structure à laquelle je me réfère.

Si quelqu'un lit ceci et pense que je me trompe, j'aimerais entendre d'autres solutions que les gens ont trouvées à ce problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top