Magento 2 Obtenir l'identifiant de catégorie en utilisant le titre de catégorie


11

Je voudrais obtenir l'identifiant de catégorie en utilisant uniquement le titre de catégorie en utilisant ce type de fonction.

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

Cas d'utilisation: obtenez l'ID de catégorie par titre et placez les données d'ID dans le tableau dans le script de migration

Réponses:


18

Vous pouvez le faire via des collections:

Vous devez d'abord injecter un CategoryFactorydans votre constructeur de classe.

Magento 2.0 et 2.1:

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

Ensuite, n'importe où ailleurs dans votre classe, vous pouvez faire:

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

Ensuite, n'importe où ailleurs dans votre classe, vous pouvez faire:

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

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

Got a error PHP Fatal error: Appel à une méthode non définie Magento \ Catalog \ Model \ CategoryFactory :: getCollection ()
— kilis

1
@kilis voir ma mise à jour, vous devez utiliser DI pour injecter cette classe;)
— Raphael au Digital Pianism

Pour mon cas d'utilisation, j'ai besoin de ce type de fonction $ collection = $ this -> _ objectManager-> create ('\ Magento \ Catalog \ Model \ CategoryFactory') -> getCollection () -> addAttributeToFilter ('title', $ categoryTitle) - > setPageSize (1);
— kilis

1
@kilis bien c'est une mauvaise pratique d'utiliser le gestionnaire d'objets directement, vous devez toujours utiliser l'injection de dépendances
— Raphael au Digital Pianism

Ouais je sais. Notre script de mise à niveau de projet est conçu comme ça: /
— kilis

4

Cela peut être fait en utilisant des contrats de service qui sont considérés comme les meilleures pratiques.

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 Pour la partie des meilleures pratiques
— Akif

3

Vous pouvez simplement le faire en utilisant name,

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

Pas pour l'utilisation FE, mise à niveau de la fonctionnalité de script nécessaire.
— kilis

vous venez de dire le titre, j'ai mis à jour ma réponse.
— Rakesh Jesadiya

2

Essayez ci-dessous le code pour le fichier Phtml:

$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

Je l'ai obtenu avec l'aide de mon collage

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

:) Étant donné que la collection ne renverra que l'enregistrement que vous souhaitez, vous pouvez récupérer le seul résultat avec ->getFirstItem()le code ci-dessus


0

Pour refactoriser cela dans un script fonctionnel, je suggère d'utiliser ce qui suit

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

Edit: j'ai fait et testé un script. J'ai créé un fichier dans /scripts/file.php

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

J'ai essayé votre code, mais changé la première ligne en $ obj = $ this -> _ objectManager; Vous avez un [Magento \ Framework \ Exception \ LocalizedException] Nom d'attribut non valide: erreur de titre
— kilis

Lorsque vous avez obtenu cette erreur, vous n'avez pas utilisé mon script.
— Kay Int Veen

Je viens d'ajouter un script entièrement testé. veuillez vérifier cela. cela fonctionnera à coup sûr!
— Kay Int Veen

0

J'ai réussi à écrire ma propre méthode (plus efficace):

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

Ce code met en cache tous les titres: id dans un tableau et interroge seulement 2 fois.

A travaillé pour moi. Plus simple d'utilisation!


0

Tout d'abord, vous devez injecter la classe d'usine de collecte

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

Après cela, dans votre méthode, vous pouvez le faire,

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

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.