Domanda

Sfondo

Uso il widget parola come una vista parziale che ha il suo controller (quindi le sue azioni) ed è collocato in quasi tutte le pagine. Realizzo il rendering di questo tramite HMVC, è semplicemente fantastico.

Problema

Ora, il problema è che il widget stesso esegue azioni. Pensa a un widget del carrello. Quel widget è inserito in tutte le pagine in modo che l'utente possa vedere le sue cose per tutto il tempo. E il widget ha azioni ad esso correlate, ad esempio: RemoveItem, RefreshCart, ApplyDiscountCoupon, ecc. Tali azioni dovrebbero essere attivate da un pulsante o collegamento e il collegamento dovrebbe essere simile a (in HMVC):

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

Ok. Ora l'utente fa clic su quel collegamento, il modulo carrello e il controller carrello vengono caricati e l'azione viene eseguita, l'azione dovrebbe essere simile a:

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

     // "load the view"  ???
}

Come puoi vedere, la mia domanda è come caricare la vista in un modulo HMVC. Il fatto è che se carico solo la vista carrello, mostrerà solo il mio carrello e non posso semplicemente reindirizzare o caricare la pagina principale perché può essere qualsiasi pagina principale, ovvero: il carrello potrebbe essere in qualsiasi pagina principale (selezionare il prodotto, continuare ad acquistare, vedere i dettagli del prodotto, le informazioni di fatturazione, il pagamento, ecc.). : /

Un'altra cosa: un requisito è che non posso usare AJAX in questo progetto.

Sai come HMVC gestisce questo?

Grazie in anticipo.

È stato utile?

Soluzione

Ok. Nessuna fortuna con la comunità. Tuttavia ho trovato una soluzione alternativa. La speranza sarebbe utile a qualcuno.

HMVC non ha una soluzione naturale a questo. Quindi ho deciso di usare questa soluzione alternativa:

  1. In ogni controller principale (ovvero, nessun widget, nessuna vista parziale) Prendo l'URL corrente nella sessione in questo modo (/controllers/keep_buying.php) :

    class Keep_buying extends Controller
    {
        function Keep_buying()
        {
            parent::Controller();
            $this->session->set_userdata('main_uri', uri_string()); 
        }
        ...
    }
    
  2. Quindi nel mio widget di vista parziale (vista modulo HMVC) ho un normale link al mio controller di widget (/modules/cart/views/cart_show.php) :

    <a class="button" href="cart/cart/additem">Add Item</a>  
    
  3. All'azione del controller (azione del controller del modulo HMVC) recupero la pagina principale corrente, faccio cose e quindi reindirizzo a quella pagina, che implicitamente entrerà nel mio flusso di widget (a causa di HMVC).

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

Cioè. Non è l'approccio ideale IMHO, ma funziona.

Altri suggerimenti

So che questo argomento ha più di un anno, tuttavia ho cercato su Google di approfondire la struttura che un programma HMVC dovrebbe prendere e come può essere implementato in CI e non ho trovato molte risposte.

Sono abbastanza sicuro che affinché HMVC funzioni correttamente, con diversi widget incorporati in tutte le pagine di un sito, devono essere orchestrati da un controller principale. Questo sarà il livello più alto dell'erarchia. Vorrei provare a fare un esempio:

Hai un sito con un widget del carrello su ogni pagina. Quando si desidera utilizzare la funzionalità carrello, è necessario collegarsi ai metodi nel modulo carrello, ad esempio:

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

Il problema nell'uso di questo collegamento è che non si desidera ricaricare il resto del sito da quel modulo. Invece, è possibile instradare il collegamento attraverso il controller principale e ricaricare il modulo, chiamando il metodo desiderato. per es.

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

Quindi nel controller del sito, passerà semplicemente la chiamata del metodo alla vista principale

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

La vista chiamerà il widget carrello con il seguente:

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

Ovviamente questa è una spiegazione semplificata e il controller del sito principale gestirà diversi widget in una vista principale, quindi il passaggio dei dati corretti dovrà essere gestito meglio della semplice chiamata della vista principale all'interno di un metodo. Ma spero che questo dia un'idea della struttura a cui mi riferisco.

Se qualcuno legge questo e pensa che io abbia torto, mi piacerebbe sentire altre soluzioni che la gente ha trovato su questo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top