背景

我使用单词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. 进入每个主控制器(即没有小部件,没有局部视图)我以这种方式抓取会话中的当前网址(/ 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);
        }
    }
    
  4. 就是这样。不是恕我直言的理想方法,但有效。

其他提示

我知道这个主题已经有一年多了,但是我一直在谷歌上搜索一下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); ?>

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

如果有人读到这个并认为我错了,我很乐意听到人们在这个问题上找到的其他解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top