Magento 2 obtiene el ID de categoría actual usando el registro


Respuestas:


0

Creo que lo ha hecho en su controlador, es posible que deba inicializar el administrador de objetos mediante el uso de la clase de contexto en el método __construct.


Hola, ya llamo método de construcción en mi archivo de clase de bloque, por favor revise el siguiente enlace para obtener más detalles codebeautify.org/alleditor/0b796a Y gracias por la ayuda.
Pratik

Esta no debería ser la respuesta aceptada. No debe usar Objectmanager de la manera descrita.
seanbreeden

22

Si necesita el ID de categoría en Magento2, puede obtener los valores utilizando los siguientes pasos a seguir

1.Incluya el uso Magento\Framework\Registryen su archivo de clase.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2.Cree un objeto para eso usando Object Manager o si lo está usando en el controlador, entonces asigne en su __construct()función como \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

class BlueLine
{
    ...
    private $registry;
    ...

    public function __construct(Registry $registry) 
    {
        $this->registry = $registry;
    }

    ...

3. Luego, simplemente puede usarlo con la clase como:

$category = $this->registry->registry('current_category');

echo $category->getId();

Para obtener más información sobre la implementación en Magento2 de este concepto, consulte el archivo de clase y la función denominada función pública _initCategory(). En este método están registrando la categoría actual.


Hola, sigo el paso y compruebo el resultado. Se ha producido un error al procesar su solicitud. Debe crearse el objeto DOMDocument.
Pratik

Su propiedad privada está en el lugar equivocado.
LM_Fielding

10

Prueba este código. esto definitivamente te ayudará.

<?php 
   $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
   $category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');//get current category
    echo $category->getId();
    echo $category->getName();
?>

44
No debe usar el administrador de objetos en su código de esa manera. devdocs.magento.com/guides/v2.0/extension-dev-guide/…
drew7721

3

Lo anterior parece correcto, pero creo que saltar directamente al Registro no es el mejor enfoque. Magento ofrece un Layer Resolver que ya encapsula esa funcionalidad. (Consulte el bloque TopMenu en los complementos del catálogo)

Sugiero inyectar la clase \ Magento \ Catalog \ Model \ Layer \ Resolver y usarla para obtener la categoría actual. Aquí está el código:

<?php

namespace FooBar\Demo\Block;

class Demo extends \Magento\Framework\View\Element\Template
{
    private $layerResolver;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver,
        array $data = []
    ) {
        parent::__construct($context, $data);

        $this->layerResolver = $layerResolver;
    }

    public function getCurrentCategory()
    {
        return $this->layerResolver->get()->getCurrentCategory();
    }

    public function getCurrentCategoryId()
    {
        return $this->getCurrentCategory()->getId();
    }
}

Esto es lo que hace el método getCurrentCategory () real en la clase Resolver.

public function getCurrentCategory()
{
    $category = $this->getData('current_category');
    if ($category === null) {
        $category = $this->registry->registry('current_category');
        if ($category) {
            $this->setData('current_category', $category);
        } else {
            $category = $this->categoryRepository->get($this->getCurrentStore()->getRootCategoryId());
            $this->setData('current_category', $category);
        }
    }

    return $category;
}

Como puede ver, todavía usa el registro, pero proporciona un respaldo en caso de que falle.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.