2011-06-26 23 views
7

Có một số trường hợp tôi được giao một mẫu chỉ chứa một số dữ liệu tôi yêu cầu, ví dụ: catalog/product trường hợp không chứa các thuộc tính nhất định mà tôi có thể cần sử dụng, như kích thước, số phụ tùng hoặc đo vòng eo.Lấy dữ liệu bổ sung từ các mô hình Magento đã tải

Để giảm bớt này, lựa chọn hiện tại của tôi là:

  • Tạo một khối mới, và tải các thuộc tính cần thiết bằng tay sử dụng addAttributeToSelect($name).
  • Tải toàn bộ mô hình trong mẫu bằng ID từ mô hình hiện tại, không đầy đủ, mô hình, ví dụ: Mage::getModel('catalog/product')->getId($product->getId()).

Đối với câu hỏi của tôi: có cách nào tôi có thể chọn các thuộc tính bổ sung mà tôi muốn tải trong bộ sưu tập mô hình sau khi ->load() được gọi không? Ngoài ra, có một phương pháp để làm điều này trên các mô hình cá nhân?

+0

đã bạn cố kỹ thuật của phản ánh như Ivan gợi ý trong câu hỏi này? http://stackoverflow.com/questions/5673093/sort-magento-collection-after-load Hoặc có thể là phương thức setDataToAll của Varien_Data_Collection? – OSdave

+2

Khi tôi nhận được một sản phẩm có dữ liệu bị thiếu, thông thường nó nằm trên trang danh mục nơi một số thuộc tính được loại trừ một cách có chủ ý. Để tránh việc chỉnh sửa thuộc tính từ quản trị viên và thay đổi nó "Được sử dụng trong Danh sách sản phẩm" thành "Có". – clockworkgeek

+0

@clockworkgeek: Đó có phải là giải pháp mục đích chung, như trong, là tùy chọn thuộc tính "Được sử dụng trong Danh sách sản phẩm" bị đánh dấu sai và đánh dấu "Có" sẽ thêm nó vào danh sách chọn thuộc tính mặc định của bộ sưu tập không? – Nick

Trả lời

5

Cách tiếp cận đúng và an toàn nhất (nhưng không tốt nhất - xem bên dưới) được mô tả trong câu hỏi - đó là tải sản phẩm một lần nữa.

Có không đã phát triển phương pháp để thêm nhiều thuộc tính, sau khi sản phẩm được nạp, vì nhiều lý do:

1) Trong mẫu đời rất nhiều giá trị của nó được tính toán và lưu trữ bên trong Model. Qua đó bổ sung thêm các thuộc tính (ví dụ giá) sẽ thay đổi trạng thái của Model, nhưng sẽ không ảnh hưởng đến kết quả của một số phương thức, được thiết kế để trả về các giá trị thuộc tính này (ví dụ getPrice()), nhưng nội bộ thực hiện thêm một số tiền xử lý và phụ thuộc vào tính toán trước đó dữ liệu.

2) Trạng thái của mô hình sẽ không nhất quán, vì một số phương thức sẽ trả về giá trị được lưu trong bộ nhớ cache và hiện không hợp lệ, được tính trên thuộc tính trống trước đó, trong khi một số phương thức khác sẽ trả về giá trị không được lưu trong bộ nhớ cache. Vì vậy, việc sử dụng Mô hình như vậy sẽ không an toàn và các thuộc tính của nó sẽ không thể đoán trước được.

3) Tính phức tạp của mã để hỗ trợ tải lại như vậy là khá lớn.

Solutions

1) Các giải pháp tốt đầu tiên (mặc dù là nặng nhất một) là để tải sản phẩm một lần nữa, mỗi lần khối/mô hình của bạn/helper cần mở rộng tập hợp các thuộc tính trong đó.

2) Giải pháp tốt hơn - là tải bộ sưu tập mới với tất cả các sản phẩm có tất cả thuộc tính bổ sung, bất cứ khi nào bạn thấy, các thuộc tính này sẽ được yêu cầu và bộ sưu tập gốc không có chúng.

