質問
背景
「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にはこれに対する自然な解決策はありません。そこで、この回避策を使用することにしました:
-
各メインコントローラー(つまり、ウィジェットなし、部分ビューなし)にセッションの現在の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); } }
そうです。私見では理想的なアプローチではありませんが、機能します。
他のヒント
私はこのトピックが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つのメインビューで複数のウィジェットを処理するため、正しいデータの受け渡しは、メソッド内からメインビューを呼び出すよりも適切に管理する必要があります。しかし、うまくいけば、これが私が参照している構造のアイデアを与えてくれます。
誰かがこれを読んで、私が間違っていると思うなら、この問題に対して人々が見つけた他の解決策を聞きたいです。