Magento 2 Holen Sie sich die Kategorie-ID mithilfe des Kategorietitels


11

Ich möchte eine Kategorie-ID erhalten, indem ich nur den Kategorietitel mit dieser Art von Funktion verwende.

->load($categoryTitle, 'title')
->getId();

Anwendungsfall: Kategorie-ID nach Titel abrufen und ID-Daten im Migrationsskript in das Array einfügen.

Antworten:


18

Sie können dies über Sammlungen tun:

Zuerst müssen Sie ein CategoryFactoryin Ihren Klassenkonstruktor einfügen.

Magento 2.0 & 2.1:

public function __construct(
    ...
    \Magento\Catalog\Model\CategoryFactory $categoryFactory
) {
    $this->_categoryFactory = $categoryFactory;
    parent::__construct(...);
}

Dann können Sie überall in Ihrer Klasse Folgendes tun:

$collection = $this->_categoryFactory->create()->getCollection()->addAttributeToFilter('name',$categoryTitle)->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}

Magento 2.2:

public function __construct(
    ...
    \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $collecionFactory
) {
    $this->_collectionFactory = $collecionFactory;
    parent::__construct(...);
}

Dann können Sie überall in Ihrer Klasse Folgendes tun:

$collection = $this->collecionFactory
                ->create()
                ->addAttributeToFilter('name',$categoryTitle)
                ->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}

Erhaltener Fehler PHP Schwerwiegender Fehler: Aufruf der undefinierten Methode Magento \ Catalog \ Model \ CategoryFactory :: getCollection ()
kilis

1
@ Kilis siehe mein Update, müssen Sie DI verwenden, um diese Klasse zu injizieren;)
Raphael bei Digital Pianism

Für meinen Anwendungsfall benötige ich diese Art von Funktion $ collection = $ this -> _ objectManager-> create ('\ Magento \ Catalog \ Model \ CategoryFactory') -> getCollection () -> addAttributeToFilter ('title', $ categoryTitle) - > setPageSize (1);
Kilis

1
@ Kilis gut, es ist eine schlechte Praxis, den Objektmanager direkt zu verwenden. Sie sollten immer die Abhängigkeitsinjektion verwenden
Raphael bei Digital Pianism

ja ich weiß. Unser Projekt-Upgrade-Skript ist folgendermaßen gestaltet: /
kilis

4

Dies kann mithilfe von Serviceverträgen erfolgen, die als Best Practice gelten.

protected $categoryList;

    /**
     * @var SearchCriteriaBuilder
     */
    protected $searchCriteriaBuilder;

    /**
     * @var FilterBuilder
     */
    protected $filterBuilder;

public function __construct(
        ------------
        CategoryListInterface $categoryList,
        SearchCriteriaBuilder $searchCriteriaBuilder,
        FilterBuilder $filterBuilder,
        -----------------
    )
    {
        $this->categoryList = $categoryList;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        $this->filterBuilder         = $filterBuilder;
        parent::__construct(----------);
    }

public function getNameCategory()
    {
        $enableFilter[] = $this->filterBuilder
            ->setField(\Magento\Catalog\Model\Category::KEY_NAME)
            ->setConditionType('like')
            ->setValue(self::CATEGORY_NAME_HELP) // name of the categroy on const
            ->create();


        $searchCriteria = $this->searchCriteriaBuilder
            ->addFilters($enableFilter)
            ->create();

        $items = $this->categoryList->getList($searchCriteria)->getItems();

        if(count($items) == 0)
        {
            return FALSE;
        }

        foreach ($items as $helpCategory)
        {
            $CategoryId = $helpCategory->getId()
        }
return $CategoryId;
    }

+1 Für Best-Practice-Teil
Akif

3

Sie können es einfach tun mit name,

$title = 'womens';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$collection = $_categoryFactory->create()->getCollection()->addFieldToFilter('name',$title);
echo "<pre>";
print_r($collection->getData());
exit;

