2012-05-22 33 views
5

Tôi muốn thay đổi và lưu cấu hình của tiện ích con từ bên trong mã của tiện ích. Tôi đang tìm một cái gì đó như thế này:Magento: Lập trình thay đổi cấu hình của tiện ích

class My_Module_Block_Widget 
    extends Mage_Catalog_Block_Product_List 
    implements Mage_Widget_Block_Interface 
{ 
    // ... 
    protected function _beforeToHtml() 
    { 
     // ... 
     if(/* data needs to be changed */) 
     { 
      // assuming "widget_config_data" to be one of the widget's 
      // parameters configured in the etc/widget.xml file of my module 
      $this->setData("widget_config_data", "New Data"); 
      $this->save(); 
     } 
     // ... 
    } 
    // ... 
} 

Vì các tiện ích không có kiểu, chúng không có phương thức save(). Vậy làm cách nào tôi có thể lưu dữ liệu đã thay đổi của tiện ích con?

Trả lời

10

Điều đó sẽ phức tạp và có thể có liên quan nhiều hơn đến một câu hỏi Stack Overflow duy nhất. Đây là một số nền tảng để giúp bạn bắt đầu. Lớp/đối tượng mà bạn đang xử lý ở trên là một lớp khối. Các khối được sử dụng để hiển thị HTML. Họ là, như bạn đã lưu ý, không quốc tịch.

Khối nhận dữ liệu từ đối tượng mô hình đối tượng tiện ích.

Mage::getModel('widget/widget_instance'); 
Mage_Widget_Model_Widget_Instance 

Nhà nước cho các đối tượng (các dữ liệu bạn đang cố gắng để thay đổi) nằm ở bảng widget_instance

Vấn đề là, một đối tượng khối không biết gì về đối tượng dụ widget. Các widget được chèn vào bố cục trang với các bố trí bố trí đặc biệt được lưu trữ trong cơ sở dữ liệu (đó là quá đơn giản, vì bạn có thể viết a book trên hệ thống bố trí). Lý do phụ tùng dụ của bạn xuất hiện trên một trang là bởi vì cách bố trí trang ấy được cập nhật với một cái gì đó thông tin như thế này

<reference name="content"> 
    <block type="cms/widget_page_link" name="48fc761f38fa9838fcc3a3b498c47f72" template="cms/widget/link/link_block.phtml"> 
     <action method="setData"> 
      <name>anchor_text</name> 
      <value>asdfasdfsad</value> 
     </action> 
     <action method="setData"> 
      <name>title</name> 
      <value>asdfasdfasdfasd</value> 
     </action> 
     <action method="setData"> 
      <name>page_id</name> 
      <value>2</value> 
     </action> 
    </block> 
</reference> 

Không có tham chiếu đến id dụ widget, có nghĩa là bạn không thể tải các đối tượng dụ.

Về lý thuyết, bạn có thể thử tải phiên bản tiện ích con dựa trên giá trị tham số, vì các giá trị được lưu trữ trong cơ sở dữ liệu. Tuy nhiên, chúng được lưu trữ trong cột widget_paramater, với một chuỗi được tuần tự hóa. Điều đó có nghĩa là bạn không thể sử dụng SQL hoặc các bộ lọc mô hình để truy vấn nó. Bạn sẽ phải tải tất cả các phiên bản widget của một loại cá thể cụ thể/chủ đề/cửa hàng, và sau đó tự foreach cho đến khi bạn tìm thấy đúng đối tượng. Điều này có thể được thực hiện cho một số lượng nhỏ các widget, nhưng sẽ nhanh chóng trở thành không thực hiện cho một số lượng lớn các widget. Ngoài ra, điều này sẽ không được bảo đảm để làm việc, vì nó có thể (mặc dù không) rằng các giá trị của các thông số vật dụng của bạn có thể đã được thay đổi bởi mã cập nhật bố trí khác.

Cách tiếp cận tốt hơn, (và tốn thời gian hơn) là viết lại mã chèn tiện ích để nó bao gồm một id trang trong XML cập nhật bố cục. Điều này sẽ chuyển id cá thể tới mã khối tiện ích, cho phép bạn khởi tạo đối tượng đối tượng widget và lưu nó. Bạn cũng có thể thêm trường vào một tiện ích có lớp tùy chỉnh sẽ luôn lưu id cá thể.

Chúc may mắn!

+1

Điều này thực sự rất hữu ích! Nó khiến tôi xem xét lại kế hoạch của mình cho tiện ích cụ thể đó và sau khi cân nhắc công việc cần thiết và lợi ích của nó, tôi đã quyết định rằng nó không đáng giá và tôi sẽ triển khai tiện ích theo cách khác. Tôi nghĩ rằng nó sẽ là tuyệt vời nếu các nhà phát triển Magento bao gồm chức năng để thay đổi cấu hình của một widget từ bên trong widget trong một bản phát hành trong tương lai. – Subsurf

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