ページの種類とページを決定する


11

私は毎日Magentoに厳密に取り組んでいる新しい仕事をしています。私はMagentoを使用した経験がありませんので、これまで控えめに言っても難しい課題でした。

作成している拡張機能について簡単に説明します。

これにより、ポップアップ/モーダルウィンドウを表示できます。モーダルのHTMLコンテンツは
Static Block


管理ページ

したがって、管理パネルはNEW TABの下の新しいタブで構成されますSystem/Confuration/

管理パネルでは、新しいタブページのドロップダウンリストでStatic Block、これらのセクションに使用するデフォルトを選択できます...

HOME PAGEまたは HOME PAGE w/Items in Shopping Cart
ALL CATEGORY PAGESまたは ALL CATEGORY PAGES w/Items in Shopping Cart
ALL PRODUCTS PAGESまたは ALL PRODUCTS PAGES w/Items in Shopping Cart
ALL CMS PAGESまたは ALL CMS PAGES w/Items in Shopping Cart
SHOPPING CART PAGEまたは SHOPPING CART PAGE w/Items in Shopping Cart


デフォルトのオーバーライド

次に、実際のCMSCATEGORY、およびPRODUCTページはすべて、管理パネルページと同じ設定を許可しますが、STATIC BLOCKアイテムごとにを設定し、上記の管理設定で行ったデフォルト設定を上書きできることを除きます。


これまでのところ、拡張機能の管理側は完了しています。製品、カテゴリ、CMS、構成ページなどの各セクションにすべての管理タブがあります。

次のステップは、同じ拡張子に追加してStatic Block、ページに挿入することです。これStatic Blockは、次のことを担当します... Static Block上記の領域で設定された設定に基づいて、各ページに正しいものを表示します。

  • 現在のページページタイプ(cms、product、home、category)の判別
  • 次に、上記の領域で設定されたすべてのカスタム設定を読み取る必要があります。
  • Categoryページ上にいると判断された場合は、次に、実際の特定のカテゴリを取得する必要があります。例えばCategory 3。次に、その特定のカテゴリに特定の設定があるかどうかを確認します。表示されている場合は、そのカテゴリに保存されているEnabledものを探し、ページのStatic BlockメインStatic Blockに表示します。
  • 上記の特定のカテゴリが設定されDisabledているModal Window場合、モーダルのよりグローバルな設定をさらに調べ、すべてのカテゴリでモーダルが有効になっているかどうかを確認します。はいの場合、Static Blockすべてのカテゴリに表示されるように設定されているものが表示されます。
  • これらすべてに加えて、メインのページタイプ(製品、カテゴリ、cms、ホーム、カート)ごとにこのプロセスを実行します
  • また、ショッピングカートが空かどうかも確認する必要があります。空でない場合... Static Block各設定Static Blockで空のカートに1を、空のカートに1を設定できるため、wqeがそのページにどちらを表示するかを確認するときに、上記を考慮する必要があります。(これは大規模なハードで大規模な作業であることはわかっていますが、管理者側がほぼ完了Static Blockしています。特定のページに表示するものを決定する際に、これらすべてを考慮に入れる部分を実行する必要があります。

私を正しい方向に導くために、いくつかの小さな質問があります...

  • 私のStatic Blockコード(PHP部分)の内部では、どの種類のページを使用しているかをどのように判断できますか?先ほど触れたように、自分が表示されているかどうかを知る必要があります。ホームページCMSページカテゴリページ製品ページ、またはショッピングカートページですか。
  • PAGE TYPEに加えて、実際のページを取得する必要があります。したがって、製品ID 1234を使用している場合、その特定のページの設定(そのページの静的ブロックセット)を取得できる必要があります。

これは長く、おそらく混乱を招く投稿でした。これまでにそれを作ったなら、これを読むのに時間を割いてくれてありがとう=)

私の質問にご協力いただければ、小さなチャンクごとに最終目標に近づくことができます


以下は、ページに挿入する静的ブロックを決定するためにモジュールがどのように機能する必要があるかについて作成したフローチャートです

ここに画像の説明を入力してください


2
Mage_Widgetモジュールに存在する機能を効果的に再現したことにお気づきでしょうか?
ベンマークス2013

@benmarksが言ったことを同上。IMOは、ウィジェットを活用しようとして、そこから行くほうがよいでしょう。
davidalger 2013

@benmarks私が質問に追加したフローチャートを見て、それでも100%は達成可能だと思いますMage_Widgetか?私もそれを調べる必要があります
JasonDavis 2013