Nicht für die Verwendung durch FE erforderlich, Upgrade-Skriptfunktionalität erforderlich.
Kilis

Sie haben gerade Titel gesagt, ich habe meine Antwort aktualisiert.
Rakesh Jesadiya

2

Versuchen Sie den folgenden Code für die HTML-Datei:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$_categoryFactory = $objectManager->get('Magento\Catalog\Model\CategoryFactory');

$categoryTitle = 'Outdoor'; // Category Name

$collection = $_categoryFactory->create()->getCollection()->addFieldToFilter('name', ['in' => $categoryTitle]);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}

1

Ich habe es mit Hilfe meiner Collage bekommen

$this->_objectManager->get('Magento\Catalog\Model\CategoryFactory')->create()->getCollection()
        ->addFieldToSelect('name')
        ->addFieldToFilter('name', ['in' => $categoryTitle]);

:) Da die Sammlung nur den gewünschten Datensatz zurückgibt, können Sie das einzige Ergebnis mit ->getFirstItem()dem obigen Code abrufen


0

Um dies in einem funktionierenden Skript umzugestalten, schlage ich Folgendes vor

$obj = $bootstrap->getObjectManager();
$_categoryFactory = $obj->get('Magento\Catalog\Model\CategoryFactory');
$collection = $_categoryFactory->create()->getCollection()->addAttributeToFilter('title',$categoryTitle)->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getCategoryId();
}

Bearbeiten: Ich habe ein Skript erstellt und getestet. Ich habe eine Datei in /scripts/file.php erstellt

<?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);

$obj = $bootstrap->getObjectManager();

// Set the state (not sure if this is neccessary)
$obj = $bootstrap->getObjectManager();
$_categoryFactory = $obj->get('Magento\Catalog\Model\CategoryFactory');
$categoryTitle = 'Test';
$collection = $_categoryFactory->create()->getCollection()->addAttributeToFilter('name',$categoryTitle)->setPageSize(1);
if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
    echo $categoryId; 
}

Versuchte deinen Code, änderte aber die erste Zeile in $ obj = $ this -> _ objectManager; Erhielt eine [Magento \ Framework \ Exception \ LocalizedException] Ungültiger Attributname:
Titelfehler

Als Sie diesen Fehler erhielten, haben Sie mein Skript nicht verwendet.
Kay Int Veen

Ich habe gerade ein vollständig getestetes Skript hinzugefügt. Bitte überprüfen Sie das. es wird sicher funktionieren!
Kay Int Veen

0

Ich habe es geschafft, meine eigene (effizientere) Methode zu schreiben:

$entityTypeId = \Magento\Catalog\Setup\CategorySetup::CATEGORY_ENTITY_TYPE_ID;
$row = $this->queryF("SELECT * FROM `eav_attribute` WHERE `entity_type_id` = $entityTypeId AND `attribute_code` = 'name'", 1);
$nameAttributeId = $row['attribute_id'];
$categoryNames = $this->queryF("SELECT * FROM `catalog_category_entity_varchar` WHERE `attribute_id` = '$nameAttributeId'");
$this->categoryNameIdMap = [];
foreach ($categoryNames as $item) {
    $id = $item['entity_id'];
    $title = $item['value'];
    $this->categoryNameIdMap[$title] = $id;
}

Dieser Code speichert alle title: ids in einem Array zwischen und fragt nur zweimal ab.

Hat für mich gearbeitet. Einfacher zu bedienen!


0

Zuerst müssen Sie die Factory-Klasse der Sammlung injizieren

public function __construct(
    ...
    \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $collecionFactory ) {
    $this->_collectionFactory = $collecionFactory;
    parent::__construct(...); }

Danach können Sie in Ihrer Methode Folgendes tun:

$categoryTitle = 'Men';
$collection = $this->_categoryCollectionFactory->create()->addAttributeToFilter('name',$categoryTitle)->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.