背景
我用的是小部件有其自己的控制器(因此自身的行动)的局部视图,它被放置在几乎所有页面。 我通过实施的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没有一个自然的解决方案这一点。 所以我决定使用此解决方法:
在每个主控制器(即无插件,无局部视图),我抢在会话当前URL这种方式(/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); } }
那是。 是不是理想的方法恕我直言,但作品。
我知道,这个话题是一岁多,但我一直在谷歌搜索获得一些更深入地了解结构的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); ?>
显然,这是一个简单的解释,和主站点控制器将在一个主视图来处理几个小部件,所以传递正确的数据需要被管理不仅仅是从调用的方法中的主视图更好。 但希望这给我指的是结构的想法。
如果有人读这一点,并认为我错了,我很想听听其他解决方案的人发现这个问题。