Чи то я сліпий вже такий, чи то старість, а може воно є, а я його не знайшов, але така базова річ як сповіщення адміністратора(відповідальної особи) на email в інтернет магазині при створенні нового замовлення мала б бути да хоть гвіздями вбита в код. Але в Spree не бачу і шо тут скажеш….
Приклад реалізації в одному з проектів на Spree: сповіщення усіх юзерів хто має роль адміністратора на email після створення замовлення
app/controllers/spree/orders_controller_decorator.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
def update ... if @order.save @order.bill_address = @order.ship_address @order.completed_at = DateTime.now() @order.state = "complete" @order.save! @order.shipments.destroy_all if @order.type_speed? respond_with(@order) do |format| format.html do if @order.complete? if @order.payments&.first&.payment_method&.type == "Spree::PaymentMethod::Liqpay" redirect_to order_liqpay_path(@order) else send_admins_notification @order redirect_to order_path(@order) end elsif params.has_key?(:checkout) @order.next if @order.cart? redirect_to checkout_state_path(@order.checkout_steps.first) else redirect_to cart_path end end end else respond_with(@order) end end ... private def send_admins_notification order SpreeMailer.order(order).deliver_later respond_to do |format| format.html { } format.js { } end end |
app/mailers/application_mailer.rb
1 2 3 4 5 6 7 8 9 10 11 12 |
class ApplicationMailer < ActionMailer::Base default from: "myemail@gmail.com" layout 'mailer' private def get_admin_users Spree::User.joins(:spree_roles).where(spree_roles: {name: 'admin'}) end end |
app/mailers/spree_mailer.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class SpreeMailer < ApplicationMailer def oneclickbuy phone,names,email,product_id @subject = 'Швидке замовлення' @product = Spree::Product.find(product_id) @phone = phone @name = names @email = email emails = [] get_admin_users.each do |user| emails << user.email end mail(to: emails, subject: @subject) end def order order @order = order @subject = "Нове замовлення ##{order.number}" @products = @order.products @phone = @order.ship_address.phone @name = @order.ship_address.firstname @email = @order.email emails = [] get_admin_users.each do |user| emails << user.email end mail(to: emails, subject: @subject) end end |
app/views/layouts/mailer.html.erb
1 2 3 4 5 6 |
<html> <body> <%= yield %> </body> </html> |
app/views/layouts/mailer.text.erb
1 |
<%= yield %> |
app/views/spree_mailer/oneclickbuy.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> </head> <body> <h1><%= @subject %></h1> <p> <b>Продукція:</b> <%= @product.name %><br> <b>Ім’я:</b> <%= @name %><br> <b>Номер телефону:</b> <%= @phone %><br> <b>email:</b> <%= @email %><br> </p> </body> </html> |
app/views/spree_mailer/order.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<!DOCTYPE html> <html> <head> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> </head> <body> <h1><%= @subject %></h1> <p> <b>Продукція:</b><br> <% @products.each_with_index do |product,index| %> <%= "#{index+1}) #{product.name}"%><br> <% end %> <% if @name.present?%> <b>Ім’я:</b> <%= @name %><br> <% end %> <% if @phone.present?%> <b>Номер телефону:</b> <%= @phone %><br> <% end %> <% if @email.present?%> <b>email:</b> <%= @email %><br> <% end %> <b><%= Spree.t(:total_order) %>:</b><%= @order.display_item_total %><br> <% if @order.shipments&.first&.cost %> <b><%= Spree.t(:total_order_shipment) %>:</b><%= @order.shipments&.first&.cost %><br> <% end %> <b><%= Spree.t(:total_order_summary) %>:</b><%= @order.display_total %><br> </p> </body> </html> |
config/environments/production.rb
1 2 3 4 5 6 7 8 9 10 11 12 |
config.action_controller.perform_caching = true config.action_mailer.perform_deliveries = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: "smtp.sendgrid.net", port: 587, domain: 'sendgrid.com', user_name: 'mylogin', password: 'mypassword', authentication: :plain, enable_starttls_auto: true } |