Spree Extension - Xây dựng tiện ích mở rộng cho Spree

**1. Khái niệm **

Spree Extensions là những tiện ích cho phép người sử dụng có thể tùy biến hệ thống Spree Ecommerce theo ý riêng của mình. Nhà phát triển có thể dễ dàng tái sử dụng mã nguồn cũng như chia sẻ chúng.

Sở dĩ có thể làm được điều này là vì Spree cho phép người dùng có thể customize codes ở cả Model, Controller và View, qua đó người dùng có thể ghi đè nội dung (override), giản lược bớt các chức năng, hay thay đổi luồng xử lý mà trước nay Spree để mặc định, nhằm làm đơn giản hóa hệ thống cũng như tiện lợi cho người dùng.

**2. Spree Customization **

2.1 Override View

Có hai cách để người dùng có thể customize view:

  • Deface: Deface là thư viện dành cho Rails, cho phép chèn hoặc ghi đè vào các file *.erb mà không cần phải sửa đổi trực tiếp trên file đó.
    Deface::Override.new(:virtual_path => "spree/products/show",
    :name => "add_submit_review_button",
    :insert_after => "[data-hook='product_properties']"
    :partial => "spree/shared/reviews")
Câu lệnh trên được thực hiện sẽ chèn thêm Review button phía sau khối lệnh data-hook
  • Template Replacement Trường hợp người dùng muốn thay thế cả tập tin. Trong trường hợp này Deface trở nên rườm rà và khó thao tác. Trong trường hợp này ta chỉ việc đặt tên tập tin trùng với tập tin cần thay thế.

2.2 Extending Model và Controller

Chúng ta có thể chèn thêm các method tự định nghĩa vào trong model hoặc controller có sẵn mà không cần phải sửa trực tiếp trong model hoặc controller đó. Việc cần làm là add thêm một file model_decorator hoặc controller_decorator rồi thực hiện các thay đổi bên trong các file đó.

  • Thêm method vào trong model product.rb
# Thêm mới 1 file product_decorator.rb có nội dung như sau
Spree::Product.class_eval do
  def minimum_met?
    return true if self.minimum_order_count.blank?
    self.current_order_count >= self.minimum_order_count
    end
  end
  • Thêm mới một method trong controller product
 Spree::ProductsController.class_eval do
      before_filter :get_collection_products, :only => :show
      private
      def get_collection_products
        @collection_products ||=object.collection.products.not_deleted
      end
 end

**3. Xây dựng Extension Spree Review **

  • Tạo spree review extension
    spree extension reviews

Lệnh này sẽ tạo một thư mục spree_reviews với các thư mục và thư viện bổ sung bên trong. Screenshot from 2015-09-25 19:36:44.png

Cấu trúc bên trong thư mục spree_reviews cũng có đầy đủ MVC giống như một Rails app thông thường.

  • Generate a resource
 	rails g resource spree/review
  • Sử dụng Deface để chèn review link vào product page
 #app/overrides/add_reviews_after_product_properties.rb
Deface::Override.new(:virtual_path => "spree/products/show",
                        :name => "add_submit_review_link",
                        :insert_after => "[data-hook='product_properties'],#product_properties[data-hook]"
                        :partial => "spree/shared/reviews")

Để application của bạn load extension vừa tạo thì cần add đường dẫn của extension đó vào trong Gemfile

     gem 'spree_reviews', :path => './spree_reviews'

Chạy bundle và khởi động lại rails sẽ thấy button "Write Your Own Review" được chèn vào dưới produc properties.

Screenshot from 2015-09-25 22:47:12.png

  • Tạo mới reviews

    Thiết lập relationship relationship giữa table reviews và products bằng file*decorator.rb

  #app/models/spree/product_decorator.rb
  	Spree::Product.class_eval do
    	has_many :reviews
    end

Sau đó xây dựng các action tạo mới, hiển thị thông tin reviews bên trong extension giống như mô hình CRUD thông thường.

**4. Kết luận **

Trong bài viết này đề cập đến việc người dùng có thể tác động vào Spree nhằm thay đổi bussiness cho phù hợp với mục đích sử dụng cũng như mở rộng nâng cấp thêm những tác vụ khác cho hệ thống. Sử dụng extension để tùy biến hệ thống sẽ tránh được rủi ro khi nâng cấp phiên bản Spree bởi chúng ta gián tiếp thay đổi nội dung thông qua các hàm deface và decorate thay vì thao tác trực tiếp trên code của Spree.