5

バックグラウンド

私はウィジェットという言葉を、独自のコントローラー (つまり独自のアクション) を持つ部分ビューとして使用し、ほとんどすべてのページに配置します。私は HMVC を介してこれのレンダリングを実装しています。

問題

ここでの問題は、ウィジェット自体がアクションを実行することです。ショッピング カート ウィジェットについて考えてみましょう。そのウィジェットはすべてのページに配置されるため、ユーザーは自分のものをずっと見ることができます。また、ウィジェットには関連するアクションがあります。たとえば、RemoveItem、RefreshCart、ApplyDiscountCoupon などです。このようなアクションはボタンまたはリンクによってトリガーされ、リンクは (HMVC で) 次のようになります。

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

Ok。ユーザーがそのリンクをクリックすると、カート モジュールとカート コントローラーが読み込まれ、アクションが実行されます。アクションは次のようになります。

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

     // "load the view"  ???
}

ご覧のとおり、私の質問は、ビューを HMVC モジュールに読み込む方法です。問題は、カートビューのみをロードすると、カートのみが表示され、メインページをリダイレクトまたはロードすることはできません。これは、メインページが任意のメインページである可能性があるためです。 (製品の選択、購入の継続、製品の詳細の表示、請求情報、チェックアウトなど)。:/

もう 1 つ: このプロジェクトでは AJAX を使用できないという要件があります。

HMVCがこれをどのように処理するか知っていますか?

前もって感謝します。

4

2 に答える 2

1

Ok。コミュニティとの運はありません。それにもかかわらず、私は回避策を見つけました。誰かに役立つことを願っています。

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

あれは。IMHOの理想的なアプローチではありませんが、機能します。

于 2009-10-26T17:55:14.987 に答える
1

このトピックが 1 年以上前のものであることは知っていますが、HMVC プログラムがとるべき構造と CI での実装方法についてさらに洞察を得るためにグーグルで検索しましたが、あまり多くの答えが見つかりませんでした。

サイトのすべてのページに組み込まれた複数のウィジェットで HMVC が適切に機能するためには、それらが 1 つのメイン コントローラーによって調整される必要があると確信しています。これが階層の最上位になります。例を挙げてみましょう:

すべてのページにショッピング カート ウィジェットがあるサイトがあります。カート機能を使用する場合は、カート モジュールのメソッドにリンクする必要があります。たとえば、次のようになります。

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

明らかにこれは単純化された説明であり、メイン サイト コントローラーは 1 つのメイン ビューで複数のウィジェットを処理するため、正しいデータを渡すには、メソッド内からメイン ビューを呼び出すだけでなく、適切に管理する必要があります。しかし、うまくいけば、これで私が言及している構造のアイデアが得られます。

誰かがこれを読んで私が間違っていると思うなら、この問題に対して人々が見つけた他の解決策を聞きたいです.

于 2010-11-29T13:00:03.050 に答える