Truyền biến cho khối html con trong Magento 2


8

Tại list.phtml, tôi đang cố gắng lấy đối tượng sản phẩm hoặc id sản phẩm cho mẫu con, nó đến từ mô-đun khác. Làm cách nào tôi có thể nhận id sản phẩm tại tệp phtml đó?
Trong magento 1.x có thể thông qua kỹ thuật sau. Khi sử dụng nó vào magento 2.x là lỗi ném

Uncaught Error: Gọi tới hàm thành viên setData ()

bố trí mô-đun tùy chỉnh của tôi

<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>

danh sách mô-đun tùy chỉnh tập tin.

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

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

<?php } ?>

mã lớp là

<?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;  
    }

}

tập tin con phtml

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

</div>

Câu trả lời:


8

Bạn phải xác định chức năng công khai setProducttrong lớp khối của mình:

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

và sau đó bạn sẽ có thể có được nó trong khối của bạn :)

Ngoài ra, sử dụng getChildBlockchức năng thay vìgetChild

Bây giờ bạn phải sử dụng chức năng mới được tạo của bạn, setProduct($_product)thay vì setData('product', $_product').


vẫn không hoạt động ...
Rajput đáng khen ngợi

Bạn có thể gửi mã hiện tại của bạn dưới câu hỏi của bạn?
Bartłomiej Szubert

Tôi đã đăng nó.
Rajput đáng khen ngợi

Kiểm tra câu trả lời đã được chỉnh sửa của tôi
Bartłomiej Szubert

2
chúng ta phải sử dụng $block->getChildHtml('block_name', false);tức là thiết lập bộ đệm bị vô hiệu hóa.
Rajput đáng khen ngợi

3

Sử dụng mã dưới đây:

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

đến

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

3

Trong lớp khối của bạn thêm vào như sau:

protected $product;

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

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

Trong tệp mẫu mà bạn gọi khối con làm như thế này:

<?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 */ ?>

Bây giờ trong tập tin mẫu khối con của bạn:

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

2

Đầu tiên, chúng ta cần gọi một tệp phtml từ khối bằng mã dưới đây.

Từ khối tĩnh:

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

Từ một tệp PHTML khác:

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

Từ 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>

Trong đoạn mã trên, chúng tôi đã chuyển giá trị của biếnName

Bây giờ chúng ta cần lấy dữ liệu bổ sung trên tệp phtml như thế này.

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

HOẶC LÀ

$variablevalue = $block->getVariableName();

Đó là nó. Đơn giản chỉ cần xóa bộ nhớ cache.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.