Magento 2 - Aufrufliste phtml durch Übergabe der Sammlungsvariablen

10

Ich habe eine Sammlung in eine Variable geladen $collectionund möchte eine Sammlungsvariable in meiner übergebenlist.phtml

$block = $viewBlock->getLayout()
                ->createBlock('Vendor\Module\Block\ProductList')
                ->setTemplate('Magento_Catalog::product/list.phtml')
                ->toHtml();

So list.phtmlerstellen Sie Produktliste entsprechend meiner Sammlung. Meine Frage ist, wie ich die Sammlungsvariable übergeben kannlist.phtml

Hinweis: Ich möchte nichts in der Listen-HTML ändern. Dazu gehört auch das Aufrufen einer benutzerdefinierten Funktion vom Blockobjekt. Meine Produktsammlung muss standardmäßig geladen sein und befindet sich bereits in der Liste phtml, dh:$_productCollection = $block->getLoadedProductCollection();

Muhammad Hasham
quelle

Antworten:

10

Zuerst müssen Sie einen Block erstellen, Vendor\Module\Block\ProductList.phpindem Sie diese Funktion überschreiben, _getProductCollection()indem Sie Ihre Klasse daraus erweitern Magento\Catalog\Block\Product\ListProduct.

protected function _getProductCollection()
{   
        /* Do whatever you want to do with your collection */  

        $this->_productCollection = $yourcollection;
        return $this->_productCollection;
}

Jetzt können Sie Ihre ptmlDatei aufrufen . Ihre Sammlung wurde an diesen übergebenphtml

$block = $viewBlock->getLayout()
                ->createBlock('Vendor\Module\Block\ProductList')
                ->setTemplate('Magento_Catalog::product/list.phtml')
                ->toHtml();

Ich hoffe das wird anderen helfen

Muhammad Hasham
quelle
3

versuche es so ....

   $block = $viewBlock->getLayout()
                    ->createBlock('Vendor\Module\Block\ProductList')
                    ->setCustomvalue('111111')
                    ->setTemplate('Magento_Catalog::product/list.phtml')
                    ->toHtml();

und Sie können Wert bekommen

$block->getCustomvalue();
Rakesh Donga
quelle
Vielen Dank für die Antwort, aber ich möchte keinen benutzerdefinierten Wert an list.phtml übergeben. Ich möchte die Produktsammlung übergeben, damit die magento-Standardliste.phtml die Produktliste mit dieser Sammlung anzeigt.
Muhammad Hasham
Sie können in variabler Sammlung auch versuchen, das
Rakesh Donga
versuchte es mit zu übergeben, ->setCollection($collection)aber es funktionierte nicht. Was ich damit sagen will, ich muss nichts an der Liste ändern, es enthält auch den Aufruf.
Muhammad Hasham
2

Ihre $blockVariable enthält den Inhalt von, list.phtmlalso haben Sie ihn hier gerade aufgerufen.

Das list.phtmlbeinhaltet , $_productCollectiondass sie es aus dem Modul bekommen block, in dem $blockSie etwas in dieser Sammlung tun , weil die Sammlung bereits geladen worden ist, ist es zu spät , um es auf dieser Ebene zu aktualisieren.

Sie können diesen Block neu schreiben Magento_Catalog\Block\Product\ListProduct.phpund anschließend die Sammlung aktualisieren.

PЯINCƏ
quelle
2

Ich habe den folgenden Code verwendet, um Produktdaten mithilfe des Plugins an eine HTML-Datei zu senden. und es funktioniert gut.

namespace Namespace\Modulename\Plugin\Catalog\Product;
use Namespace\Modulename\Helper\Data;

class ListProduct
{

    /**
     * @var Data
     */
    private $dataHelper;

    /**
     * @var \Magento\Framework\View\LayoutInterface
     */
    protected $layout;   
    public function __construct(        
        \Magento\Framework\View\LayoutInterface $layout,
        Data $dataHelper
    ) {        
        $this->layout = $layout;         
        $this->dataHelper = $dataHelper;
    }

    public function afterGetProductDetailsHtml(
        \Magento\Catalog\Block\Product\ListProduct $subject,
        $result,
        \Magento\Catalog\Model\Product $product
    ) {
        if($this->dataHelper->isEnabled()){
            $result .= $this->layout->createBlock('Namespace\Modulename\Block\Label')->setProduct($product)->setTemplate('Namespace_Modulename::product/test.phtml')->toHtml();
        }
        return $result;        
    }
}

Hinweis: Im obigen Code habe ->setProduct($product)ich Produktdaten festgelegt. Ich denke, Sie können ->setCollection()damit Ihr Ziel erreichen. Sie können es auf diese Weise versuchen, es könnte helfen.

Chirag Patel
quelle