2011-08-18 26 views
7

tôi có một loạt các mã thuộc tính mà tôi cần phải nhận được các giá trị của:Có cách nào đơn giản hơn để nhận giá trị giao diện người dùng của thuộc tính không?

$attributes = array(
    'Category'   => 'type', 
    'Manufacturer'  => 'brand', 
    'Title'    => 'meta_title', 
    'Description'  => 'description', 
    'Product Link'  => 'url_path', 
    'Price'    => 'price', 
    'Product-image link' => 'image', 
    'SKU'    => 'sku', 
    'Stock'    => 'qty', 
    'Condition'   => 'condition', 
    'Shipping cost'  => 'delivery_cost'); 

Sau khi lặp lại thông qua một bộ sưu tập sản phẩm tôi nhận được các giá trị frontend của các thuộc tính như sau:

$attributeId = Mage::getResourceModel('eav/entity_attribute') 
    ->getIdByCode('catalog_product', $attribute_code); 
$attribute = Mage::getModel('catalog/resource_eav_attribute') 
    ->load($attributeId); 
$value = $attribute->getFrontend()->getValue($product); 

Simply sử dụng $product->getDate($attribute) sẽ không hoạt động với danh sách thả xuống và nhiều lựa chọn, nó chỉ trả về id của chúng chứ không phải giá trị giao diện người dùng của chúng.

Trong khi mã ở trên hoạt động, có vẻ như đó là một chặng đường dài để nhận giá trị, nhưng quan trọng hơn là nó chạy khá chậm. Có cách nào nhanh hơn/hợp lý hơn để nhận giá trị giao diện người dùng cho thuộc tính sản phẩm không?

Sửa
bây giờ tôi có như sau (sau khi đối phó với trường hợp đặc biệt như imageqty) được dễ dàng hơn một chút trên mắt và dường như để chạy nhanh hơn (mặc dù tôi không biết tại sao):

$inputType = $product->getResource() 
        ->getAttribute($attribute_code) 
        ->getFrontend() 
        ->getInputType(); 

switch ($inputType) { 
case 'multiselect': 
case 'select': 
case 'dropdown': 
    $value = $product->getAttributeText($attribute_code); 
    if (is_array($value)) { 
     $value = implode(', ', $value); 
    } 
    break; 
default: 
    $value = $product->getData($attribute_code); 
    break; 
} 

$attributesRow[] = $value; 

Nếu bất cứ ai có thể cải thiện điều này (làm cho nó đơn giản/hiệu quả hơn), vui lòng đăng câu trả lời.

+2

Hãy xem bài viết này http://blog.chapagain.com.np/magento-how-to-get-attribute-name-and- value/ –

+1

Xin cảm ơn, bài viết hữu ích. – Jamie

Trả lời

11

Đối với danh sách thả xuống và nhiều lựa chọn và chỉ với các sản phẩm (đây không phải là thủ thuật EAV chung), bạn có thể sử dụng getAttributeText().

$value = $product->getAttributeText($attribute_code); 
+0

Cảm ơn bạn đã chỉ ra điều đó. Tôi đã tự hỏi làm thế nào nó là phương pháp đó làm việc trên một số thuộc tính và không phải những người khác. – Jamie

0

Nó phụ thuộc vào cách bạn đã thiết lập các thuộc tính (là nó thể truy cập từ các bối cảnh mà bạn đang cố gắng để đạt được nó?), Nhưng cách đơn giản nhất thường là như thế này (đối với meta_title, ví dụ):

$product->getMetaTitle() 
+0

Cảm ơn, nhưng một số thuộc tính có thể không truy cập được bằng phương thức ma thuật getter. – Jamie

3

Trong phiên bản 1.7, $product->getAttributeText($attribute_code) không hoạt động đối với tôi trên trang sản phẩm. Lúc đầu, tôi nghĩ đó là vì thuộc tính không có trong chỉ mục catalog_product_flat. Nhưng hóa ra là thuộc tính đã có. Trong mọi trường hợp, mã sau hoạt động cho tôi. Tôi thử mã đơn giản, sau đó quay trở lại mã EAV.

Vì vậy, tôi đang sử dụng mã như thế này:

$value = $product->getAttributeText($attribute_code); // first try the flat table? 
if(empty($value)) { // use the EAV tables only if the flat table doesn't work 
    $value = $product->getResource()->getAttribute($attribute_code)->getFrontend()->getValue($product); 
} 
+1

Tôi đã truy xuất tập hợp các sản phẩm và thực hiện 'getValue ($ product)' đã trả về '' Không '. Tôi đã thay đổi '$ product' thành' Mage :: getModel ('catalog/product') -> load ($ product-> getEntityId()) 'và nhận một sản phẩm có phương thức sẽ đi đến cơ sở dữ liệu. Nếu không, mã sẽ cố lấy dữ liệu từ mảng giá trị nội bộ của nó. Trong những trường hợp bình thường, tôi hy vọng mã trên chỉ hoạt động tốt. – pavlindrom

Các vấn đề liên quan