「製品ビュー」ページの一部を Magento 以外で表示しようとしています。すべてを適切に表示し、すべての Javascript を読み込むことができますが、[カートに追加] ボタンをクリックすると、「製品のオプションを指定してください」というメッセージが表示されます。
私のコメントで述べたように、私が変更した場合
$addtocartBlock->createBlock()
に
$addtocartBlock->getBlockSingleton()
上部全体がカートに追加ブロックに置き換えられます。編集を参照してください。
何かご意見は?
間違っているかもしれませんが、他のブロックに明示的に接続されていないため、[カートに追加] ボタンが正しく機能していないように感じます。
または、これらのブロックをプログラムでレンダリングする際の一般的なガイドラインも非常に役立ちます。私は PHP にかなり精通していますが、Magento は私を失い、Magento フォーラムからランダムなスニペットを切り取って貼り付けることがよくあります。
ありがとうございました!
編集:
もう少し掘り下げた後、さらにいくつかのポイント:
- renderView() 呼び出しを各ブロックの下に移動する (それらをまとめて配置するのではなく) ことで、「カートに追加してメインの情報ブロックを置き換える」問題が修正されます。
- 単純な製品は問題なく追加できます。私が抱えている唯一の問題は、構成可能な製品のために提出された製品オプションを Magento に認識させることです。
モアー・エディッツ!!!!!1111!
さらに、死なないこの質問に従って、「super_attribute」配列が POST の残りの部分と一緒に送信されないことについて @moldovan-gheorghe-daniel が正しいことを発見しました。さらに、Firebug を使用して、設定可能な製品フィールドを送信<form>
要素の子としてカット アンド ペーストすると、すべてがうまく機能します。最後に本題に入るには:
tl;dr -- CONFIGURABLE PRODUCT ATTRIBUTES ブロックを ADD TO CART ブロックの子としてロードするにはどうすればよいですか?
わあ!
これが私のコードです:
<?php
//Pretty standard loading Magento stuff.
$bootstrap = $_SERVER['DOCUMENT_ROOT'] . '/magento/app/Mage.php';
require_once $bootstrap;
session_name ( 'frontend' );
Mage::getSingleton ( 'core/session', array ('name' => 'frontend' ) );
$app = Mage::app('default');
$app->getTranslator()->init('frontend');
umask(0);
session_name('frontend');
Mage::getSingleton('customer/session'); //I'm not sure I need this.
$_product = Mage::getModel('catalog/product');
$_product->load($product_id);
Mage::unregister('product');
Mage::register('product', $_product);
//The following loads the main Mage_Catalog_Block_Product_View block.
$linksBlock = $app->getLayout()->getBlockSingleton("catalog/product_view");
$linksBlock->setProduct($_product)->setTemplate('catalog/product/view.phtml');
//The following loads the configurable product attributes block.
$checkoutLinksBlock = $app->getLayout()
->getBlockSingleton("catalog/product_view_type_configurable")
->setTemplate('catalog/product/view/type/options/configurable.phtml');
$checkoutLinksBlock->setParentBlock($linksBlock);
/* The following loads the Add To Cart block. If I use getBlockSingleton() instead
* of createBlock(), this replaces the entire top block. */
$addtocartBlock = $app->getLayout()
->createBlock("catalog/product_view")
->setTemplate('catalog/product/view/addtocart.phtml');
$addtocartBlock->setParentBlock($linksBlock);
$blocks['info'] = $linksBlock->renderView();
$blocks['addtocart'] = $addtocartBlock->renderview();
if ($_product->getTypeId() == 'configurable')
$blocks['config'] = $checkoutLinksBlock->renderView();
else
$blocks['config'] = '';
Mage::unregister('product');
// ...And output everything here.
echo $blocks['info'] . $blocks['config'] . $blocks['addtocart'];