Magento 2で子HTMLブロックに変数を渡す


8

list.phtml、他のモジュールから取得した子テンプレートの製品オブジェクトまたは製品IDを取得しようとしています。そのphtmlファイルで製品IDを取得するにはどうすればよいですか?
magento 1.xでは、次の方法で可能でした。magento 2.xで使用するとエラーが発生する

キャッチされないエラー:メンバー関数setData()の呼び出し

私のカスタムモジュールレイアウト

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="category.products.list">
            <action method="setTemplate">
                <argument name="template" xsi:type="string">PR_Catalog::product/list.phtml</argument>
            </action>
            <block class="PR\Catalog\Block\Product\Offers" name="category.products.offers" as="offer_list" template="PR_Catalog::product/offers.phtml" />
        </referenceBlock>        
    </body>
</page>

カスタムモジュールlist.phtmlファイル

<?php    foreach ($_productCollection as $_product){ ?>

<?php 
        $block->getChildBlock("offer_list")->setData("product", $_product);                            
        echo $block->getChildHtml('offer_list') 
?>

<?php } ?>

ブロッククラスコードは

<?php
namespace PR\Catalog\Block\Product;

class Offers extends \Magento\Framework\View\Element\Template
{
    private $product;

    public function setProduct($product)
    {
        $this->product = $product;
    }

    public function getProduct()
    {
        var_dump($this->product);die;
      return $this->product;  
    }

}

子ブロックphtmlファイル

<div class="other-offers">
   <?php echo $block->getProduct()->getId(); ?>

</div>

回答:


8

setProductブロッククラスでパブリック関数を定義する必要があります。

public function setProduct($product)
{
    $this->product = $product;
}

そして、あなたはあなたのブロックでそれを得ることができるでしょう:)

また、getChildBlock代わりに関数を使用してくださいgetChild

ここで、setProduct($_product)ではなく、新しく作成した関数を使用する必要がありsetData('product', $_product')ます。


まだ機能しない...
Praful Rajput

あなたの質問の下で現在のコードを投稿できますか?
パルトロミエSzubert

投稿しました。
Praful Rajput

私の編集済みの答えをチェック
パルトロミエSzubert

2
我々は、使用する必要が $block->getChildHtml('block_name', false);無効になっつまり、設定されたキャッシュを。
Praful Rajput

3

以下のコードを使用してください:

$block->getChildBlock("offer_list")->setData("product", $_product);

$this->getLayout()->createBlock('PR\Catalog\Block\Product\Offers')->setProduct($_product);

3

ブロッククラスに以下を追加します。

protected $product;

public function setProduct($_product){
    $this->product = $_product;
}

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

子ブロックを呼び出すテンプレートファイルで、次のようにします。

<?php /* Start Custom Changes */ ?>
<?php if ($myBlock = $block->getChildBlock('my_child_block')): ?>
    <?php
        $myBlock->setProduct($_product); 
        echo $block->getChildHtml('my_child_block', false);
    ?>
<?php endif; ?>
<?php /* End Custom Changes */ ?>

子ブロックテンプレートファイルで:

<?php echo $block->getProduct()->getId(); ?>

2

まず、以下のコードを使用して、ブロックからphtmlファイルを呼び出す必要があります。

静的ブロックから:

{{block class="Vendor\Extesnion\Block\Customblock" name="customblock" template="Vendor_Extension::filename.phtml" variableName="123"}}

別のPHTMLファイルから:

echo $this->getLayout()->createBlock("Vendor\Extesnion\Block\Customblock")->setTemplate("Vendor_Extension::filename.phtml")->setData("variableName", 123)->toHtml();

XMLから

<block class="Vendor\Extesnion\Block\Customblock" name="block_unique_name" after="-" template="Vendor_Extension::filename.phtml"> 
    <arguments>
       <argument name="variableName" translate="true" xsi:type="string">123</argument>
   </arguments>
</block>

上記のコードでは、variableNameの値を渡しました

次に、このようなphtmlファイルの追加データを取得する必要があります。

$variablevalue = $block->getData('variableName');

または

$variablevalue = $block->getVariableName();

それでおしまい。単にキャッシュをクリアします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.