5

私は、通常の構成可能なオプションの代わりに製品ページにいくつかの構成可能なオプションがあり、特定のベンダーが製品を扱っているかどうかを確認するためにデータベースを照会するプロジェクトに取り組んでいます。次に、以下に示すように、javascript を介してベンダーのリストを表示します。

ここに画像の説明を入力

カートに追加するブロックが各ベンダーの横に表示されるようにします。これはすべて動的に作成されるため、作成した「カートに追加」スクリプトにベンダー ID を渡す必要がありました。元の app/design/frontend/base/default/template/catalog/product/view/addtocart.phtml を使用して、以下に示すように独自に作成しました。次の php ファイルは ajax 経由で呼び出されます。元の addtocart.phtml には、たくさんの $this 変数がありました。このブロックが機能するように、$this (モデルに関係なく、ヘルパーが参照している) をシミュレートする必要があります。私はあまり成功していません。私が間違っていることや、別の方法でできることを誰かが見ることができますか? 本当にありがとう!

<?php

require_once('/var/www/Staging/public_html/app/Mage.php');
umask(0);
Mage::app();

//ensure that the value is legitimate
if($_POST && is_numeric($_POST['value'])){
    $value = $_POST['value'];
}

//pass this in your ajax call for the add button
if($_POST && is_numeric($_POST['product_id'])){
    $product_id = $_POST['product_id'];
}

$helper = Mage::helper('core'); //for translation
$block = new Mage_Catalog_Blockproduct_View(); // not best practice, but neither are standalones
$product =  Mage::getModel('catalog/product')->load($product_id); // no need to use the _ here, it's not protected/private; additonally Mage::registry won't work because you're technically not on a product detail page

$buttonTitle = ''; //you are using this, but it isn't set

?>
<div class="add-to-cart">
    <label for="qty"><?php echo $helper->__('Qty:') ?></label>
    <input type="text" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty($product) * 1 ?>" title="<?php echo $helper->__('Qty') ?>" class="input-text qty" />
    <button onclick="window.location = '<?php echo Mage::helper('checkout/cart')->getAddUrl($product);?>'" type="button" title="<?php echo $buttonTitle ?>" class="button btn-cart" id='$value'><span><?php echo $buttonTitle ?></span></button>
</div>
4

2 に答える 2

2

Mage_Catalog_Blockproduct_View現在発生しているエラーです。Magento のクラス名は、ディレクトリ構造を反映していることを忘れないでください。

私はあなたが望んでいると信じていますMage_Catalog_Block_Product_View

ただし、技術的には、ここでブロックを開始したくないでしょうが、それは$this->参照を回避することだと認識しています。また、スタック全体を再度初期化することはありません。より良い方法は、新しいモジュールを作成し、カートへの追加アクションにカスタム コントローラーを使用することです。

<?php
require_once Mage::getModuleDir('controllers', 'Mage_Checkout') . DS . 'CartController.php';

class NS_AjaxCart_CartController extends Mage_Checkout_CartController
{
    public function addAction()
    {
        $params = $this->getRequest()->getParams();
...

次に、単純なコンストラクターを使用してモジュールに新しいブロックを作成し、ブロックで使用するテンプレートを設定します。に似ている:

public function __construct()
{
        parent::__construct();
        $this->setTemplate('catalog/vendoraddtocart.phtml');
}

アクセス可能なブロックを動的に作成するには$this:

$this->getLayout()->createBlock('cms/block')->setBlockId('vendor_add_to_cart')->toHtml()

toHtmlメソッドと、ブロックとレイアウトがすべてどのように機能するかを読んで理解を深めることを検討してください。

お役に立てれば。

于 2013-04-23T06:52:19.550 に答える
1
$this->getProduct() return a product loaded from Mage_Catalog_Model_Product
So it not a registry So cant be used as Mage::registry('current_product')

として何かを使用します

$_product = Mage::getModel('catalog/product')=>load(prodid)

あなたのアプローチは間違っているようです:(

于 2013-04-21T20:13:16.403 に答える