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?

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

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.


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

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


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');

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

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]');

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

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.

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.