Magento 2: Ermittelt die Auswahloptions-ID des Produktattributs und die Bezeichnung für das konfigurierbare Produkt

19

Wie erhalte ich einen Optionswert basierend auf der Options-ID in Magento oder erhalte eine Options-ID basierend auf dem Optionscode?

Beispiel: Wie erhält man die Farbattribut-Options-ID 10 von der Bezeichnung "Rot" und den Wert "Rot", wenn die Options-ID 10 ist?

Arnaud
quelle

Antworten:

46

Sie können es genauso wie Magento 1 tun,

Weitere Informationen finden Sie unter Details, Besuchen, Options-ID abrufen und Beschriften des konfigurierbaren Produkts

// Optionsbezeichnung basierend auf Options-ID vom Produktobjekt abrufen

$optionId = 10;

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

// Options-ID basierend auf Optionsbezeichnung abrufen

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

//get option id ex. 10
Rakesh Jesadiya
quelle
Können Sie mir sagen, was die Verwendung von $ attr-> usesSource () beim
Abrufen von
Ich habe die Optionen ohne die if-Bedingung, was Sie in Ihrem Code erwähnt haben
Jaisa
Können Sie erklären, wenn ich falsch
liege
1
perfekte Rakesh Bhai mlishu Kyarek avad ma :)! meinen Tag gerettet!!! +1 :)
SagarPPanchal
Danke, ich habe diesen Code benutzt, aber jetzt habe ich Probleme. Siehe magento.stackexchange.com/questions/256510/… . Gibt es vielleicht eine alternative Methode, um das gleiche Ergebnis zu erzielen?
Akif
12

Best Practice in Magento ist es, dies über XML zu tun.

Um ein Standardattribut brandwie dieses zu erhalten, führen Sie catalog_product_view.xmlzum Beispiel Folgendes aus:

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

Dadurch wird der Wert eines Eingabeattributs oder eines Textbereichs abgerufen. Wenn Sie eine Dropdown-Liste haben, sollten Sie den Texttyp verwenden, also fügen Sie diese Zeile in die Liste der Argumente ein:

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

Keine Notwendigkeit, Dateien zu erstellen oder PHP-Code zu schreiben, um ein Attribut zu erhalten. Auf diese Weise haben Sie Konsistenz und verwenden für alle Attribute dieselbe Datei attribute.phtml. Wenn sich etwas ändert, müssen Sie es nur an einer Stelle ändern.

Claudiu Creanga
quelle
Sie haben gerade meinen Tag gerettet, ich konnte keinen Dropdown-Text abrufen, und ich habe diesen gefunden. so danke.
Arun Karnawat
11

Hat für mich gearbeitet

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Nathaniel Meyer
quelle
6

Verwenden Sie die Factory-Methode

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

in der HTML-Datei

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');
Qaisar Satti
quelle
Hallo @ Qaisar, können wir Attribute programmgesteuert ohne Installer erstellen
Jafar Pinjar
@jafarpinjar ja das kannst du machen. mit dem gleichen Code.
Qaisar Satti
6

Ich bekomme eine einfache Lösung. Dadurch wird nur der Attributwert mit dem Attributcode für ein Produkt angezeigt. Ich habe die Katalog- und Detailseite eingecheckt.

der Code ist

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

Hier ist Größe der Attributname.

referenz: anbieter / magento / modulkatalog / ansicht / frontend / vorlagen / produkt / ansicht / attribute.phtml zeile: 35

Rafiqul Islam
quelle
2

$product->getResource()hat einen DocBlock-Hinweis, dass er mindestens in Version 2.2.2 veraltet ist, und deshalb habe ich gezögert, ihn zu verwenden. Kam mit dieser Lösung stattdessen inspiriert von denen, die bereits auf dieser Seite:

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

Als Referenz ist dies die Methode in 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
quelle
Wo sehen Sie diesen Code im Original Magento? Ich kann getResource()in diesem Modell nicht einmal die Methode finden : github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix
getResource()war eine Methode, die vorher existierte. In v2.2.2 war es, wie ich bereits erwähnte, bereits für die Verfallserklärung vorgesehen. Ich vermute, dass der 2.3-Entwicklungszweig abgeschlossen wurde. Also mein Beispiel das diese Funktion nicht benötigt.
Joshua Fricke
1

Denn hier kommt jeder her.

Wenn Sie keine Produktentität haben, können Sie mit diesen Schritten einen Optionswert abrufen.

Injizieren Sie \Magento\Eav\Api\AttributeRepositoryInterfacein Ihre Klasse

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

Verwenden Sie das Repo, um die Attributinstanz abzurufen

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

Verwenden Sie $attribute, um die Options-ID aus dem Optionswert abzurufen

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

Sie können zum Abrufen der Attributbezeichnung verwenden

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

Sie können den Objektmanager verwenden:

$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
quelle
0

Bitte versuchen Sie diesen Code

Schritt 1) ​​Zuerst müssen Sie die Produkte laden

$_productCollection = $block->getLoadedProductCollection();

Schritt 2) Auf der Produktlistenseite gibt es eine foreach-Schleife, um die Produkte wie diese aufzulisten

foreach ($_productCollection as $_product)

Schritt 3) Ihr Code befindet sich in dieser Schleife. Platzieren Sie den folgenden Code an einer beliebigen Stelle, an der Sie die Attributbezeichnung anzeigen möchten.

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

Ersetzen Sie einfach Ihren_attribute_code durch den Namen Ihres Attributs.

Divya Muralidharan
quelle