質問

背景

「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. 各メインコントローラー(つまり、ウィジェットなし、部分ビューなし)にセッションの現在の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);
        }
    }
    

そうです。私見では理想的なアプローチではありませんが、機能します。

他のヒント

私はこのトピックが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つのメインビューで複数のウィジェットを処理するため、正しいデータの受け渡しは、メソッド内からメインビューを呼び出すよりも適切に管理する必要があります。しかし、うまくいけば、これが私が参照している構造のアイデアを与えてくれます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top