HMVC и динамические виджеты - PullRequest
5 голосов
/ 21 октября 2009

Фон

Я использую виджет слова как частичное представление, которое имеет свой собственный контроллер (так что его собственные действия), и оно размещено почти на всех страницах. Я реализую рендеринг этого через 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 справляется с этим?

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

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

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

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

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

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

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

<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); ?>

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

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

1 голос
/ 26 октября 2009

Хорошо. Не повезло с сообществом. Тем не менее я нашел обходной путь. Надеюсь, кому-нибудь будет полезно.

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);
        }
    }
    

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...