2

私が達成したいこと:製品のリンク/画像(少なくとも特定の領域)をクリックして、完全な製品情報(基本的には製品ビューページのすべてのコンテンツ)を含むポップアップを開きます。

私がこれまでにした/試したこと:

  • ajax phpコード以外のすべてのものを作成しました(モジュール、リンク、テンプレート、書き換え)
  • ajaxコントローラーを作成しました(次のようなリンクでアクセスできますhttp://test.com/index.php/ajaxproductview/ajax/index/id/2)。
  • さまざまなチュートリアル(これまたはこれのような)に従うために-それは私がこれまでに到達するのを助けました。ただし、カスタムブロックをロードしたくないので、デフォルトの製品ビューブロックが必要です。
  • indexAction()にコードを追加しようとしました。そこに到達しますが、コードは失敗します。エラー/通知/レポートは表示されません。プロセッサを強制終了する無限ループのように見えます。

    $body = $this
        ->getLayout()
        ->createBlock('product.info') // taken from catalog.xml
        ->toHtml();
    $this->getResponse()->setBody($body);
    

他のすべてのページは正常に機能し、Magnetoとモジュールのみがインストールされてアクティブ化された新しいMagentoです。

私のAJAX関数は、このHTML応答を取得し、それをdivに入れて、ポップアップを開きます。

私の質問は次のとおりです。製品IDを設定して、ブロックがロードする製品を認識できるようにする方法と、このブロックを正しくロードする方法を教えてください。私もこれに似たものを試しました:

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

PS:私もこれを試しました:

    $layout = $this->getLayout();
    $update = $layout->getUpdate();
    $update->load('catalog_product_view');
    $layout->generateXml();
    $layout->generateBlocks();
    $output = $layout->getOutput(); // $output is an empty string
4

1 に答える 1

8

Product コントローラーは、ヘルパーを使用してアクティブな製品を設定します。コントローラーでも同じことができるはずです!

レイアウトを行う前にこれを試してください:

$productId  = (int) $this->getRequest()->getParam('id');
Mage::helper('catalog/product')->initProduct($productId, $this);

注意すべきもう 1 つの点: product.info ブロックのようなブロックを追加する場合。テンプレート ファイルで子ブロックを呼び出す場合は、追加の子ブロックが必要です。

カスタム レイアウト xml ファイルを使用するのが最も簡単です。次に、アクション ハンドルに特定のレイアウトを追加できます (アクション ハンドルは、モジュールの etc/config.xml ファイルの routers ノードで構成されます<frontend><routers>。たとえば、<Yourmodule>ノードの下にあることを確認してください。小文字にするようにしてください。次に、アンダースコアを使用してコントローラー名とアクションを追加します。名前、あなたの場合は index_index) のように:

<yourmodule_index_index>
    <remove name="right"/>
    <remove name="left"/>
    <block type="catalog/product_view" name="root" output="toHtml" template="catalog/product/view.phtml">
    <!-- Add all the child blocks you need -->
    </block>
</yourmodule_index_index>

これにより、view.phtml がルート ブロックになり、toHtml メソッドを使用してレンダリングされます。したがって、コントローラー アクションで必要なのは、上の 2 行と次の行だけです。

$this->loadLayout();
$this->renderLayout();
于 2013-01-18T09:30:11.270 に答える