Magento 2: obtenha o ID da opção de seleção do atributo do produto, o rótulo para o produto configurável

19

Como obter um valor de opção com base no ID da opção no Magento, ou obter um ID de opção com base no código da opção?

Exemplo: como obter o ID da opção 10 do atributo de cor no rótulo "Vermelho" e obter o valor "Vermelho" se o ID da opção for 10?

Arnaud
fonte

Respostas:

46

você pode fazer o mesmo que magento 1,

Mais informações em detalhes, Visita, Obter ID da opção e Etiqueta do produto configurável

// obtém o rótulo da opção com base no ID da opção do objeto do produto

$optionId = 10;

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

// obtém o ID da opção com base no rótulo da opção

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

//get option id ex. 10
Rakesh Jesadiya
fonte
Você pode me dizer o que é o uso de US $ attr-> usesSource () ao obter opções de atributo
Jaisa
Eu tenho as opções sem a se a condição que você mencionou em seu código
Jaisa
Você pode explicar, se eu estiver errado
Jaisa
1
perfeito rakesh bhai mlishu kyarek avad ma :)! fez o meu dia!!! 1)
SagarPPanchal
Obrigado, usei esse código, mas agora estou enfrentando problemas. Veja magento.stackexchange.com/questions/256510/… . Existe um método alternativo para alcançar o mesmo resultado?
Akif
12

A melhor prática no magento é fazê-lo via xml.

Para obter um atributo padrão como brandvocê faz algo parecido com isto, catalog_product_view.xmlpor exemplo:

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

Isso obterá o valor de um atributo de entrada ou área de texto. Se você tiver uma lista suspensa, use o tipo de texto; adicione esta linha na lista de argumentos:

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

Não há necessidade de criar arquivos ou escrever qualquer código php para obter um atributo. Dessa forma, você terá consistência e usará o mesmo arquivo attribute.phtml para todos os atributos. Se algo mudar, você precisará alterá-lo apenas em um local.

Claudiu Creanga
fonte
Você acabou de salvar meu dia, não consegui receber o texto 'suspenso' e achei isso. então obrigado.
Arun Karnawat 08/08/19
11

Trabalhou para mim

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

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

no arquivo phtml

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');
Qaisar Satti
fonte
oi @Qaisar, podemos criar atributo programaticamente sem instalador
Jafar pinjar
@jafarpinjar sim, você pode fazer isso. usando o mesmo código.
Qaisar Satti
6

eu recebo uma solução simples. isso mostrará apenas o valor do atributo com o código do atributo para um produto. Eu verifiquei na página de catálogo e detalhes.

o código é

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

aqui size é o nome do atributo.

referência: vendor / magento / catalog-module / view / frontend / templates / product / view / attribute.phtml line: 35

Rafiqul Islam
fonte
2

$product->getResource()tem uma nota do DocBlock sobre ser descontinuado pelo menos na v2.2.2 e, portanto, hesitei em codificá-lo. Criamos essa solução, inspirada nas que já estão nesta 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
}

Para referência, este é o método em 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
fonte
Onde você vê esse código no Magento original? Não consigo nem encontrar getResource()método neste modelo: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix
getResource()era um método que existia anteriormente. Na v2.2.2, como mencionei, ele já estava programado para ser descontinuado. No ramo de desenvolvimento 2.3, suspeito que tenha sido concluído. Assim, meu exemplo que não requer essa função.
Joshua Fricke
1

Para todo mundo vem aqui.

Se você não tiver nenhuma entidade do produto, poderá recuperar um valor de opção com estas etapas.

Injetar \Magento\Eav\Api\AttributeRepositoryInterfacena sua turma

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

Use o repositório para obter a instância do atributo

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

Use $attributepara obter o ID da opção no valor da opção

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

você pode usar para obter o rótulo do atributo

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

você pode usar o gerenciador 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
fonte
0

Por favor, tente este código

Etapa 1) Primeiro você precisa carregar os produtos

$_productCollection = $block->getLoadedProductCollection();

Etapa 2) Na página de listagem de produtos, haverá um loop foreach para listar produtos como este

foreach ($_productCollection as $_product)

Etapa 3) Seu código estará dentro desse loop. Coloque o código abaixo em um local onde você deseja exibir o rótulo do atributo.

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

Apenas substitua your_attribute_code pelo nome do seu atributo.

Divya Muralidharan
fonte