いいえ。コアウィジェットブロックは、グラフに示されているような組み合わせを理解していません。このためのブロックロジックが必要になります。
ベンマークス2013

回答:


12

何に加えて答え@benmarks

これは、あなたが言及した条件のいくつかをチェックするための小さなコードです:

// Check if it's a CMS page:
$page = Mage::getSingleton('cms/page');
if ($page->getId()) {
    // The current page is a CMS page

    if ($page->getIdentifier() == Mage::getStoreConfig('web/default/cms_home_page')) {
        // The current page is the CMS home page
    }
}

$product = Mage::registry('current_product');
$category = Mage::registry('current_category');
if ($product && $product->getId()) {
    // The current page is a product page.
    // If you only want the main product detail page, also check for 
    // Mage::app()->getFrontController()->getAction()->getFullActionName() == 'catalog_product_view'
    // Be aware that a current_product and a current_category can be set at the same time.
    // In that case the visitor is viewing a product in a category.
} elseif ($category && $category->getId()) {
    // The current page is a category page
    // If you only want the category list page, also check for 
    // Mage::app()->getFrontController()->getAction()->getFullActionName() == 'catalog_category_view'
}

// Check for cart page
if (Mage::app()->getFrontController()->getAction()->getFullActionName() == 'checkout_cart_index') {
    // The current page is the cart
}

カートが空かどうかを確認するには

$isEmpty = Mage::getSingleton('checkout/session')->getQuote()->getItemsCount() > 0

また、CMSブロックの現在のページを確認できるかどうかも尋ねました。
これはおそらく良いアプローチではありません(最初のページでCMSブロックを使用する目的に反するカスタムブロックを含める必要があります)。
代わりに、まず現在のページを確認してから、それに基づいて表示するCMSブロックを選択することをお勧めします。

EDIT:固定Mage::app()->getRequest()->getFullActionName()されるMage::app()->getFrontController()->getAction()->getFullActionName()ようにコメントで@Josephで述べました。ありがとう!


これは本当に私を始めるのに役立つでしょう!
JasonDavis 2013

1
注:Mage::app()->getRequest()->getFullActionName()カートテンプレートで使用すると、致命的なエラーが発生するか、少なくとも1.7.0.2ではエラーが発生しました。$this->getAction()->getFullActionName()完璧に働いた!
ジョセフ・リーディ

ええ、そうです、あなたは順調です。悪い!ありがとう!
ビナイ

参考までに、Mage :: getSingleton( 'cms / page')-> getId()は、controller_action_predispatchイベントでnull値を返します。
MagePsycho 2014年

7

あなたが取ることができる多くのアプローチ。<default>すべてのページで使用できるようにするレイアウト更新ハンドルを介してブロックを追加することをお勧めします。ブロックの_prepareLayout()メソッドで、リクエストオブジェクト($this->getRequest()->getFullActionName())から現在の完全なアクション名を取得し、それを使用してコンテキストを決定することで、スコープを決定できます。

製品とカテゴリはレジストリに登録されます。ブロックは、レイアウト更新ハンドルを調べることもできます。これには、製品IDまたはカテゴリIDハンドルが含まれます。


3

ホームページを検出するには、数値IDではなく、識別子文字列(例: "home")を使用して構成値と照合する必要があります。

if($ page-> getIdentifier()== Mage :: getStoreConfig( 'web / default / cms_home_page')){
    //ホームページ
}

ここにいくつかの他のものがあります:

$ fullActionName = Mage :: app()-> getFrontController()-> getAction()-> getFullActionName();
if( 'checkout_onepage_index' == $ fullActionName){
    // チェックアウト
}

if( 'checkout_onepage_success' == $ fullActionName){
    //チェックアウト成功
}

if( 'customer_account_login' == $ fullActionName){
    // ログインする
}

if( 'customer_account_logoutSuccess' == $ fullActionName){
    //ログアウト成功
}

if( 'customer_account_create' == $ fullActionName){
    //顧客アカウントを作成します
}
if(0 === strpos($ fullActionName、 'catalogsearch_')){
    // 探す
}

if(0 === strpos($ fullActionName、 'customer_account_')
 || 0 === strpos($ fullActionName、 'customer_address_')
 || 0 === strpos($ fullActionName、 'wishlist_')
 || 0 === strpos($ fullActionName、 'newsletter_manage_')
 || 0 === strpos($ fullActionName、 'review_customer_')
 || 0 === strpos($ fullActionName、 'sales_order_')
){
    //顧客アカウントページ(おそらく他にもあります)
}

みんなの参考になった情報ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.