HMVC и динамические виджеты

Задний план

Я использую виджет слова как частичное представление, которое имеет свой собственный контроллер (то есть свои собственные действия), и оно размещено почти на всех страницах. Я реализую рендеринг этого через HMVC, это просто здорово.

Проблема

Теперь проблема в том, что виджет сам выполняет действия. Подумайте о виджете корзины покупок. Этот виджет размещается на всех страницах, чтобы пользователь все время мог видеть свои материалы. И у виджета есть связанные с ним действия, например: RemoveItem, RefreshCart, ApplyDiscountCoupon и т. д. Такие действия должны запускаться кнопкой или ссылкой, и ссылка должна быть примерно такой (в HMVC):

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

Ok. Теперь пользователь щелкает эту ссылку, модуль корзины и контроллер корзины загружаются, и действие выполняется, действие должно выглядеть примерно так:

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

     // "load the view"  ???
}

Как видите, мой вопрос заключается в том, как загрузить представление в модуль HMVC. Дело в том, что если я загружу только вид корзины, он покажет только мою корзину, и я не могу просто перенаправить или загрузить главную страницу, потому что это может быть любая главная страница, то есть: корзина может быть на любой главной странице. (выбрать продукт, продолжить покупку, просмотреть сведения о продукте, платежную информацию, оформить заказ и т. д.). :/

Другое дело: требование, чтобы я не мог использовать AJAX в этом проекте.

Вы знаете, как HMVC справляется с этим?

Заранее спасибо.


person David Elizondo    schedule 21.10.2009    source источник


Ответы (2)


Ok. Не повезло с сообществом. Тем не менее я нашел обходной путь. Надежда будет кому-то полезна.

HMVC не имеет естественного решения этой проблемы. Поэтому я решил использовать этот обходной путь:

  1. В каждый основной контроллер (то есть без виджета, без частичного представления) я получаю текущий URL-адрес в сеансе следующим образом (/controllers/keep_buying.php):

    class Keep_buying extends Controller
    {
        function Keep_buying()
        {
            parent::Controller();
            $this->session->set_userdata('main_uri', uri_string()); 
        }
        ...
    }
    
  2. Затем в моем виджете с частичным представлением (представление модуля HMVC) у меня есть обычная ссылка на мой контроллер виджета (/modules/cart/views/cart_show.php):

    <a class="button" href="cart/cart/additem">Add Item</a>  
    
  3. В действии контроллера (действии контроллера модуля HMVC) я получаю текущую главную страницу, делаю что-то, а затем перенаправляю на эту страницу, которая неявно попадет в мой поток виджетов (из-за HMVC).

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

То есть. ИМХО не идеальный подход, но работает.

person David Elizondo    schedule 26.10.2009

Я знаю, что этой теме больше года, однако я погуглил, чтобы получить больше информации о структуре, которую должна иметь программа HMVC, и о том, как ее можно реализовать в CI, и не нашел очень много ответов.

Я почти уверен, что для правильной работы HMVC с несколькими виджетами, встроенными на все страницы сайта, они должны управляться одним главным контроллером. Это будет высший уровень иерархии. Попробую привести пример:

У вас есть сайт с виджетом корзины покупок на каждой странице. Если вы хотите использовать функциональность корзины, вам нужно будет сослаться на методы в модуле корзины, например:

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

Проблема с использованием этой ссылки заключается в том, что вы не хотите перезагружать остальную часть сайта из этого модуля. Вместо этого вы можете направить ссылку через ваш основной контроллер и перезагрузить модуль, вызвав нужный метод. например

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

Затем в контроллере сайта он просто передаст вызов метода в основное представление.

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

Представление вызовет виджет корзины со следующим:

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

Очевидно, что это упрощенное объяснение, и главный контроллер сайта будет обрабатывать несколько виджетов в одном главном представлении, поэтому передачей правильных данных нужно будет управлять лучше, чем простым вызовом основного представления из метода. Но, надеюсь, это дает представление о структуре, о которой я говорю.

Если кто-нибудь прочитает это и подумает, что я ошибаюсь, я хотел бы услышать о других решениях, которые люди нашли для этой проблемы.

person Mark O'Keeffe    schedule 29.11.2010