3) Giải pháp tốt nhất - là tải bộ sưu tập sản phẩm gốc với tất cả các thuộc tính bắt buộc. Đôi khi các bộ sưu tập thực sự tải các sản phẩm có chứa các thuộc tính có thể - chủ yếu là mã kế thừa cho tối ưu hóa EAV (bây giờ các bảng phẳng được bật 'theo mặc định và tối ưu hóa này là không cần thiết) hoặc có thể khi bộ sưu tập được tải bởi công cụ tìm kiếm (ví dụ: Solr trong Magento EE), theo mặc định, không lưu trữ tất cả các thuộc tính trong hồ sơ của nó.

3.1) Bạn có thể thêm các thuộc tính cần thiết để bộ sưu tập ban đầu tại nơi, nơi nó được khởi tạo - thông qua đề cập trong câu hỏi addAttributeToSelect($attributeNames) phương pháp

3.2) Bạn có thể thêm các thuộc tính của bạn vào danh sách các thuộc tính, tự động đưa vào một bộ sưu tập.Thuộc tính danh sách khác nhau từ mô-đun để mô-đun, và chúng được lưu trữ ở những nơi khác nhau. Một số là trong cấu hình, những người khác - trong cơ sở dữ liệu. Vị trí bê tông (bảng cấu hình hoặc db), nơi để thêm các thuộc tính cho dân số tự động, phụ thuộc vào trường hợp cụ thể của bạn.

4) Đôi khi, khi bạn chỉ cần giá trị thuộc tính, có thể viết mô hình tài nguyên dễ dàng hơn và nhanh hơn, sẽ trực tiếp tải chúng từ DB theo productIds và phạm vi storeId hiện tại. Sau đó, bạn có thể mạo hiểm đặt chúng làm tài sản cho Sản phẩm trong bộ sưu tập hoặc đặt chúng an toàn thành Sản phẩm là thuộc tính myAdditionalAttribuesValuesArray hoặc sử dụng làm mảng độc lập, được ánh xạ tới id sản phẩm.

-1

Ngoài ra còn có một cách khác, có lẽ không phải là giải pháp tốt nhất, bằng cách chỉnh sửa tệp lõi magento tại "mã/lõi/Mage/Danh mục/Chặn/Sản phẩm/View.php". Nhưng theo cách này, bạn sẽ có quyền truy cập vào các thuộc tính bổ sung trong trang Xem sản phẩm của bạn.

Thêm vào đoạn mã sau:

public function getAdditionalData(array $excludeAttr = array()) 
{ 
    $data = array(); 
    $product = $this->getProduct(); 
    $attributes = $product->getAttributes(); 
    foreach ($attributes as $attribute) { 

     if ($attribute->getIsVisibleOnFront() && !in_array($attribute->getAttributeCode(), $excludeAttr)) { 
      $value = $attribute->getFrontend()->getValue($product); 

      if (!$product->hasData($attribute->getAttributeCode())) { 
       $value = Mage::helper('catalog')->__('N/A'); 
      } elseif ((string)$value == '') { 
       $value = Mage::helper('catalog')->__('No'); 
      } elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) { 
       $value = Mage::app()->getStore()->convertPrice($value, true); 
      } 

      if (is_string($value) && strlen($value)) { 
       $data[$attribute->getAttributeCode()] = array(
        'label' => $attribute->getStoreLabel(), 
        'value' => $value, 
        'code' => $attribute->getAttributeCode() 
       ); 
      } 
     } 
    } 
    return $data; 
} 

Sau đó, trong mẫu Catalogue của bạn/sản phẩm/View.phtml:

<?php if($_additional = $this->getAdditionalData()): ?> 
    <?php foreach ($_additional as $_data): ?> 
     <tr> 
      <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th> 
      <td class="data"><?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?></td> 
     </tr> 
    <?php endforeach; ?> 
<?php endif; ?> 
+1

Chỉnh sửa lõi không bao giờ nên là một giải pháp. – bluefear

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