Magento 2: Obtenir l'ID de l'option de sélection de l'attribut de produit, étiquette pour le produit configurable

19

Comment obtenir une valeur d'option basée sur l'ID d'option dans Magento, ou obtenir un ID d'option basé sur le code d'option?

Exemple: comment obtenir l'option d'attribut de couleur id 10 à partir de l'étiquette "Rouge", et obtenir la valeur "Rouge" si l'identifiant d'option est 10?

Arnaud
la source

Réponses:

46

vous pouvez faire la même chose que magento 1,

Plus d'informations en détails, visitez, obtenez l'identifiant de l'option et l'étiquette du produit configurable

// obtient le libellé de l'option en fonction de l'ID de l'option de l'objet produit

$optionId = 10;

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $optionText = $attr->getSource()->getOptionText($optionId);
 }
//get option text ex. Red

// obtenir l'identifiant de l'option en fonction du libellé de l'option

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $option_id = $attr->getSource()->getOptionId("Red");
 }

//get option id ex. 10
Rakesh Jesadiya
la source
Pouvez-vous me dire à quoi sert $ attr-> usesSource () lors de l'obtention des options d'attribut
Jaisa
J'ai obtenu les options sans la condition if ce que vous avez mentionné dans votre code
Jaisa
Pouvez-vous expliquer, si je me trompe
Jaisa
1
parfait rakesh bhai mlishu kyarek avad ma :)! fait ma journée !!! +1 :)
SagarPPanchal
Merci, j'ai utilisé ce morceau de code mais je rencontre des problèmes maintenant. Voir magento.stackexchange.com/questions/256510/… . Existe-t-il une méthode alternative pour obtenir le même résultat?
Akif
12

La meilleure pratique dans magento est de le faire via xml.

Pour obtenir un attribut standard comme brandvous faites quelque chose comme ceci dans catalog_product_view.xmlpar exemple:

<referenceBlock name="product.info.main">
    <block class="Magento\Catalog\Block\Product\View\Description" name="product.info.brand" template="product/view/attribute.phtml" before="-">
        <arguments>
            <argument name="at_call" xsi:type="string">getBrand</argument>
            <argument name="at_code" xsi:type="string">brand</argument>
            <argument name="css_class" xsi:type="string">brand</argument>
            <argument name="at_label" xsi:type="string">none</argument>
            <argument name="add_attribute" xsi:type="string">itemprop="brand"</argument>
        </arguments>
    </block>
</referenceBlock>

Cela obtiendra la valeur d'un attribut d'entrée ou d'une zone de texte. Si vous avez une liste déroulante, vous devez utiliser le type de texte, alors ajoutez cette ligne dans la liste des arguments:

<argument name="at_type" xsi:type="string">text</argument>

Pas besoin de créer de fichiers ou d'écrire un code php pour obtenir un attribut. De cette façon, vous aurez de la cohérence et utiliserez le même fichier attribute.phtml pour tous les attributs. Si quelque chose change, vous devez le changer en un seul endroit.

Claudiu Creanga
la source
Vous venez de sauver ma journée, je n'ai pas pu obtenir de texte "déroulant" et je l'ai trouvé. donc merci.
Arun Karnawat
11

Travaillé pour moi

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Nathaniel Meyer
la source
7

j'obtiens une solution simple. cela affichera uniquement la valeur d'attribut avec le code d'attribut pour un produit. j'ai vérifié dans le catalogue et la page de détails.

le code est

<?php echo $_product->getAttributeText('size'); ?>

ici, la taille est le nom de l'attribut.

référence: vendeur / magento / module-catalogue / view / frontend / templates / product / view / attribute.phtml ligne: 35

Rafiqul Islam
la source
6

Utiliser la méthode d'usine

   protected $_attributeLoading;

   public function __construct( 
        .....
          \Magento\Catalog\Model\ResourceModel\ProductFactory   $attributeLoading,  
          ....
                                ) {
            parent::__construct($context);

            ....
            $this->_attributeLoading = $attributeLoading;
            ....

    }


   public function getAttributeOptionId($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_id = $attr->getSource()->getOptionId($label);
         }
    }
   public function getAttributeOptionText($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_Text = $attr->getSource()->getOptionText($label);
         }
    }

dans le fichier phtml

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');
Qaisar Satti
la source
salut @Qaisar, pouvons-nous créer un attribut par programme sans programme d'installation
jafar pinjar
@jafarpinjar oui, vous pouvez le faire. en utilisant le même code.
Qaisar Satti
2

$product->getResource()a une note DocBlock sur la dépréciation au moins dans la version 2.2.2 et j'ai donc hésité à coder en l'utilisant. Entré avec cette solution à la place inspiré par ceux déjà sur cette page:

$optionId = $product->getDataByKey('attribute_code');
$optionText = null;
$attributes = $product->getAttributes();
if ($optionId && array_key_exists('attribute_code', $attributes)) {
    $attr = $attributes['attribute_code'];
    if ($attr->usesSource()) {
        $optionText = $attr->getSource()->getOptionText($optionId);
    }
}
if ($optionText) {
    //do something with $optionText
}

Pour référence, il s'agit de la méthode dans AbstractModel.php

/**
 * Retrieve model resource
 *
 * @return \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 * @deprecated 101.0.0 because resource models should be used directly
 */
public function getResource()
{
    return $this->_getResource();
}
Joshua Fricke
la source
Où voyez-vous ce code dans Magento d'origine? Je ne trouve même pas de getResource()méthode dans ce modèle: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix
getResource()était une méthode qui existait auparavant. Dans la version 2.2.2, comme je l'ai mentionné, la dépréciation était déjà prévue. Dans la branche 2.3-develop, je soupçonne qu'elle est terminée. D'où mon exemple qui ne nécessite pas cette fonction.
Joshua Fricke
1

Car tout le monde vient ici.

Si vous n'avez aucune entité produit, vous pouvez récupérer une valeur d'option avec ces étapes.

Injectez \Magento\Eav\Api\AttributeRepositoryInterfaceà votre classe

public function __construct(
    ...
    \Magento\Eav\Api\AttributeRepositoryInterface $attributeRepository,
    ...
) {
    ...
    $this->attributeRepository = $attributeRepository;
    ...
}

Utilisez le référentiel pour obtenir l'instance d'attribut

// 4 is the default entity_type_id for product
$attribute = $this->attributeRepository->get('4', '[attribute_code]');

Utilisez $attributepour obtenir l'ID de l'option à partir de la valeur de l'option

$optionId = $attribute->getSource()->getOptionId('[option_value]');
LucScu
la source
1

vous pouvez utiliser pour obtenir l'étiquette d'attribut

$product->getResource()->getAttribute($key)->getFrontend()->getLabel($product);

vous pouvez utiliser le gestionnaire d'objets:

$pid = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$pdata = $objectManager->create('Magento\Catalog\Model\Product')->load($pid);

$getlable = $pdata->getResource()->getAttribute($key)->getFrontend()->getLabel($pdata);
Pradip Garchar
la source
0

Veuillez essayer ce code

Étape 1) Vous devez d'abord charger les produits

$_productCollection = $block->getLoadedProductCollection();

Étape 2) Dans la page de liste des produits, il y aura une boucle foreach pour lister les produits comme celui-ci

foreach ($_productCollection as $_product)

Étape 3) Votre code sera dans cette boucle.Placez le code ci-dessous à un endroit où vous souhaitez afficher l'étiquette d'attribut.

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);

Remplacez simplement your_attribute_code par le nom de votre attribut.

Divya Muralidharan
la source