¿Cómo obtener un valor de atributo de producto específico si conozco el ID del producto sin cargar el producto completo?
¿Cómo obtener un valor de atributo de producto específico si conozco el ID del producto sin cargar el producto completo?
Respuestas:
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Una forma que yo conozco:
$product->getResource()->getAttribute($attribute_code)
->getFrontend()->getValue($product)
$product
dos veces?
puedes usar
<?php echo $product->getAttributeText('attr_id') ?>
$product->getData('my_name')
Consulte la respuesta de Daniel Kocherga , ya que funcionará para usted en la mayoría de los casos.
Además de ese método para obtener el valor del atributo, es posible que a veces desee obtener la etiqueta de un select
o multiselect
. En ese caso, he creado este método que almaceno en una clase auxiliar:
/**
* @param int $entityId
* @param int|string|array $attribute atrribute's ids or codes
* @param null|int|Mage_Core_Model_Store $store
*
* @return bool|null|string
* @throws Mage_Core_Exception
*/
public function getAttributeRawLabel($entityId, $attribute, $store=null) {
if (!$store) {
$store = Mage::app()->getStore();
}
$value = (string)Mage::getResourceModel('catalog/product')->getAttributeRawValue($entityId, $attribute, $store);
if (!empty($value)) {
return Mage::getModel('catalog/product')->getResource()->getAttribute($attribute)->getSource()->getOptionText($value);
}
return null;
}
Parece imposible obtener valor sin cargar el modelo de producto. Si echas un vistazo al archivo app / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php, verás el método
public function getValue(Varien_Object $object)
{
$value = $object->getData($this->getAttribute()->getAttributeCode());
if (in_array($this->getConfigField('input'), array('select','boolean'))) {
$valueOption = $this->getOption($value);
if (!$valueOption) {
$opt = new Mage_Eav_Model_Entity_Attribute_Source_Boolean();
if ($options = $opt->getAllOptions()) {
foreach ($options as $option) {
if ($option['value'] == $value) {
$valueOption = $option['label'];
}
}
}
}
$value = $valueOption;
}
elseif ($this->getConfigField('input')=='multiselect') {
$value = $this->getOption($value);
if (is_array($value)) {
$value = implode(', ', $value);
}
}
return $value;
}
Como puede ver, este método requiere un objeto cargado para obtener datos de él (tercera línea).
Primero debemos asegurarnos de que el atributo deseado esté cargado y luego generarlo. Utilizar esta:
$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);
Prueba esto
$attribute = $_product->getResource()->getAttribute('custom_attribute_code');
if ($attribute)
{
echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
}
No tienes que cargar todo el producto. Las colecciones de Magentos son muy poderosas e inteligentes.
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('entity_id', $product->getId());
$collection->addAttributeToSelect('manufacturer');
$product = $collection->getFirstItem();
$manufacturer = $product->getAttributeText('manufacturer');
En el momento en que llame a getFirstItem (), la consulta se ejecutará y el producto resultante es mínimo:
[status] => 1
[entity_id] => 38901
[type_id] => configurable
[attribute_set_id] => 9
[manufacturer] => 492
[manufacturer_value] => JETTE
[is_salable] => 1
[stock_item (Varien_Object)] => Array
(
[is_in_stock] => 1
)
Este funciona
echo $_product->getData('ATTRIBUTE_NAME_HERE');
$orderId = 1; // YOUR ORDER ID
$items = $block->getOrderItems($orderId);
foreach ($items as $item) {
$options = $item->getProductOptions();
if (isset($options['options']) && !empty($options['options'])) {
foreach ($options['options'] as $option) {
echo 'Title: ' . $option['label'] . '<br />';
echo 'ID: ' . $option['option_id'] . '<br />';
echo 'Type: ' . $option['option_type'] . '<br />';
echo 'Value: ' . $option['option_value'] . '<br />' . '<br />';
}
}
}
todas las cosas que usará para recuperar el pedido del carrito de opciones personalizadas de productos de valor en Magento 2: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html
Podría escribir un método que lo haría directamente a través de sql, supongo.
Se vería algo como esto:
Variables:
$store_id = 1;
$product_id = 1234;
$attribute_code = 'manufacturer';
Consulta:
SELECT value FROM eav_attribute_option_value WHERE option_id IN (
SELECT option_id FROM eav_attribute_option WHERE FIND_IN_SET(
option_id,
(SELECT value FROM catalog_product_entity_varchar WHERE
entity_id = '$product_id' AND
attribute_id = (SELECT attribute_id FROM eav_attribute WHERE
attribute_code='$attribute_code')
)
) > 0) AND
store_id='$store_id';
Sin embargo, tendría que obtener el valor de la tabla correcta según el backend_type del atributo (campo en eav_attribute), por lo que se necesita al menos 1 consulta adicional.
Si tiene un atributo text / textarea llamado my_attr, puede obtenerlo de la siguiente manera:
product->getMyAttr();