3

「製品ビュー」ページの一部を Magento 以外で表示しようとしています。すべてを適切に表示し、すべての Javascript を読み込むことができますが、[カートに追加] ボタンをクリックすると、「製品のオプションを指定してください」というメッセージが表示されます。

私のコメントで述べたように、私が変更した場合

$addtocartBlock->createBlock()

$addtocartBlock->getBlockSingleton()

上部全体がカートに追加ブロックに置き換えられます。編集を参照してください。

何かご意見は?

間違っているかもしれませんが、他のブロックに明示的に接続されていないため、[カートに追加] ボタンが正しく機能していないように感じます。

または、これらのブロックをプログラムでレンダリングする際の一般的なガイドラインも非常に役立ちます。私は PHP にかなり精通していますが、Magento は私を失い、Magento フォーラムからランダムなスニペットを切り取って貼り付けることがよくあります。

ありがとうございました!


編集:

もう少し掘り下げた後、さらにいくつかのポイント:

  1. renderView() 呼び出しを各ブロックの下に移動する (それらをまとめて配置するのではなく) ことで、「カートに追加してメインの情報ブロックを置き換える」問題が修正されます。
  2. 単純な製品は問題なく追加できます。私が抱えている唯一の問題は、構成可能な製品のために提出された製品オプションを 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'];
4

2 に答える 2

1

すべての構成可能な製品は、特定のオプションを使用してカートに追加する必要があります。数量と ID のみが必要な単純な製品の場合です。これは、構成可能な製品がカートに追加されたときに、リクエストの配列がどのように見えるかです。

Array(
    [uenc] => aHR0cdsfsdfdsfdssssssssssssss
    [product] => 4816
    [qty] => 2
    [related_product] =>
    [super_attribute] => Array(
            [352] => 1093
        )
) 

「super_attribute」には、ユーザーが選択したオプションが含まれています。そのため、そのデータがブラウザのリクエストに含まれているかどうかを確認することをお勧めします。js 検証が適切に行われずにデータを投稿したり、ユーザーが利用可能な構成可能なオプションから何も選択しなかったり、構成可能なオプションのドロップダウンがまったくレンダリングされなかったりする可能性があります。

于 2012-12-20T14:20:33.253 に答える
0

おそらくあなたはあなたのニーズにより適したアプローチを見つけることができますが、これが私がすることです:

Magentoでカスタムコントローラーを作成する

Alan Stormにはいくつかの素晴らしいMagentoチュートリアルがあります。コントローラーについては、これをチェックしてください。デフォルトの製品コントローラーを拡張します。これは、Drupalインストールからアクセスするコントローラーです(iframeで呼び出される可能性がありますか?)。

カスタムレイアウトを作成する

ここから始めてください-レイアウトがどのように機能するかを感じることができます。製品ページがどのようにレンダリングされるかを見てください(レイアウトXMLファイルと.phtmlテンプレートを確認してください)。カートに商品を追加するとどうなるか考えてみます。

上記の2つを使用すると、機能する製品ページと、現在のサイトで機能するようにページレイアウトとスタイルをカスタマイズする機能が必要になります。それ自体は本当の橋ではありません。それがあなたが求めているものであるなら、MagentoのAPIを見てください。

それでも既存のソリューションを使用したい場合は、Magentoのレイアウトドキュメントをご覧ください。製品ビューページの.phtmlには、カートへの追加フォームを模倣するために生成されるHTML(および生成する必要のあるHTML)が表示されます。

編集 コメントなしで反対票を投じる理由がわからない(私の答えがあなたの好みに合わない場合は、理由を教えてください。改善します)。Magentoはフレームワークであり、受け入れられたソリューションは機能する可能性がありますが、「Magento」の方法ではありません。将来の開発者(自分自身を含む)は、提供されたソリューションを維持するのに苦労する可能性があります。Magentoがどのように機能するかを学ぶ(そしてそれを組み込む)ための余分な努力は、努力する価値があります-結局のところ、あなたのクライアントは彼らの問題を解決するためにあなたにお金を払っています。

于 2012-12-23T12:25:23.020 に答える