Modelli Magento 2: usare `$ block` o` $ this`?


27

In Magento 2, la $thisvariabile non fa più riferimento all'oggetto blocco di un modello. Si riferisce a una classe modello

 Magento\Framework\View\TemplateEngine\Php

Tuttavia, questa classe di modelli ha un __callmetodo passthrough

#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
    return call_user_func_array([$this->_currentBlock, $method], $args);
}

Che assicurano che qualsiasi chiamata di metodo arrivi al blocco effettivo. Questo spiega anche perché non è possibile chiamare metodi protetti da phtmlmodelli.

Oltre a ciò, tuttavia, ogni modello (penso?) Ha una variabile denominata $blockpopolata, che si riferisce anche all'oggetto blocco padre. Puoi vederlo in uso nel modello di elenco di Magento

#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();

dove $blockviene utilizzata la variabile, ma mai definita esplicitamente.

Oltre alle differenze sopra menzionate, c'è qualche differenza tra l'uso di una tecnica rispetto all'altra? cioè fare entrambi $blocke $this->currentBlockfare riferimento allo stesso oggetto?

Risposte:


32

In un file modello $blocke $this->_currentBlocksono la stessa cosa.

Dai un'occhiata al rendermetodo nel Php.phpmotore di template.
Prima di includere il file modello, questo accade: $this->_currentBlock = $block;quindi il file modello viene incluso usando un semplice include $fileName;.
Ciò significa che all'interno di un modello sei ancora all'interno del Phpmotore del modello. Ecco perché $thisfunziona, ed è per questo che $blockè definito.

[EDIT]
Ho appena scoperto che l'uso dei $thistemplate interni è scoraggiato.
Lo sniffer php con gli standard EcgM2 mostra un avviso quando si usano i $thistemplate interni.
La sostituzione $thiscon $blockfa sparire l'avvertimento.


Quindi qual è l'oggetto predefinito nel file .phtml $ block o $ this.
Manish Goswami,

Cosa intendi per impostazione predefinita?
Marius

Qual è la variabile predefinita utilizzata in un modello per accedere alla classe di rendering del modello? C'è qualche differenza tra questi due per accedere alla funzione?
Manish Goswami,

Dice in ny risposta. Entrambi funzionano ma si consiglia di utilizzare$block
Marius

5

Per quanto ho visto, entrambi sono quasi uguali in PHP TemplateEngineInterface, ma ricorda che in Magento2 puoi creare motori di template personalizzati. Non come Magento1 in cui hai appena avuto file phtml.

Se vedi il TemplateEngineInterfacenon puoi vedere alcun riferimento a qualsiasi metodo che chiama il currentBlock, quindi penso che l' $this->currentBlockapproccio sia specifico del modello PHP.

Ma per essere indipendente dal motore di template, $blockdovrebbe essere l'approccio corretto.

Voglio dire, dal punto di vista teorico, potresti creare un diverso motore basato su PHP che non potrebbe fare affidamento su file phtml, ma forse su qualche altra struttura PHP.

Presumo $blockcome il modo "giusto" per la modalità "phtml" perché è esplicitamente passato come variabile di contesto.

$blocke $this->currentBlocksono gli stessi da un punto di vista tecnico, ma se hanno usato esplicitamente $blockpenso che dovremmo usarlo, da un punto di vista stilistico.


Ma nemmeno $ block fa parte dell'interfaccia. Direi che è sicuro supporre che questa implementazione venga utilizzata quando ci si trova all'interno di un file phtml. Altre implementazioni non utilizzeranno il file phtml.
Fabian Schmengler,

Hai ragione, non sono stato chiaro nella mia risposta per spiegare cosa intendo. Ho modificato il mio post con maggiori dettagli.
Phoenix128_RiccardoT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.