Risposte:
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
La migliore pratica in magento è di farlo tramite XML.
Per ottenere un attributo standard come brand
te, catalog_product_view.xml
ad 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.
Ha funzionato per me
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
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
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');
$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();
}
getResource()
metodo in questo modello: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
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.
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\AttributeRepositoryInterface
nella 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 $attribute
per ottenere l'id opzione dal valore dell'opzione
$optionId = $attribute->getSource()->getOptionId('[option_value]');
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);
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.