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.
đã 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
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
@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