我使用单词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如何处理这个问题吗?
提前致谢。
答案 0 :(得分:1)
确定。社区没有运气。不过我发现了一个解决方法。希望对某人有所帮助。
HMVC对此没有天然的解决方案。所以我决定使用这个解决方法:
进入每个主控制器(即没有小部件,没有局部视图)我以这种方式抓取会话中的当前网址(/ controllers / keep_buying.php):
class Keep_buying extends Controller
{
function Keep_buying()
{
parent::Controller();
$this->session->set_userdata('main_uri', uri_string());
}
...
}
然后在我的局部视图小部件(HMVC模块视图)中,我有一个指向我的小部件控制器的正常链接(/ modules / cart / views / cart_show.php):
<a class="button" href="cart/cart/additem">Add Item</a>
在控制器操作(HMVC模块控制器操作)中,我检索当前主页,执行操作然后重定向到该页面,隐式地进入我的窗口小部件流(由于HMVC)。
class Cart extends Controller
{
...
function additem()
{
$to_redirect = $this->session->userdata('main_uri');
// add-item work stuff...
redirect($to_redirect);
}
}
就是这样。不是恕我直言的理想方法,但有效。
答案 1 :(得分:1)
我知道这个话题已经有一年多了,但是我一直在谷歌上搜索一下HMVC程序应该采取的结构,以及如何在CI中实现它,并且没有找到很多答案。
我非常确定HMVC能够正常工作,并且在网站的所有页面上都包含多个小部件,它们需要由一个主控制器进行编排。这将是层次结构的最高层。让我试着举个例子:
每个网页上都有一个包含购物车小部件的网站。当您希望使用购物车功能时,您需要链接到购物车模块中的方法,例如:
<a href="cart/add/<?=$item?>">add</a>
使用此链接的问题是您不想从该模块重新加载网站的其余部分。相反,您可以通过主控制器路由链接并让它重新加载模块,调用所需的方法。 e.g。
<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); ?>
显然这是一个简化的解释,主站点控制器将在一个主视图中处理多个小部件,因此传递正确的数据需要比在方法中调用主视图更好地进行管理。但希望这可以让我了解我所指的结构。
如果有人读到这个并认为我错了,我很乐意听到人们在这个问题上找到的其他解决方案。