Magento 2 nhận Id danh mục hiện tại bằng cách sử dụng đăng ký


Câu trả lời:


0

Tôi nghĩ Bạn đã thực hiện trong trình điều khiển của mình, có lẽ bạn nên khởi chạy trình quản lý đối tượng bằng cách sử dụng lớp ngữ cảnh trong phương thức __construct.


Xin chào, tôi đã gọi phương thức xây dựng trong tệp lớp khối của mình, vui lòng kiểm tra liên kết bên dưới để biết thêm chi tiết codebeautify.org/alleditor/0b796a Và cảm ơn vì đã giúp đỡ.
Pratik

Đây không phải là câu trả lời được chấp nhận. Bạn không nên sử dụng Objectmanager theo cách được mô tả.
seanbreeden

22

Nếu bạn cần Id danh mục trong Magento2, thì bạn có thể nhận các giá trị bằng cách sử dụng các bước sau

1. Bao gồm việc sử dụng Magento\Framework\Registrytrong tập tin lớp của bạn.

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2. Tạo một đối tượng cho việc sử dụng Trình quản lý đối tượng hoặc người khác nếu bạn sử dụng nó trong bộ điều khiển thì gán trong __construct()hàm của bạn là \Magento\Framework\Registry $registry:

...

/**
 * @var Registry
 */

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

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

    ...

3. Sau đó, bạn có thể chỉ cần sử dụng nó với lớp như:

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

echo $category->getId();

Để tham khảo thêm trong Magento2 Thực hiện khái niệm này, hãy tham khảo tệp lớp và hàm được gọi là hàm công khai _initCategory(). Trong phương pháp này họ đang đăng ký danh mục hiện tại.


Xin chào Tôi làm theo từng bước và kiểm tra kết quả hiển thị. Đã xảy ra lỗi khi xử lý yêu cầu Đối tượng DOMDocument của bạn.
Pratik

Tài sản riêng của bạn ở sai vị trí.
LM_Fielding

10

Hãy thử mã này. Điều này chắc chắn sẽ giúp bạn.

<?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();
?>

4
Bạn không nên sử dụng trình quản lý đối tượng trong mã của mình như thế. devdocs.magento.com/guides/v2.0/extension-dev-guide/ Kẻ
drew7721

3

Những điều trên có vẻ đúng, nhưng tôi nghĩ rằng nhảy thẳng vào Registry không phải là cách tiếp cận tốt nhất. Magento cung cấp Trình giải quyết lớp đã đóng gói chức năng đó. (Xem Khối TopMothy trong Plugin Danh mục)

Tôi khuyên bạn nên tiêm lớp \ Magento \ Catalog \ Model \ Layer \ Resolver và sử dụng lớp đó để có được danh mục hiện tại. Đây là mã:

<?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();
    }
}

Dưới đây là những gì phương thức getCienC Category () thực tế thực hiện trong Lớp 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;
}

Như bạn có thể thấy, nó vẫn sử dụng sổ đăng ký nhưng nó cung cấp dự phòng trong trường hợp không thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.