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

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').


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

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(); ?>

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.