ask/app/controllers/asks_controller.rb

243 lines
9.5 KiB
Ruby
Raw Normal View History

2020-04-30 05:18:02 +00:00
class AsksController < ActionController::Base
helper Admin::AsksHelper
2020-04-30 05:18:02 +00:00
include Admin::AsksHelper
include ActionView::Helpers::FormHelper
include ActionView::Helpers::FormOptionsHelper
helper ActionView::Helpers::UrlHelper
include ActionController::RequestForgeryProtection
def widget
subpart = OrbitHelper.get_current_widget
case subpart.widget_type
when /.*_form/
module_app = ModuleApp.where(:key => "ask").first
categories = Array(Category.find(OrbitHelper.page_categories)) rescue ['all']
categories = module_app.categories if categories.include? 'all'
tags = module_app.tags
ask_question = AskQuestion.new
locale = I18n.locale
ask_setting = AskSetting.first
ask_setting = AskSetting.create() if ask_setting.nil?
categories = Array(Category.find(OrbitHelper.widget_categories)) rescue ['all']
categories = module_app.categories if categories.include? 'all'
tmp = 'mongoid.attributes.ask_question'
defalt_fields = [{'label'=>ask_label(t('title'),'true'),'content'=>text_field_tag('ask_question[title]',nil,placeholder: t('title'),required: true)}]
if ask_setting.default_setting['ask_category_id']
if categories.count > 1
defalt_fields = defalt_fields + [{'label'=>ask_label(t("#{tmp}.ask_category_id"),'true'),'content'=>select_tag('ask_question[category_id]', options_for_select(categories.collect{|t| [ t.title, t.id ]}))}]
else
defalt_fields = defalt_fields + [{'label'=>ask_label(t("#{tmp}.ask_category_id"),'true'),'content'=>"<span>#{@categories[0].title rescue ''}</span>"+hidden_field_tag('ask_question[category_id]', (categories[0].id.to_s rescue ''))}]
end
else
defalt_fields = defalt_fields + [{'label'=>'','content'=>hidden_field_tag('ask_question[category_id]', (categories[0].id.to_s rescue ''))}]
end
defalt_fields = defalt_fields + ['name','sex','mail','phone','appointment'].select{|v| ask_setting.default_setting[v]}.collect do |field|
required = ['phone','appointment'].exclude?(field) ? 'true' : 'false'
f1 = {'label'=>ask_label(t("#{tmp}.#{field}"),required)}
field_name = "ask_question[#{field}]"
case field
when 'name'
f1['content'] = text_field_tag(field_name,nil,data: {"fv-validation" => "required;", "fv-messages" => "必填欄位;"},required: true,placeholder:t("#{tmp}.#{field}"))
when 'sex'
f1['content'] = "<label class=\"radio-inline\">
#{radio_button(field_name,'male')}#{I18n.t('users.male')}
</label>
<label class=\"radio-inline\">
#{radio_button(field_name,'female')}#{I18n.t('users.female')}
</label>"
when 'mail'
f1['content'] = text_field_tag(field_name,nil,data: {"fv-validation" => "required;check_email;", "fv-messages" => "必填欄位;Email不正確;"},required: true,placeholder:t("#{tmp}.#{field}"))
when 'phone'
f1['content'] = text_field_tag(field_name,nil,placeholder:t("#{tmp}.#{field}"))
when 'appointment'
f1['content'] = "<div class=\"default_picker\">#{text_field_tag(field_name,placeholder:t("#{tmp}.#{field}"))}</div>"
end
f1
end
defalt_fields = defalt_fields + ask_setting.custom_fields.collect{|k,v| {'label'=>ask_label(v['field'][I18n.locale],v['required']),'content'=>show_on_front(k,v)}}
defalt_fields << {'label'=>ask_label(t("#{tmp}.agree_show")),'content'=>check_box_tag('ask_question[agree_show]')}
request = OrbitHelper.request
csrf_value = OrbitHelper.request.session[:_csrf_token] || SecureRandom.base64(32)
{
'fields' => defalt_fields,
'extras'=>{
'token_tag' => hidden_field_tag('authenticity_token',csrf_value),
'form_url' => "/#{I18n.locale.to_s}/asks",
'submit_tag' => submit_tag(t('submit'), :class=> 'btn btn-primary', :id => 'button-mail'),
'close_tag' => button_tag(t('cancel'), type: 'reset', :class=> 'btn'),
'referer_url' => ''
}
}
else
data_count = OrbitHelper.widget_data_count.to_i
if data_count != 0
ask_questions = AskQuestion.where(situation: 'is_published').page(1).per(data_count)
else
ask_questions = AskQuestion.where(situation: 'is_published')
end
ask_index_page = Page.where(:module=>'ask').first.url rescue nil
ask_questions = ask_questions.collect do |v|
url = ((ask_index_page+"?item=#{v.id}") rescue "javascript:alert('#{t('ask.no_index_page')}')")
{'td'=> [
{'content' =>v.category.title},
{'content' => link_to(v.title,"#{url}",title: v.title)}
]
}
end
{
'ask_questions' => ask_questions,
'th'=>[{'td'=>t('categories')},{'td'=>t('title')}]
}
end
end
def get_layout_type
@params = OrbitHelper.params
page = Page.where(url:@params['url']).first
@layout_type = 'index'
if page.methods.include? 'select_option_items'.to_sym
ModuleApp.all.select{|tmp| tmp.key.to_s=='ask'}.each do |modile_app|
@show_option_items = modile_app.show_option_items rescue nil
end
page.select_option_items.each do |select_option_item|
if !(@show_option_items.nil?) && select_option_item.field_name == @show_option_items.keys.first.to_s
value = YAML.load(select_option_item.value)
locale = I18n.default_locale
I18n.with_locale(locale) do
if value[locale] == t('ask.widget.index')
@layout_type = 'index'
elsif value[locale] == t('ask.is_published')
@layout_type = 'published_index'
end
end
end
end
end
end
2014-10-02 06:00:35 +00:00
def initialize
super
@app_title = 'ask'
end
2020-04-30 05:18:02 +00:00
def show
ask_question = AskQuestion.where(id: @params['item']).first
{'ask_question' => ask_question,'layout_type'=>'show'}
end
2014-10-02 06:00:35 +00:00
def index
2020-04-30 05:18:02 +00:00
@params = OrbitHelper.params
if @params['item'].to_s.empty?
get_layout_type
else
@layout_type = 'show'
end
if @layout_type == 'index'
module_app = ModuleApp.where(:key => "ask").first
categories = Array(Category.find(OrbitHelper.page_categories)) rescue ['all']
categories = module_app.categories if categories.include? 'all'
tags = module_app.tags
ask_question = AskQuestion.new
{
'layout_type' => 'index',
'ask_question' => ask_question,
'categories' => categories,
'tags' => tags,
'module_app' => module_app
}
elsif @layout_type == 'published_index'
page_number = OrbitHelper.page_number.to_i
page_number = 1 if page_number == 0
page_data_count = OrbitHelper.page_data_count.to_i
if page_data_count != 0
ask_questions = AskQuestion.where(situation: 'is_published').page(page_number).per(page_data_count)
else
ask_questions = AskQuestion.where(situation: 'is_published')
end
{
'layout_type' => 'published_index',
'ask_questions' => ask_questions,
'url' => @params['url']
}
else
show
end
2014-10-02 06:00:35 +00:00
end
def create
@ask_question = AskQuestion.new()
temp_params = create_params
all_to_save = []
ask_setting = AskSetting.first
ask_setting = AskSetting.create() if ask_setting.nil?
ask_setting.custom_fields.select{|k,v| v['type']=='file' || v['type']=='image'}.each do |k,v|
file = temp_params['custom_values'][k]
if !file.blank?
if v['type']=='image'
all_to_save += [[k,AskImage.new(file: file,ask_question_id: @ask_question.id)]]
else
all_to_save += [[k,AskFile.new(file: file,ask_question_id: @ask_question.id)]]
end
end
end
flag =(gotcha_valid? || !AskSetting.first.default_setting['recaptcha']) && @ask_question.save
if flag
all_to_save.each do |to_save|
flag = flag && to_save[1].save
temp_params['custom_values'][to_save[0]] = [temp_params['custom_values'][to_save[0]].original_filename ,to_save[1].file.url]
end
end
if flag
@ask_question.update_attributes(temp_params)
2014-10-02 06:00:35 +00:00
build_email(@ask_question)
redirect_to "#{params[:referer_url]}/?method=thank"
else
redirect_to "#{params[:referer_url]}/?method=sorry"
end
end
def thank
acknowledgement = AskAcknowledgement.last
{
"acknowledgement" => acknowledgement
}
end
def sorry
{}
end
def build_email(email_er)
2020-04-30 05:18:02 +00:00
email = Email.new
email.save
email_er.email_id = email.id
email_er.save
2014-10-02 06:00:35 +00:00
2020-04-30 05:18:02 +00:00
@group_mail = email_er.email_address
@mail_sentdate = DateTime.now
2014-10-02 06:00:35 +00:00
2020-05-13 09:08:40 +00:00
site = Site.first
2020-05-13 09:25:08 +00:00
mail_from = site['title'][site['default_locale']]
2020-05-13 09:34:42 +00:00
2020-04-30 05:18:02 +00:00
email_er.email.update_attributes(
2020-05-13 09:34:42 +00:00
:mail_lang=> site['default_locale'],
2020-04-30 05:18:02 +00:00
:create_user=>(current_user rescue nil),
:mail_sentdate=>@mail_sentdate,
:module_app=>@module_app,
:mail_to=>@group_mail,
2020-05-13 09:34:42 +00:00
:mail_subject=>mail_from+" #{t('ask.new_question')}",
2020-04-30 05:18:02 +00:00
:template=>'asks/email',
:template_data=>{
# "title" => email_er.title,
"name" => email_er.name,
"identity" => email_er[:identity],
"mail" => email_er.mail,
"phone" => email_er.phone,
# "fax" => email_er.fax,
# "content" => email_er.content
"appointment" => email_er.appointment
}
)
2014-10-02 06:00:35 +00:00
2020-04-30 05:18:02 +00:00
OrbitMailer.set_mail(email_er.email).deliver
2014-10-02 06:00:35 +00:00
end
def create_params
params.require(:ask_question).permit!
end
end