簡體   English   中英

使用Shopify腳本編輯器按標簽設置靜態價格

[英]Use Shopify Script Editor to Set Static Price by Tag

我已經研究了類似的問題和解決方案,但我無法讓他們與我合作。 我需要將一堆產品設置為50美元的靜態價格,我可以申請沒有具體折扣,因為這些產品的實際價格各不相同。 這是我到目前為止的代碼:

class StaticPrice

  def initialize(selector)
    @selector = selector
  end

TagSelector

 class TagSelector

      def initialize(tag)
        @tag = tag
      end

      def match?(line_item)
        line_item.variant.product.tags.include?(@tag)
      end

    end

CAMPAIGNS = [
  StaticPrice.new(
    TagSelector.new("boots"),
    line_item.line_price == (5000), message: "SALE!")
]


Output.cart = Input.cart

**** UPDATE ......好吧,我得到它的工作,但它是非常臃腫,我很確定不專業(菜鳥在這里),但..它工作..這允許我設置基於標簽的產品的靜態價格對於特定的銷售,同時不允許有人使用優惠券從銷售項目中獲得任何額外的價格..我感謝任何改進建議****

case Input.cart.discount_code
when CartDiscount::Percentage
          if  Line_items.quantity > 1
            Input.cart.discount_code.reject(message: "Coupons can not be combined with BOGO promotion")
          end
        end

class ItemCampaign
  def initialize(selector, discount, partitioner)
    @selector = selector
    @discount = discount
    @partitioner = partitioner
  end
  def run(cart)
    applicable_items = cart.line_items.select do |line_item|
      @selector.match?(line_item)
    end
    discounted_items = @partitioner.partition(cart, applicable_items)

    discounted_items.each do |line_item|
      @discount.apply(line_item)
    end
  end
end
class TagSelector
  def initialize(tag)
    @tag = tag
  end
  def match?(line_item)
    line_item.variant.product.tags.include?(@tag)
  end
end
class PercentageDiscount50
  def initialize(percent, message)
    @percent = Money.new(cents: 100) * 50
    @message = message
  end
  def apply(line_item)
    line_discount = line_item.line_price - line_item.line_price + Money.new(cents: 100) * 50
    new_line_price = Money.new(cents: 100) * 50
    line_item.change_line_price(new_line_price, message: @message)
    puts "Discounted line item with variant #{line_item.variant.id} by #{line_discount}."
  end
end
class PercentageDiscount40
  def initialize(percent, message)
    @percent = Money.new(cents: 100) * 40
    @message = message
  end
  def apply(line_item)
    line_discount = line_item.line_price - line_item.line_price + Money.new(cents: 100) * 40
    new_line_price = Money.new(cents: 100) * 40
    line_item.change_line_price(new_line_price, message: @message)
    puts "Discounted line item with variant #{line_item.variant.id} by #{line_discount}."
  end
end
class PercentageDiscount30
  def initialize(percent, message)
    @percent = Money.new(cents: 100) * 30
    @message = message
  end
  def apply(line_item)
    line_discount = line_item.line_price - line_item.line_price + Money.new(cents: 100) * 30
    new_line_price = Money.new(cents: 100) * 30
    line_item.change_line_price(new_line_price, message: @message)
    puts "Discounted line item with variant #{line_item.variant.id} by #{line_discount}."
  end
end
class PercentageDiscount20
  def initialize(percent, message)
    @percent = Money.new(cents: 100) * 20
    @message = message
  end
  def apply(line_item)
    line_discount = line_item.line_price - line_item.line_price + Money.new(cents: 100) * 20
    new_line_price = Money.new(cents: 100) * 20
    line_item.change_line_price(new_line_price, message: @message)
    puts "Discounted line item with variant #{line_item.variant.id} by #{line_discount}."
  end
end
class PercentageDiscount10
  def initialize(percent, message)
    @percent = Money.new(cents: 100) * 10
    @message = message
  end
  def apply(line_item)
    line_discount = line_item.line_price - line_item.line_price + Money.new(cents: 100) * 10
    new_line_price = Money.new(cents: 100) * 10
    line_item.change_line_price(new_line_price, message: @message)
    puts "Discounted line item with variant #{line_item.variant.id} by #{line_discount}."
  end
end
class LowToHighPartitioner
  def initialize(paid_item_count, discounted_item_count)
    @paid_item_count = paid_item_count
    @discounted_item_count = discounted_item_count
  end
  def partition(cart, applicable_line_items)
    sorted_items = applicable_line_items.sort_by{|line_item| line_item.variant.price}
    total_applicable_quantity = sorted_items.map(&:quantity).reduce(0, :+)
    discounted_items_remaining = Integer(total_applicable_quantity / (@paid_item_count + @discounted_item_count) * @discounted_item_count)
    discounted_items = []
    sorted_items.each do |line_item|
      break if discounted_items_remaining == 0
      discounted_item = line_item
      if line_item.quantity > discounted_items_remaining
        discounted_item = line_item.split(take: discounted_items_remaining)
        position = cart.line_items.find_index(line_item)
        cart.line_items.insert(position + 0, discounted_item)
      end
      discounted_items_remaining -= discounted_item.quantity
      discounted_items.push(discounted_item)
    end
    discounted_items
  end
end
CAMPAIGNS = [
  ItemCampaign.new(
    TagSelector.new("SCRIPT50"),
    PercentageDiscount50.new(10, "$50 FINAL SALE!"),
    LowToHighPartitioner.new(0,1),
  ),
  ItemCampaign.new(
    TagSelector.new("SCRIPT40"),
    PercentageDiscount40.new(10, "$40 FINAL SALE!"),
    LowToHighPartitioner.new(0,1),
  ),
    ItemCampaign.new(
    TagSelector.new("SCRIPT30"),
    PercentageDiscount30.new(10, "$30 FINAL SALE!"),
    LowToHighPartitioner.new(0,1),
  ),
    ItemCampaign.new(
    TagSelector.new("SCRIPT20"),
    PercentageDiscount20.new(10, "$20 FINAL SALE!"),
    LowToHighPartitioner.new(0,1),
  ),
    ItemCampaign.new(
    TagSelector.new("SCRIPT10"),
    PercentageDiscount10.new(10, "$10 FINAL SALE!"),
    LowToHighPartitioner.new(0,1),
  )
]
CAMPAIGNS.each do |campaign|
  campaign.run(Input.cart)
end
Output.cart = Input.cart

在實例化新的StaticPrice對象時,您將發送3個屬性,但您的對象只接受該屬性。 你實例化TagSelector,但你從不使用匹配? 方法。

如果不了解更多,看到更多,並且有更多解釋,那么您提供的代碼量就沒那么大了。

為什么不迭代購物車,並設定價格。 這是微不足道的,不涉及復雜的對象。 嘗試使用更簡單的代碼,並在獲得信心時構建更有條理的方法。 在您實際擁有一些顯示需要它們的工作腳本代碼之前,幾乎不需要使用StaticPrice和TagSelector。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM