Вопрос

Предыстория

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

Проблема

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

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

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

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

     // "load the view"  ???
}

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

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

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

Заранее благодарю.

Это было полезно?

Решение

ОК.Не повезло с сообществом.Тем не менее я нашел обходной путь.Надеюсь, это было бы кому-то полезно.

У 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 module controller action) Я извлекаю текущую главную страницу, делаю что-то, а затем перенаправляю на эту страницу, которая неявно попадет в мой поток виджетов (из-за HMVC).

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top