2012-02-02 20 views
0

クライアントのMagentoサイト用のコレクションモジュールを開発しました。とりわけ、このモジュールはカテゴリ一覧ページで製品の詳細(メディア、説明、属性)を取得します。私が実行している問題は、すべてがローカルで動作していても(Magento CE 1.6)、ブロックがクライアントサイト(Magento EE 1.8)でレンダリングされないということです。カスタムブロックがレンダリングされない

デベロッパーモードが有効になっていますが、ページにエラーは表示されず、システム>設定>詳細の管理画面にMagentoが正しく表示されていることがわかりました。

は、我々は我々がapp/design/frontend/enterprise/mytheme/layout/local.xml

<?xml version="1.0"?> 
<layout version="0.1.0"> 
    <catalog_category_view> 
     <reference name="product_list"> 
      <block type="mycompany_collections/collection" name="collection" template="collections/collection.phtml"> 
       <block type="mycompany_collections/product" name="add-to-cart" template="collections/product/add-to-cart.phtml" /> 
       <block type="mycompany_collections/product" name="description" template="catalog/product/view/description.phtml" /> 
       <block type="mycompany_collections/product_attributes" name="attributes" template="catalog/product/view/attributes.phtml" /> 
       <block type="mycompany_collections/product_media" name="media" template="catalog/product/view/media.phtml" /> 
      </block> 
     </reference> 
    </catalog_category_view> 
</layout> 

mycompany_collections/collectionブロックがMage_Catalog_Block_Product_List拡張にレイアウトに私たちのブロックを挿入し、我々がフェッチ持っていることを確認するために製品を再ロードapp/code/local/Mycompany/Collections/etc/config.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Mycompany_Collections> 
      <version>0.1.0</version> 
     </Mycompany_Collections> 
    </modules> 
    <global> 
     <blocks> 
      <mycompany_collections> 
       <class>Mycompany_Collections_Block</class> 
      </mycompany_collections> 
     </blocks> 
    </global> 
</config> 

に基本ブロックのクラス名を設定しますすべての関連データをデータベースから取得します。

class Mycompany_Collections_Block_Collection extends Mage_Catalog_Block_Product_List { 
    public function reloadProducts() { 
     // Fully reload each of the products in this category so that we have 
     // all the information required to display product details. 

     // TODO: find a more efficient way to grab all the info for all the 
     // products, as this would seem to add 1 (or more) additional 
     // query per product. 

     $reloaded = array(); 
     foreach($this->getParentBlock()->getLoadedProductCollection() as $product){ 
      $reloaded[] = Mage::getModel('catalog/product')->load($product->getId()); 
     } 
     return $reloaded; 
    } 
} 

mycompany_collections/productブロックは、私たちは、明示的にブロックで製品を設定すると、レジストリから引っ張らず、その製品を返すことができるように、カスタムメソッドをMage_Catalog_Block_Product_Abstractを拡張します。

class Mycompany_Collections_Block_Product extends Mage_Catalog_Block_Product_Abstract { 
    private $_product = null; 

    public function _prepareLayout() { 
     // We don't need to do anything here. 
    } 

    // NOTE: Must be called before ->toHtml() 
    public function setProduct($product) { 
     $this->_product = $product; 
     return $this; 
    } 

    public function getProduct() { 
     return $this->_product; 
    } 
} 

mycompany_collections/product_attributesmycompany_collections/product_mediaブロックの両方が彼らの同等の抽象親クラスに同じGET/set_productの上書きを行います。当社collection.phtmlテンプレート内

、我々は

<?php 
    $_productCollection = $this->reloadProducts(); 
?> 

<!-- Buy collection popup --> 
<div id="buy-collection" class="no-display"> 
    <h1>Buy Collection</h1> 
    <?php foreach($_productCollection as $_product): ?> 
     <div id="buy-collection-product-<?php echo $_product->getId(); ?>" class="product"> 
      <div class="media"><?php echo $this->getChild('media')->setProduct($_product)->toHtml(); ?></div> 
      <?php /* 
      <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(100); ?>" width="100" height="100" alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" /></a> 
      */ ?> 
      <a href="<?php echo $_product->getProductUrl() ?>" ><?php echo $_product->getName(); ?></a> 
      <?php if($_product->isSaleable()): ?> 
       <div class="add-to-cart"><?php echo $this->getChild('add-to-cart')->setProduct($_product)->toHtml(); ?></div> 
      <?php else: ?> 
       <div class="out-of-stock"><?php echo $this->__('Out of stock') ?></div> 
      <?php endif; ?> 
      <div class="details"> 
       <div class="description"> 
        <?php echo $this->getChild('description')->setProduct($_product)->toHtml(); ?> 
       </div> 
       <div class="attributes"> 
        <?php echo $this->getChild('attributes')->setProduct($_product)->toHtml(); ?> 
       </div> 
      </div> 
     </div> 
    <?php endforeach; ?> 
