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.

Kilis
quelle

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();
}
Raphael beim digitalen Pianismus
quelle
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;
    }
Yogesh Agarwal
quelle
+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;
Rakesh Jesadiya
quelle
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();
}
Govind Ram Bhatt
quelle
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

Kilis
quelle
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; 
}
Kay Int Veen
quelle
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!

Mac A.
quelle
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();
}
Arshad Syed
quelle