Magento 2: Ottieni ID opzione di selezione dell'attributo del prodotto, etichetta per prodotto configurabile


19

Come ottenere un valore di opzione basato sull'ID opzione in Magento o ottenere un ID opzione basato sul codice opzione?

Esempio: come ottenere l'opzione 10 dell'attributo colore dall'etichetta "Rosso" e ottenere il valore "Rosso" se l'id opzione è 10?

Risposte:


46

puoi fare lo stesso di magento 1,

Maggiori informazioni in dettaglio, Visita, Ottieni ID opzione ed Etichetta dal prodotto configurabile

// ottiene l'etichetta dell'opzione in base all'ID opzione dall'oggetto prodotto

$optionId = 10;

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

// ottiene l'id opzione in base all'etichetta dell'opzione

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

//get option id ex. 10

Puoi dirmi a che serve $ attr-> usiSource () mentre
ottengo le

Ho ottenuto le opzioni senza le condizioni if ​​che hai citato nel tuo codice
Jaisa

Puoi spiegarmi, se sbaglio
Jaisa

1
perfetto rakesh bhai mlishu kyarek avad ma :)! fatto il mio giorno !!! +1 :)
SagarPPanchal,

Grazie, ho usato questo pezzo di codice ma ora sto affrontando dei problemi. Vedi magento.stackexchange.com/questions/256510/… . Esiste un metodo alternativo per ottenere lo stesso risultato?
Akif

12

La migliore pratica in magento è di farlo tramite XML.

Per ottenere un attributo standard come brandte, catalog_product_view.xmlad esempio, fai qualcosa del genere :

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

Questo otterrà il valore di un attributo di input o textarea. Se hai un menu a discesa, dovresti utilizzare il tipo di testo, quindi aggiungi questa riga nell'elenco di argomenti:

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

Non è necessario creare file o scrivere alcun codice php per ottenere un attributo. In questo modo avrai coerenza e userai lo stesso file attributo.phtml per tutti gli attributi. Se qualcosa cambia, devi cambiarlo in un solo posto.


Mi hai appena salvato la giornata, non sono stato in grado di ottenere il testo "a discesa" e l'ho trovato. quindi grazie.
Arun Karnawat,

11

Ha funzionato per me

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

7

ottengo una soluzione semplice. questo mostrerà solo il valore dell'attributo con il codice dell'attributo per un prodotto. ho controllato il catalogo e la pagina dei dettagli.

il codice è

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

qui size è il nome dell'attributo.

riferimento: vendor / magento / module-catalog / view / frontend / templates / product / view / stats.phtml line: 35


6

Usa il metodo di fabbrica

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

nel file phtml

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');

ciao @Qaisar, possiamo creare un attributo a livello di
codice

@jafarpinjar sì, puoi farlo. usando lo stesso codice.
Qaisar Satti,

2

$product->getResource()ha una nota di DocBlock sull'essere deprecato almeno nella v2.2.2 e quindi ero titubante nel usare il codice. È venuta con questa soluzione invece ispirata a quelle già presenti in questa pagina:

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

Per riferimento questo è il metodo 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();
}

Dove vedi questo codice nell'originale Magento? Non riesco nemmeno a trovare il getResource()metodo in questo modello: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix

getResource()era un metodo che esisteva in precedenza. Nella v2.2.2, come ho già detto, era già previsto un deprezzamento. Nel ramo 2.3-sviluppo sospetto che sia stato completato. Quindi il mio esempio che non richiede quella funzione.
Joshua Fricke, il

1

Per tutti viene qui.

Se non si dispone di alcuna entità prodotto, è possibile recuperare un valore di opzione con questi passaggi.

Iniettare \Magento\Eav\Api\AttributeRepositoryInterfacenella tua classe

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

Utilizzare il repository per ottenere l'istanza dell'attributo

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

Utilizzare $attributeper ottenere l'id opzione dal valore dell'opzione

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

1

puoi usare per ottenere l'etichetta dell'attributo

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

puoi usare il gestore oggetti:

$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

Per favore prova questo codice

Passaggio 1) Innanzitutto devi caricare i prodotti

$_productCollection = $block->getLoadedProductCollection();

Passaggio 2) Nella pagina di elenco dei prodotti, ci sarà un ciclo foreach per elencare i prodotti in questo modo

foreach ($_productCollection as $_product)

Step3) Il tuo codice sarà all'interno di questo loop. Posiziona il codice qui sotto in un punto in cui desideri visualizzare l'etichetta dell'attributo.

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

Basta sostituire your_attribute_code con qualunque sia il nome del tuo attributo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.