Thuộc tính sản phẩm Magento Nhận giá trị


82

Làm cách nào để nhận giá trị thuộc tính sản phẩm cụ thể nếu tôi biết ID sản phẩm mà không cần tải toàn bộ sản phẩm?


1
Không phải là một câu trả lời tuyệt vời, nhưng bạn có thể tạo ra một mô hình truy vấn các bảng thích hợp trực tiếp :)
Joseph Mastey

Câu trả lời:


141
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);

1
làm thế nào để có được văn bản tùy chọn này? có ai biết không
Dreaded dấu chấm phẩy

2
Đối với những người mà nó quan trọng: phương pháp này chỉ có sẵn trong 1.6 +
JMTyler

40

Một cách mà tôi biết:

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)

3
Cảm ơn. Đó là những gì tôi đang tìm kiếm.
Ricardo Martins,

4
Tôi mới sử dụng magento .. tại sao lại sử dụng $producthai lần?
Mr_Green

28
@Mr_Green Vì đây là Magento. Không có 'tại sao' nhận được một câu trả lời hợp lý.
nakajuice

@Mr_Green, điều này không có nghĩa là sử dụng nó hai lần: dòng thứ hai là sự tiếp nối của dòng đầu tiên. Bạn đang gọi getFrontend () trên đối tượng được trả về bởi getAttribute ().
Scott Buchanan

26

bạn có thể dùng

<?php echo $product->getAttributeText('attr_id')  ?> 

2
mã này hoạt động tốt. Tôi đã tìm kiếm nhiều blog nhưng không có mã nào phù hợp với tôi ngoại trừ điều này. Thực sự tốt đẹp.
Patel Dixit

3
mã này chỉ hoạt động khi các mô hình sản phẩm có chứa các giá trị thuộc tính, khi bạn biết chỉ id sản phẩm nó sẽ không làm việc
Jiří Chmiel

1
Điều này hoạt động đối với các thuộc tính như danh sách thả xuống nhưng nếu thuộc tính là một trường văn bản đơn giản thì cần một hàm khác. Giả sử thuộc tính là my_name thì mã trở thành $ product-> getMyName ()
Ken

1
@Ken, nếu bạn cần lấy thuộc tính động từ sản phẩm, thì bạn có thể sử dụng$product->getData('my_name')
pavlindrom

Và liệu chúng ta có nhận được Id tùy chọn không? $ product-> getAttributeId ('attr_id') ???
snh_nl

9

Vui lòng xem câu trả lời của Daniel Kocherga , vì nó sẽ phù hợp với bạn trong hầu hết các trường hợp.

Ngoài phương thức đó để nhận giá trị của thuộc tính, đôi khi bạn có thể muốn lấy nhãn của a selecthoặc multiselect. Trong trường hợp đó, tôi đã tạo phương thức này mà tôi lưu trữ trong một lớp trợ giúp:

/**
 * @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;
}

8

Có vẻ như không thể nhận được giá trị mà không tải mô hình sản phẩm. Nếu bạn xem file app / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php, bạn sẽ thấy phương thức

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

Như bạn có thể thấy, phương thức này yêu cầu đối tượng được tải để lấy dữ liệu từ nó (dòng thứ 3).


5

Trước tiên, chúng ta phải đảm bảo rằng thuộc tính mong muốn được tải và sau đó xuất ra. Dùng cái này:

$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);

4

Thử đi

 $attribute = $_product->getResource()->getAttribute('custom_attribute_code');
    if ($attribute)
    {
        echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
    }

2

Bạn không phải tải toàn bộ sản phẩm. Bộ sưu tập của Magentos rất mạnh mẽ và thông minh.

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('entity_id', $product->getId());
$collection->addAttributeToSelect('manufacturer');
$product = $collection->getFirstItem();
$manufacturer = $product->getAttributeText('manufacturer');

Tại thời điểm bạn gọi getFirstItem (), truy vấn sẽ được thực thi và sản phẩm kết quả là rất nhỏ:

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

1

Cái này hoạt động-

echo $_product->getData('ATTRIBUTE_NAME_HERE');

2
Câu hỏi là "không tải toàn bộ sản phẩm".
Denis Óbukhov

0

Bạn có thể lấy giá trị thuộc tính bằng cách sau

$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);

-1

$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 />';
        }
    }
}

tất cả những thứ bạn sẽ sử dụng để truy xuất đơn đặt hàng giỏ hàng tùy chọn sản phẩm có giá trị trong Magento 2: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html


-2

Tôi cho rằng bạn có thể viết một phương thức thực hiện điều đó trực tiếp qua sql.

Sẽ trông giống như thế này:

Biến:

$store_id = 1;
$product_id = 1234;
$attribute_code = 'manufacturer';

Truy vấn:

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

Tuy nhiên, bạn sẽ phải lấy giá trị từ bảng chính xác dựa trên backend_type của thuộc tính (trường trong eav_attribute), vì vậy cần ít nhất 1 truy vấn bổ sung.


Cảm ơn! Có vẻ tốt, nhưng không phải tất cả các thuộc tính đều là varchar và 3 lựa chọn bao gồm không tốt. Có lẽ tốt hơn nên sử dụng tham gia?
Denis Óbukhov

Tôi có thể sai, nhưng theo như tôi biết thì không có sự khác biệt lớn giữa chọn và nối vì chúng được tối ưu hóa bởi bộ xử lý truy vấn. Nhưng liên quan đến việc không phải tất cả các thuộc tính đều là varchar, trước tiên bạn cần lấy backend_type của thuộc tính mà bạn muốn lấy và sau đó sử dụng bảng sprintf ('catalog_product_entity_% s', $ backend_type) ^^. Nhưng cũng không thể lấy được các loại khác bằng cách sử dụng FIND_IN_SET, vì vậy bạn cũng sẽ phải tìm thứ gì đó cho điều đó. Chúc may mắn!
Lucas Moeskops

-2

Nếu bạn có thuộc tính text / textarea có tên my_attr, bạn có thể lấy nó bằng cách: product->getMyAttr();


Tôi đã hỏi "mà không tải toàn bộ sản phẩm"
Denis Óbukhov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.