Pergunta

Fundo

Eu uso a palavra widget como uma visão parcial que possui seu próprio controlador (para que suas próprias ações) e ela seja colocada em quase todas as páginas. Eu implemento a renderização disso via HMVC, isso é ótimo.

Problema

Agora, o problema é que o próprio widget executa ações. Pense em um widget de carrinho de compras. Esse widget é colocado em todas as páginas para que o usuário possa ver suas coisas o tempo todo. E o widget possui ações relacionadas a ele, por exemplo: RemoverItem, RefreshCart, ApplyDiscountCoupon, etc. Essas ações devem acionar por um botão ou link e o link deve ser algo como (no HMVC):

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

OK. Agora, o usuário clica nesse link, o módulo do carrinho e o controlador de carrinho são carregados e a ação é executada, a ação deve parecer algo como:

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

     // "load the view"  ???
}

Como você pode ver, minha pergunta é como carregar a visualização em um módulo HMVC. O problema é que, se eu carregar apenas a visualização do carrinho, ele só mostrará meu carrinho e não posso simplesmente redirecionar ou carregar a página principal, porque pode ser qualquer página principal, ou seja: o carrinho pode estar em qualquer página principal (Selecione Produto, continue comprando, consulte Detalhes do produto, informações de cobrança, check -out etc.). :/

Outra coisa: um requisito é que eu não posso usar o Ajax neste projeto.

Você sabe como o HMVC lide com isso?

Desde já, obrigado.

Foi útil?

Solução

OK. Sem sorte com a comunidade. No entanto, encontrei uma solução alternativa. A esperança seria útil para alguém.

O HMVC não tem uma solução natural para isso. Então eu decidi usar esta solução alternativa:

  1. Em cada controlador principal (ou seja, sem widget, sem visão parcial), pego o URL atual em sessão dessa maneira (/controllers/keep_buying.php):

    class Keep_buying extends Controller
    {
        function Keep_buying()
        {
            parent::Controller();
            $this->session->set_userdata('main_uri', uri_string()); 
        }
        ...
    }
    
  2. Então, no meu widget de visualização parcial (visualização do módulo HMVC), tenho um link normal para o meu controlador de widget (/modules/cart/views/cart_show.php):

    <a class="button" href="cart/cart/additem">Add Item</a>  
    
  3. Na ação do controlador (ação do controlador do módulo HMVC), recupero a página principal atual, faço coisas e depois redireciono para essa página, que implicitamente entrará no meu fluxo de widgets (devido ao HMVC).

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

Aquilo é. Não é a abordagem ideal IMHO, mas funciona.

Outras dicas

Sei que esse tópico tem mais de um ano de idade, no entanto, estou pesquisando no Google para obter mais informações sobre a estrutura que um programa HMVC deve tomar e como ele pode ser implementado no IC, e não encontrou muitas respostas.

Tenho certeza de que, para que o HMVC funcione corretamente, com vários widgets incorporados em todas as páginas de um site, elas precisam ser orquestradas por um controlador principal. Este será o nível superior da hierarquia. Deixe -me tentar dar um exemplo:

Você tem um site com um widget de carrinho de compras em todas as páginas. Quando você deseja usar a funcionalidade do CART, você precisará vincular -se aos métodos no módulo do carrinho, por exemplo:

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

O problema usando este link é que você não deseja recarregar o restante do site desse módulo. Em vez disso, você pode rotear o link através do seu controlador principal e recarregar o módulo, chamando o método desejado. por exemplo

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

Então, no controlador do site, ele simplesmente passará a chamada do método para a visualização principal

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

A visualização chamará o widget do carrinho com o seguinte:

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

Obviamente, essa é uma explicação simplificada, e o principal controlador do site estará lidando com vários widgets em uma visão principal; portanto, a passagem dos dados corretos precisará ser gerenciada melhor do que apenas chamar a visualização principal de um método. Mas espero que isso dê uma idéia da estrutura a que estou me referindo.

Se alguém ler isso e pensar que estou errado, eu adoraria ouvir outras soluções que as pessoas encontraram para esse problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top