Magento 2: Obtenga el ID de la opción de selección del atributo del producto, la etiqueta del producto configurable

19

¿Cómo obtener un valor de opción basado en la identificación de opción en Magento, u obtener una identificación de opción basada en el código de opción?

Ejemplo: ¿cómo obtener el id. De opción de atributo de color 10 de la etiqueta "Rojo" y obtener el valor "Rojo" si el id de opción es 10?

Arnaud
fuente

Respuestas:

46

puedes hacerlo igual que magento 1,

Más información en detalles, Visita, Obtener ID de opción y Etiqueta de producto configurable

// obtener la etiqueta de la opción basada en la identificación de la opción del objeto del producto

$optionId = 10;

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

// obtener la identificación de la opción basada en la etiqueta de la opción

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

//get option id ex. 10
Rakesh Jesadiya
fuente
¿Me puede decir cuál es el uso de $ attr-> usesSource () al obtener opciones de atributos
Jaisa
Obtuve
¿Puedes explicar si estoy equivocado?
Jaisa
1
perfecto rakesh bhai mlishu kyarek avad ma :)! ¡¡¡me alegró el día!!! +1 :)
SagarPPanchal
Gracias, utilicé este código pero ahora tengo problemas. Ver magento.stackexchange.com/questions/256510/… . ¿Existe quizás un método alternativo para lograr el mismo resultado?
Akif
12

La mejor práctica en magento es hacerlo a través de xml.

Para obtener un atributo estándar como brandhacer algo como esto, catalog_product_view.xmlpor ejemplo:

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

Esto obtendrá el valor de un atributo de entrada o área de texto. Si tiene un menú desplegable, debe usar el tipo de texto, así que agregue esta línea en la lista de argumentos:

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

No es necesario crear archivos o escribir ningún código php para obtener un atributo. De esta manera tendrá consistencia y usará el mismo archivo attribute.phtml para todos los atributos. Si algo cambia, debe cambiarlo en un solo lugar.

Claudiu Creanga
fuente
Acabas de salvar mi día, no pude obtener el texto 'desplegable', y encontré esto. así que gracias.
Arun Karnawat
11

Trabajó para mi

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

Tengo una solución simple. esto solo mostrará el valor del atributo con el código de atributo de un producto. He revisado el catálogo y la página de detalles.

el código es

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

Aquí el tamaño es el nombre del atributo.

referencia: vendor / magento / module-catalog / view / frontend / templates / product / view / attribute.phtml línea: 35

Rafiqul Islam
fuente
6

Utilice el método de fábrica

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

en archivo phtml

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');
Qaisar Satti
fuente
hola @Qaisar, ¿podemos crear atributos mediante programación sin instalador?
Jafar pinjar
@jafarpinjar sí, puedes hacer eso. usando el mismo código.
Qaisar Satti
2

$product->getResource()tiene una nota de DocBlock sobre ser obsoleto al menos en v2.2.2 y por eso dudaba en codificarlo. Se le ocurrió esta solución inspirada en las que ya están en esta página:

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

Como referencia, este es el método en 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
fuente
¿Dónde ves este código en Magento original? Ni siquiera puedo encontrar el getResource()método en este modelo: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix
getResource()Era un método que existía previamente. En v2.2.2, como mencioné, ya estaba programado para desaprobación. En la rama de desarrollo 2.3 sospecho que se ha completado. Por lo tanto, mi ejemplo que no requiere esa función.
Joshua Fricke
1

Porque todos vienen aquí.

Si no tiene ninguna entidad de producto, puede recuperar un valor de opción con estos pasos.

Inyecta \Magento\Eav\Api\AttributeRepositoryInterfacea tu clase

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

Use el repositorio para obtener la instancia de atributo

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

Use $attributepara obtener la identificación de la opción del valor de la opción

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

puede usar para obtener la etiqueta de atributo

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

puedes usar el administrador de objetos:

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

Por favor intente este código

Paso 1) Primero debes cargar los productos

$_productCollection = $block->getLoadedProductCollection();

Paso 2) En la página de listado de productos, habrá un bucle foreach para enumerar productos como este

foreach ($_productCollection as $_product)

Paso 3) Su código estará dentro de este bucle. Coloque el código a continuación en el lugar donde desee mostrar la etiqueta del atributo.

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

Simplemente reemplace your_attribute_code con el nombre de su atributo.

Divya Muralidharan
fuente