Plantillas Magento 2: ¿Usar `$ block` o` $ this`?

27

En Magento 2, la $thisvariable ya no hace referencia al objeto de bloque de una plantilla. Se refiere a una clase de plantilla.

 Magento\Framework\View\TemplateEngine\Php

Sin embargo, esta clase de plantilla tiene un __callmétodo passthrough

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

Lo que garantiza que cualquier llamada a un método llegue al bloque real. Esto también explica por qué no puede llamar a métodos protegidos desde phtmlplantillas.

Sin embargo, además de esto, cada plantilla (¿creo?) Tiene una variable denominada $blockpoblada, que también se refiere al objeto de bloque principal. Puede ver esto en uso en la plantilla de lista de Magento

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

donde $blockse usa la variable, pero nunca se define explícitamente.

Aparte de las diferencias mencionadas anteriormente, ¿hay alguna diferencia entre usar una técnica sobre la otra? es decir, ¿ambas cosas $blocky se $this->currentBlockrefieren al mismo objeto?

Alan Storm
fuente

Respuestas:

32

En un archivo de plantilla, $blocky $this->_currentBlockson lo mismo.

Eche un vistazo al rendermétodo en el Php.phpmotor de plantillas.
Antes de incluir el archivo de plantilla, esto sucede: $this->_currentBlock = $block;luego el archivo de plantilla se incluye usando un simple include $fileName;.
Esto significa que dentro de una plantilla todavía está dentro del Phpmotor de plantillas. Por eso $thisfunciona, y por eso $blockestá definido.

[EDITAR]
Acabo de descubrir que $thisse desaconseja el uso de plantillas internas.
El sniffer php con los estándares EcgM2 muestra una advertencia cuando se usan $thisplantillas internas.
Reemplazar $thiscon $blockhace que la advertencia desaparezca.

Marius
fuente
Entonces, ¿cuál es el objeto predeterminado en el archivo .phtml $ block o $ this?
Manish Goswami
¿Qué quieres decir por defecto?
Marius
¿Cuál es la variable predeterminada utilizada en una plantilla para acceder a la clase de representación de la plantilla? ¿Hay alguna diferencia entre estos dos para acceder a la función?
Manish Goswami
Dice en cualquier respuesta. Ambos funcionan pero se recomienda usar$block
Marius
5

Hasta donde he visto, ambos son casi iguales en PHP TemplateEngineInterface, pero recuerde que en Magento2 puede crear motores de plantillas personalizados. No como Magento1 en el que acaba de tener archivos phtml.

Si ve el TemplateEngineInterfaceno puede ver ninguna referencia a ningún método que llame al currentBlock, por lo que creo que el $this->currentBlockenfoque es específico de la plantilla de PHP.

Pero para ser independiente del motor de plantillas, $blockdebe ser el enfoque correcto.

Quiero decir que, desde el punto de vista teórico, podría crear un motor basado en PHP diferente que no pudiera confiar en archivos phtml, pero tal vez en alguna otra estructura PHP.

Supongo que $blockes la forma "correcta" para el modo "phtml" porque se pasa explícitamente como variable de contexto.

$blocky $this->currentBlockson lo mismo desde un punto de vista técnico, pero si se usaran explícitamente $block, creo que deberíamos usarlo, desde el punto de vista del estilo de código.

Phoenix128_RiccardoT
fuente
Pero tampoco es $ block parte de la interfaz. Diría que es seguro asumir que esta implementación se usa cuando estás dentro de un archivo phtml. Otras implementaciones no usarán el archivo phtml.
Fabian Schmengler
Tienes razón, no he sido claro en mi respuesta para explicar lo que quiero decir. Modifiqué mi publicación con más detalles.
Phoenix128_RiccardoT