SOY CMS / SOY Shop

ブログトップ

カートページを表示する1

2014年03月28日

前回までで公開側のページが表示されるまでを説明しました。

SOY Shopで作成したサイトを表示する1

SOY Shopで作成したサイトを表示する2


今回はカートページが表示されるまでの流れを見ていきたいと思います。






どこのページでも良いのでカートを見るボタンをクリックすると、

カートページが表示されます。


カートページはURLが常に

http://ドメイン/ショップID/cartと一定なのに、

顧客情報の入力であったり支払方法の選択であったりと

表示されるページが異なります。


このフォームの出し分けもページコントローラで行っているので、それらを見ていきます。




http://ドメイン/ショップID/cartのページを開きます。


他のページ同様、ショップID(今後はshopとします)を確認し、

/ルートディレクトリ/shop/以下のindex.phpを開き、SOY2PageController::run();でページコントローラの処理を開始します。


/soyshop/webapp/src/base/SOYShopSiteController.class.phpのexecuteの処理を見ると、


function execute(){

	//タイマーは省略

	SOY2::import("logic.cart.CartLogic");
	SOY2::import("logic.mypage.MyPageLogic");

	$dao = SOY2DAOFactory::create("site.SOYShop_PageDAO");

	/* init event */
	SOYShopPlugin::load("soyshop.site.prepare");
	SOYShopPlugin::invoke("soyshop.site.prepare");

	$pathBuilder = $this->getPathBuilder();


	//パスからURIと引数に変換
	$uri  = $pathBuilder->getPath();
	$args = $pathBuilder->getArguments();

	//トップページ
	if(empty($uri)){
		$uri = "_home";
	}
		
	//消費税別モードは省略
		
	//カート関連
	$cartId = soyshop_get_cart_id();
	define("SOYSHOP_CURRENT_CART_ID", $cartId);

	//マイページ関連
	$mypageId = soyshop_get_mypage_id();
	define("SOYSHOP_CURRENT_MYPAGE_ID", $mypageId);
		
	$doCartApplication = ($uri == soyshop_get_cart_uri()) ? true : false;
	$doMypageApplication = ($uri == soyshop_get_mypage_uri()) ? true : false;

	//カートページ、もしくはマイページを開いた場合
	if($doCartApplication || $doMypageApplication){
			
		//カートの処理が書かれている
	}
}

PathBuilderで取得したURIとSOY Shopで設定したカートのURIを照合して、

今見ているページのURIがカートのものだったらカートの処理を開始する。


//カート マイページ 共通化
SOY2::import("component.backward.BackwardUserComponent");
SOY2::import("component.UserComponent");
			
//カート関連2
if($doCartApplication){
	//notify event
	if(isset($_GET["soyshop_notification"])){
		$this->executeNotificationAction($_GET["soyshop_notification"]);
		exit;
	}

	$this->executeCartApplication($args);
	return;
}

最初にUserComponentをインポートして、どのページでも顧客情報のフォームを使えるようにします。

その後にexecuteCartApplicationでカートの表示の処理を開始します。

(notificationは省略)


SOYShopSiteController.class.phpの176行目付近を見ると、


function executeCartApplication($args){

	$webPage = SOY2HTMLFactory::createInstance("SOYShop_CartPage", array(
		"arguments" => array(SOYSHOP_CURRENT_CART_ID)
	));

	if(count($args)>0 && $args[0] == "operation"){
		$webPage->doOperation();
		exit;
	}else{

		SOY2HTMLPlugin::addPlugin("src", "SrcPlugin");
		SOY2HTMLPlugin::addPlugin("display","DisplayPlugin");

		SOYShopPlugin::load("soyshop.site.onload");
		SOYShopPlugin::invoke("soyshop.site.onload", array("page" => $webPage));

		$webPage->common_execute();

		SOYShopPlugin::load("soyshop.site.beforeoutput");
		SOYShopPlugin::invoke("soyshop.site.beforeoutput", array("page" => $webPage));

		ob_start();
		$webPage->display();
		$html = ob_get_contents();
		ob_end_clean();

		SOYShopPlugin::load("soyshop.site.user.onoutput");
		$delegate = SOYShopPlugin::invoke("soyshop.site.user.onoutput", array("html" => $html));
		$html = $delegate->getHtml();

		echo $html;
	}
}

最初にwebPageを取得します。

これは前回も出ましたが、今回は

/soyshop/webapp/src/base/site/pages/SOYShop_CartPage.class.phpを呼び出しています。

(doOperationはカートに商品を入れたときに読み込まれる関数なので、次回以降にします)


SOY2HTMLPlugin::addPlugin("src", "SrcPlugin");
SOY2HTMLPlugin::addPlugin("display","DisplayPlugin");

SrcPluginはCart01Page.htmlのHTMLにあるような

<img soy:src="themes/common/images/cart/btn_continue_shop_off.png";gt

と書くと、

インストールした環境に合わせてドメインを調べて画像を出力することができ、


DisplayPluginは

<p soy:display="hoge">hogeしました</p>

とテンプレートに書いた際に、

http://example.com/shop/cart?hoge

とGETで渡したときだけ表示されるように拡張できるものです。


SOYShopPlugin::load("soyshop.site.onload");
SOYShopPlugin::invoke("soyshop.site.onload", array("page" => $webPage));

$webPage->common_execute();

SOYShopPlugin::load("soyshop.site.beforeoutput");
SOYShopPlugin::invoke("soyshop.site.beforeoutput", array("page" => $webPage));

ob_start();
$webPage->display();
$html = ob_get_contents();
ob_end_clean();

SOYShopPlugin::load("soyshop.site.user.onoutput");
$delegate = SOYShopPlugin::invoke("soyshop.site.user.onoutput", array("html" => $html));
$html = $delegate->getHtml();

echo $html;

あとは他ページと同じように各拡張ポイントを順に実行させた後にHTMLを出力して表示という手順をとっています。


以上の手順だと、管理画面で設定したカートIDやカート内で今どのページを見ているの?ということが分かりません。

それらはcommon_execute()で行っているのですが、長くなるので次回にします。