</div> 

<!-- Product detail popups --> 
<div id="product-details" class="no-display"> 
    <?php foreach ($_productCollection as $_product): ?> 
    <div id="product-detail-<?php echo $_product->getId(); ?>" class="product"> 
     <div class="media"><?php echo $this->getChild('media')->setProduct($_product)->toHtml(); ?></div> 
     <div class="description"><?php echo $this->getChild('description')->setProduct($_product)->toHtml(); ?></div> 
     <div class="attributes"><?php echo $this->getChild('attributes')->setProduct($_product)->toHtml(); ?></div> 
    </div> 
    <?php endforeach; ?> 
</div> 

実際に発射するすべて(これらはクリックでアクティブにJSライトボックスです)$this->reloadProducts()を呼び出し、製品の詳細を表示し、コレクションのポップアップを購入する製品のリストを反復処理しますこれをオフにして、コレクションとして表示する商品カテゴリについては、管理者のそのカテゴリのカスタムデザインタブにあるcategory.listingテンプレートとproduct_listテンプレートを上書きします。これらのテンプレートにはデザイン変更が含まれており、product/list.phtmlがコレクションブロックを呼び出します。 product/list.phtmlインサイド

<reference name="product_list"> 
    <action method="setTemplate"> 
     <template>catalog/collections/product/list.phtml</template> 
    </action> 
</reference> 

<reference name="category.products"> 
    <action method="setTemplate"> 
     <template>catalog/collections/category/view.phtml</template> 
    </action> 
</reference> 

我々は、単純なecho $this->getChildHtml('collection');で収集ブロックを呼び出します。この行には何も返されません。テンプレートなし、PHPエラーなし、何もありません。上記のように、これは私のローカル開発環境ですべて美しく動作します。

これは、設定の概要です。ここでは、私がデバッグに行っているものです:

アラン・ストームのLayoutviewerモジュールを使用して、私は私のブロックは?showLayout=pageに上場されていることを確認した、とハンドル「catalog_category_viewは」?showLayout=handlesに記載されています。しかし、私が$this->getSortedChildren()をproduct/list.phtmlに印刷すると、コレクションブロックがリストされません。

layout.xmlのコレクションブロックを超簡単なcore/textブロックに置き換えると、になります。

<?xml version="1.0"?> 
<layout version="0.1.0"> 
    <catalog_category_view> 
     <reference name="product_list"> 
      <block type="core/text" name="collection"><action method="setText"><text>This is a test</text></action></block> 
     </reference> 
    </catalog_category_view> 
</layout> 

私がどうかを確認するためにMycompany_Collections_Block_Collectionと減少collections.phtmlからテキストの一行にreloadProductsメソッドを削除...これは、問題は私自身のコード内のより深いだったと信じて私を導いたので、私は単純化され、完全に基本的に行きましたテンプレートブロックまたは子ブロック内の何かが問題を引き起こしていました。残念ながら、これは何の影響もなく、まだ出力はありません。

私はこれが動作しない理由として損失で本当によ。私が最初にそれが企業とコミュニティ版との差であってもよいと思ったが、レイアウト/ブロックシステムのように基本的なものは、それらの間で異なることはほとんどありません。明らかに欠けているものがあるようですが、私は誰かが正しい方向を指すことができるようになることを望んでいます。

ありがとうございます!

+0

マゼンタキャッシュをクリアしましたか?常に最初に確認してください。 – ShaunOReilly

+0

はい、キャッシュは完全に無効になっています。 – dmpayton

+1

そうかもしれませんが、/ var/cacheフォルダはクリアされています。その中のすべてのファイルを削除してください。 – ShaunOReilly

答えて

0

あなたは有効/app/etc/modulesセクションとcodepoolで利用可能なMycompany_Collections.xmlをチェックしましたか?

+0

はい、 'app/etc/modules/Mycompany_All.xml'に' Mycompany_Collections'を追加しました。アクティブにtrueを設定し、codePoolをローカルに設定しています。 – dmpayton

+0

私は間違っていないよ場合は、お使いのモジュール名Mycompany_Collections。したがって、あなたのモジュールは '/ app/code/local/Mymodule/Collections'ディレクトリにあり、xml設定ファイルは' app/etc/modules'フォルダの 'Mymodule_Collections.xml'でなければなりません。 –

関連する問題