Übergeben von Variablen an einen untergeordneten HTML-Block in Magento 2

8

Bei list.phtmlversuche ich, ein Produktobjekt oder eine Produkt-ID für eine untergeordnete Vorlage abzurufen, die von einem anderen Modul stammt. Wie kann ich die Produkt-ID in dieser HTML-Datei erhalten?
In Magento 1.x war dies über die folgende Technik möglich. Wenn es in Magento 2.x verwendet wird, wird ein Fehler ausgegeben

Nicht erfasster Fehler: Aufruf einer Mitgliedsfunktion setData ()

mein benutzerdefiniertes Modullayout

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

benutzerdefinierte Modul list.phtml Datei

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

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

<?php } ?>

Blockklassencode ist

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

}

untergeordnete Block-HTML-Datei

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

</div>
Praful Rajput
quelle

Antworten:

8

Sie müssen die öffentliche Funktion setProductin Ihrer Blockklasse definieren :

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

und dann kannst du es in deinen Block bekommen :)

Verwenden Sie auch die getChildBlockFunktion anstelle vongetChild

Jetzt müssen Sie setProduct($_product)stattdessen Ihre neu erstellte Funktion verwenden setData('product', $_product').

Bartłomiej Szubert
quelle
funktioniert immer noch nicht ...
Praful Rajput
Können Sie Ihren aktuellen Code unter Ihrer Frage veröffentlichen?
Bartłomiej Szubert
Ich habe es gepostet.
Praful Rajput
Überprüfen Sie meine bearbeitete Antwort
Bartłomiej Szubert
2
wir müssen $block->getChildHtml('block_name', false);dh set cache deaktiviert verwenden.
Praful Rajput
3

Verwenden Sie den folgenden Code:

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

zu

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

Fügen Sie in Ihrer Blockklasse Folgendes hinzu:

protected $product;

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

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

Gehen Sie in der Vorlagendatei, die Sie den untergeordneten Block aufrufen, folgendermaßen vor:

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

Jetzt in Ihrer untergeordneten Blockvorlagendatei:

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

Zuerst müssen wir eine HTML-Datei aus dem Block mit dem folgenden Code aufrufen.

Vom statischen Block:

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

Aus einer anderen PHTML-Datei:

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

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

Im obigen Code haben wir den Wert von variableName übergeben

Jetzt müssen wir diese zusätzlichen Daten in einer solchen HTML-Datei abrufen.

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

ODER

$variablevalue = $block->getVariableName();

Das ist es. Einfach den Cache leeren.

Ajay Patidar
quelle