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?
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?
Câu trả lời:
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Một cách mà tôi biết:
$product->getResource()->getAttribute($attribute_code)
->getFrontend()->getValue($product)
$product
hai lần?
bạn có thể dùng
<?php echo $product->getAttributeText('attr_id') ?>
$product->getData('my_name')
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 select
hoặ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;
}
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).
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);
Thử đi
$attribute = $_product->getResource()->getAttribute('custom_attribute_code');
if ($attribute)
{
echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
}
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
)
Cái này hoạt động-
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 />';
}
}
}
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
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.
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();