Spree Checkout - Remove Step

2020-07-19 03:42发布

I am trying to remove 2 checkout steps. I have tried to follow the documentation in the site http://guides.spreecommerce.com/checkout.html but still nothing happens.

I am using Spree 1.1.2 ruby 1.9.2p318 Rails 3.2.6 Ubuntu 12.04 (precise) 32-bit

I'll tell you what I have done and you will tell me what to fix. Should I change the name or location of the file? Or should I change other files too? How can I debug it?

I have created a new file "app/models/spree/order_decorator.rb" (also tried it under "app/models/order_decorator.rb")

module SpreeCustomExtension

  class Engine < Rails::Engine

    def self.activate

      Spree::Order.class_eval do



        StateMachine::Machine.ignore_method_conflicts = true   # I HAVE ADDED THOSE 2 LINES LATER, HOPING IT WOULD HELP ME,

        Spree::Order.state_machines.clear                                # IT DIDN'T.



        # customize the checkout state machine

        Order.state_machines[:state] = StateMachine::Machine.new(Order, :initial => 'cart') do

          after_transition :to => 'complete', :do => :complete_order

          before_transition :to => 'complete', :do => :process_payment

          event :next do

            transition :from => 'cart', :to => 'payment'

            transition :from => 'payment', :to => 'complete'

          end



          event :cancel do

            transition :to => 'canceled', :if => :allow_cancel?

          end

          event :return do

            transition :to => 'returned', :from => 'awaiting_return'

          end

          event :resume do

            transition :to => 'resumed', :from => 'canceled', :if => :allow_resume?

          end

          event :authorize_return do

            transition :to => 'awaiting_return'

          end



          before_transition :to => 'complete' do |order|

            begin

              order.process_payments!

            rescue Core::GatewayError

              !!Spree::Config[:allow_checkout_on_gateway_error]

            end

          end



          before_transition :to => ['delivery'] do |order|

            order.shipments.each { |s| s.destroy unless s.shipping_method.available_to_order?(order) }

          end



          after_transition :to => 'complete', :do => :finalize!

          after_transition :to => 'delivery', :do => :create_tax_charge!

          after_transition :to => 'payment',  :do => :create_shipment!

          after_transition :to => 'resumed',  :do => :after_resume

          after_transition :to => 'canceled', :do => :after_cancel 

        end



      end

    end

  end

end

Then I tried the same file with different code, still nothing happened


Spree::Order.class_eval do 



  StateMachine::Machine.ignore_method_conflicts = true 

  Spree::Order.state_machines.clear 



  state_machine :initial => 'cart', :use_transactions => false do 



    event :next do 

      transition :from => 'cart',     :to => 'payment', :if => :payment_required? 

      transition :from => 'cart',     :to => 'complete' 

      transition :from => 'confirm',  :to => 'complete' 



      # note: some payment methods will not support a confirm step 

      transition :from => 'payment',  :to => 'confirm', 

                                      :if => Proc.new { |order| order.payment_method && order.payment_method.payment_profiles_supported? } 



      transition :from => 'payment', :to => 'complete' 

    end 



    event :cancel do 

      transition :to => 'canceled', :if => :allow_cancel? 

    end 

    event :return do 

      transition :to => 'returned', :from => 'awaiting_return' 

    end 

    event :resume do 

      transition :to => 'resumed', :from => 'canceled', :if => :allow_resume? 

    end 

    event :authorize_return do 

      transition :to => 'awaiting_return' 

    end 



    before_transition :to => 'complete' do |order| 

      begin 

        order.process_payments! 

      rescue Core::GatewayError 

        if Spree::Config[:allow_checkout_on_gateway_error] 

          true 

        else 

          false 

        end 

      end 

    end 



    before_transition :to => ['delivery'] do |order| 

      order.shipments.each { |s| s.destroy unless s.shipping_method.available_to_order?(order) } 

    end 



    after_transition :to => 'complete', :do => :finalize! 

    after_transition :to => 'delivery', :do => :create_tax_charge! 

    after_transition :to => 'payment',  :do => :create_shipment! 

    after_transition :to => 'resumed',  :do => :after_resume 

    after_transition :to => 'canceled', :do => :after_cancel 



  end 



end 

4条回答
虎瘦雄心在
2楼-- · 2020-07-19 03:57

OK, so I have finally found it -
Spree have released a new version #1.2.0 with a major fix for this exact problem.

Spree 1.2.0 Release Notes

The checkout process has always been hard to customize within Spree, and that has generated complaints in the past. We are pleased to report in the 1.2 release of Spree that this has been substaintially easier...

So the solution now is quit easy -
Just undo all your previous checkout manipulation attempts,
upgrade spree to 1.2.0 by updating your gem file and bundle install,
handle all your code breakups by following their documentation (I guess you'll have some).
and create a simple order_decorator.rb under app/models/spree/

Spree::Order.class_eval do
  checkout_flow do
    go_to_state :address
    go_to_state :payment, :if => lambda { |order| order.payment_required? }
    go_to_state :confirm, :if => lambda { |order| order.confirmation_required? }
    go_to_state :complete
  end

  # If true, causes the payment step to happen during the checkout process
  def payment_required?
    return false
  end

  # If true, causes the confirmation step to happen during the checkout process
  def confirmation_required?
    return true
  end

end

enjoy.

查看更多
成全新的幸福
3楼-- · 2020-07-19 03:59

In spree >= 2.0.0 you can use following helper method to remove any checkout step. Follow the steps given below.

Step 1: in app/models/spree/ create new file with name order_decorator.rb

Step 2: Copy and paste following code in it.

Spree::Order.class_eval do
#replace :delivery to any other state 
remove_checkout_step :delivery  
end 

Thanks to spree community. http://guides.spreecommerce.com/developer/

查看更多
我想做一个坏孩纸
4楼-- · 2020-07-19 03:59

It works with the new fork of Spree Solidus also

查看更多
对你真心纯属浪费
5楼-- · 2020-07-19 04:11

Default checkout Steps in Spree

  1. Address
  2. Delivery
  3. Payment
  4. Confirm

Spree(2.0) allows you to modify checkout process to add or remove steps by using respective helpers.

insert_checkout_step
remove_checkout_step

Need to remember that remove_checkout_step will remove just one checkout step at a time:

查看更多
登录 后发表回答