Magento 2はレジストリを使用して現在のカテゴリIDを取得します


回答:


0

__constructメソッドでコンテキストクラスを使用して、オブジェクトマネージャを初期化する必要があるかもしれません。


こんにちは、私はすでにブロッククラスファイルで構造メソッドを呼び出し ています。詳細については、下記のリンクを参照してください codebeautify.org/alleditor/0b796aそして、助けてくれてありがとう。
プラティック

これは受け入れられた答えであってはなりません。説明されている方法でObjectmanagerを使用しないでください。
seanbreeden

22

Magento2のカテゴリIDが必要な場合は、次の手順に従って値を取得できます。

1. Magento\Framework\Registryクラスファイルに使用を含めます。

<?php
/**
 * class file
 */

namespace Vendor\Module\Model;

use Magento\Framework\Registry;

...

2.オブジェクトマネージャーを使用してそのためのオブジェクトを作成するか、コントローラーでそれを使用して__construct()関数に次のように割り当てる場合\Magento\Framework\Registry $registry

...

/**
 * @var Registry
 */

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

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

    ...

3.次に、クラスで次のように単純に使用できます:

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

echo $category->getId();

このコンセプトのMagento2実装の詳細なリファレンスについては、クラスファイルとpublic functionと呼ばれる関数を参照してください_initCategory()。この方法では、現在のカテゴリを登録しています。


こんにちは、手順を実行し、その結果を確認してください。リクエストオブジェクトDOMDocumentの作成中にエラーが発生しました。
プラティック

あなたの私有財産は間違った場所にあります。
LM_Fielding 16

10

このコードを試してください。これは間違いなくあなたを助けます。

<?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
そのようなコードでオブジェクトマネージャを使用しないでください。devdocs.magento.com/guides/v2.0/extension-dev-guide/...
drew7721

3

上記は正しいように見えますが、レジストリに直接ジャンプすることは最良のアプローチではないと思います。Magentoは、その機能を既にカプセル化したレイヤーリゾルバーを提供します。(カタログプラグインのTopMenuブロックを参照)

\ Magento \ Catalog \ Model \ Layer \ Resolverクラスを挿入し、それを使用して現在のカテゴリを取得することをお勧めします。コードは次のとおりです。

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

以下に、実際のgetCurrentCategory()メソッドがリゾルバークラスで行うことを示します。

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;
}

ご覧のとおり、まだレジストリを使用していますが、失敗した場合のフォールバックを提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.