5

背景

我使用小部件这个词作为一个局部视图,它有自己的控制器(所以它自己的动作),它几乎被放置在所有页面中。我通过 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 是如何处理这个问题的吗?

提前致谢。

4

2 回答 2

1

行。社区没有运气。尽管如此,我还是找到了解决方法。希望对某人有所帮助。

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

那是。恕我直言,这不是理想的方法,但有效。

于 2009-10-26T17:55:14.987 回答
1

我知道这个话题已经有一年多了,但是我一直在谷歌上搜索以更深入地了解 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); ?>

显然这是一种简化的解释,主站点控制器将在一个主视图中处理多个小部件,因此需要更好地管理传递正确的数据,而不是仅从方法中调用主视图。但希望这能让我对我所指的结构有所了解。

如果有人读到这篇文章并认为我错了,我很想听听人们针对这个问题找到的其他解决方案。

于 2010-11-29T13:00:03.050 回答