Helpers en Magento2

Helpers

Siguiendo un poco con el proceso de aprender, descubrir y (a pesar de no ser lo recomendado) traducir Magento2, hoy toca ver cómo se usan los helpers.

Lo primero será hacer una gran salvedad. Dada la nueva arquitectura de Magento, ya se vio en la comunidad la discusión sobre si los helpers deben o no deben usarse. Esta discusión no es monopolio de Magento, ni de Php, ni de ahora.

Esto no significa que esté poniendo juicio de valor al tema. Pero tampoco es para tomarlo con tanto relajo como para decir: «No hay que usar helpers» o «Hay que usar helpers». La verdad que cuando vamos al mundo real, todas las hermosas y relucientes teorías de lo absoluto, fallan.

Dicho esto, Magento2 nos permite, en nuestros módulos, utilizar Helpers.

Tengamos en cuenta que la propia documentación oficial toma posición al respecto de los Helpers pero luego nos aclara que todos los módulos tienen un helper por defecto… esa parte me hace ruido, me parece que hay algún error de redacción.

Llegado el caso en que necesitemos usar un Helper, en Magento2 a diferencia de la versión anterior, lo tenemos aún más sencillo ya que, para empezar, no hay que definir nada en ningún XML (¡oh milagro!).

Para no perder la costumbre, voy a volver sobre el módulo Barbanet_SampleModule y le vamos a agregar nuestro primer helper. En el post sobre creación de un bloque y un template había quedado el siguiente contenido al acceder a la url /samplemodule.

Bloque personalizado

Entonces, ahora, dentro de mi módulo, creo el directorio Helper y el archivo Data.php. Aquí escribimos nuestros helper.

namespace Barbanet\SampleModule\Helper;
 
use Magento\Framework\App\Helper\AbstractHelper;
 
/**
 * SampleModule base helper
 */
class Data extends AbstractHelper
{
 
    public function convertText($text)
    {
        return strtoupper($text);
    }
}

Ahora, hagamos uso del Helper en el phtml que el módulo tiene en /view/frontend/templates/basic.phtml. Vamos a cambiar el contenido de:

<h1><?php echo __('My first basic block with custom template.') ?></h1>
<p><?php echo __('This is a dummy block.') ?></p>
<p><?php echo $block->getDummyString(); ?></p>
<ul>
    <li>First item</li>
    <li>Second item</li>
</ul>

A esto:

<h1><?php echo __('My first basic block with custom template.') ?></h1>
<p><?php echo __('This is a dummy block.') ?></p>
<p><?php echo $block->getDummyString(); ?></p>
<ul>
    <li><?php echo $this->helper('Barbanet\SampleModule\Helper\Data')->convertText('First item'); ?></li>
    <li>Second item</li>
</ul>

Y el resultado será:

Uso del Helper en el phtml

Efectivamente el texto «First item» fue convertido a mayúsculas.

Otro caso sería usarlo ya no a nivel de phtml, sino dentro de un bloque (o modelo o cualquier otro lugar). Yo voy a invocar el helper en el bloque que se usa aquí mismo. Si miramos más arriba, tengo la línea:

<p><?php echo $block->getDummyString(); ?></p>

Voy a a modificar entonces el bloque /Block/Basic.php del módulo.

Acutalmente, la definición del bloque es:

namespace Barbanet\SampleModule\Block;
 
use Magento\Framework\View\Element\Template;
 
/**
 * Basic SampleModule content block
 */
class Basic extends Template
{
 
    /**
     * @param Template\Context $context
     * @param array $data
     */
    public function __construct(Template\Context $context, array $data = [])
    {
        parent::__construct($context, $data);
        $this->_isScopePrivate = true;
    }
 
    /**
     * Returns a dummy string.
     *
     * @return string
     */
    public function getDummyString()
    {
        return 'Another line without translation defined into the block.';
    }
}

Pero vamos a cambiarlo por:

namespace Barbanet\SampleModule\Block;
 
use Magento\Framework\View\Element\Template;
use Barbanet\SampleModule\Helper\Data;
 
/**
 * Basic SampleModule content block
 */
class Basic extends Template
{
 
    /**
     * @var \Barbanet\SampleModule\Helper\Data
     */
    private $helper;
 
    /**
     * @param Template\Context $context
     * @param array $data
     * @param Data $helper
     */
    public function __construct(
        Template\Context $context,
        array $data = [],
        Data $helper
    ){
        parent::__construct($context, $data);
        $this->_isScopePrivate = true;
        $this->helper = $helper;
    }
 
    /**
     * Returns a dummy string.
     *
     * @return string
     */
    public function getDummyString()
    {
        return $this->helper->convertText('Another line without translation defined into the block.');
    }
}

Y ahora volvemos a nuestro navegador (bueno, primero hicimos in bin/magento cache:clean en la consola), y deberíamos ver el cambio:

Uso del Helper en el bloque

Efectivamente, la segunda línea fue transformada por nuestro Helper, que fue inyectado a nivel de bloque y usado luego en el método en cuestión.

La actualización del módulo con el código comentado está disponible en el tag 2.13.0 en GitHub.