class AsksController < ActionController::Base helper Admin::AsksHelper 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.widget_categories)) rescue ['all'] categories = module_app.categories if categories.include? 'all' tags = module_app.tags ask_question = AskQuestion.new locale = I18n.locale ask_settings = AskCategorySetting.where(:category_id.in=> categories.collect{|v| v.id.to_s}).to_a if ask_settings.count != 0 && ask_settings.count != categories.count ask_settings = [AskSetting.first]+ask_settings end ask_setting = AskCategorySetting.where(category_id: categories.first.id.to_s).first if ask_setting.nil? ask_setting = AskSetting.first ask_setting = AskSetting.create() if ask_setting.nil? end defalt_fields = cal_form_from_setting(ask_setting,categories) request = OrbitHelper.request csrf_value = OrbitHelper.request.session[:_csrf_token] || SecureRandom.base64(32) token_tag = hidden_field_tag('authenticity_token',csrf_value) switch_form = cal_switch_form(ask_settings,categories,token_tag) { 'fields' => defalt_fields, 'extras'=>{ 'token_tag' => token_tag, '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' => '', 'switch_form' => switch_form } } 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 = OrbitHelper.widget_more_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')}], 'extras' => {'more_title'=>I18n.t('ask.more_title'), 'more_href'=>ask_index_page} } 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 def initialize super @app_title = 'ask' end def show ask_question = AskQuestion.where(id: @params['item']).first ask_setting = AskCategorySetting.where(category_id: ask_question.category_id.to_s).first ask_setting = AskSetting.first if ask_setting.nil? {'ask_question' => ask_question,'layout_type'=>'show','ask_setting'=>ask_setting} end def index @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' ask_settings = AskCategorySetting.where(:category_id.in=> categories.collect{|v| v.id.to_s}).to_a if ask_settings.count != 0 && ask_settings.count != categories.count ask_settings = [AskSetting.first]+ask_settings end ask_setting = AskCategorySetting.where(category_id: categories.first.id.to_s).first if ask_setting.nil? ask_setting = AskSetting.first ask_setting = AskSetting.create() if ask_setting.nil? end csrf_value = OrbitHelper.request.session[:_csrf_token] || SecureRandom.base64(32) token_tag = hidden_field_tag('authenticity_token',csrf_value) switch_form = cal_switch_form(ask_settings,categories,token_tag) tags = module_app.tags ask_question = AskQuestion.new { 'layout_type' => 'index', 'ask_question' => ask_question, 'categories' => categories, 'tags' => tags, 'module_app' => module_app, 'switch_form' => switch_form, 'ask_setting' => ask_setting } 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 end def create @ask_question = AskQuestion.new() temp_params = create_params all_to_save = [] ask_setting = AskCategorySetting.where(category_id: params['ask_question']['category_id']).first if ask_setting.nil? ask_setting = AskSetting.first ask_setting = AskSetting.create() if ask_setting.nil? end 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) 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) email = Email.new email.save email_er.email_id = email.id email_er.save @group_mail = email_er.email_address @mail_sentdate = DateTime.now site = Site.first mail_from = site['title'][site['default_locale']] email_er.email.update_attributes( :mail_lang=> site['default_locale'], :create_user=>(current_user rescue nil), :mail_sentdate=>@mail_sentdate, :module_app=>@module_app, :mail_to=>@group_mail, :mail_subject=>mail_from+" #{t('ask.new_question')}:", :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 } ) OrbitMailer.set_mail(email_er.email).deliver end def create_params params.require(:ask_question).permit! end private def cal_form_from_setting(ask_setting,categories,show_categories=false) tmp = 'mongoid.attributes.ask_question' defalt_fields = [{'style_html'=>'','label'=>ask_label(t('title'),'true'),'content'=>text_field_tag('ask_question[title]',nil,placeholder: t('title'),required: true)}] if show_categories || ask_setting.default_setting['ask_category_id'] if categories.count > 1 defalt_fields = defalt_fields + [{'style_html'=>'','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 + [{'style_html'=>'','label'=>ask_label(t("#{tmp}.ask_category_id"),'true'),'content'=>"#{(categories[0].title rescue '')}"+hidden_field_tag('ask_question[category_id]', (categories[0].id.to_s rescue ''))}] end else defalt_fields = defalt_fields + [{'style_html'=>'display: none;','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 = {'style_html'=>'','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'] = " " 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'] = "
#{text_field_tag(field_name,nil,placeholder:t("#{tmp}.#{field}"))}
" 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)}} if !ask_setting.usage_rule.blank? defalt_fields << {'style_html'=>'','label'=>ask_label(t("ask.usage_rule")),'content'=>ask_setting.usage_rule} end if ask_setting.default_setting['agree_usage'] defalt_fields << {'style_html'=>'','label'=>ask_label(t("#{tmp}.agree_usage")),'content'=>check_box_tag('ask_question[agree_usage]')} end if ask_setting.default_setting['agree_show'] defalt_fields << {'style_html'=>'','label'=>ask_label(t("#{tmp}.agree_show")),'content'=>check_box_tag('ask_question[agree_show]')} end defalt_fields end def cal_html(fields,token_tag,form_id) 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 = '' tmp = fields.collect do |field| style_html = field['style_html'] label = field['label'] content = field['content'] "
#{label}
#{content}
" end.join "
#{token_tag}
#{tmp}
#{submit_tag} #{close_tag}
" end def script_text "" end def cal_switch_form(ask_settings,categories,token_tag) switch_form = '' if ask_settings.count > 1 switch_form = script_text + ask_settings.collect do |ask_setting| fields = cal_form_from_setting(ask_setting,categories,true) if ask_setting.class == AskSetting form_id = 'ask-default-form' else form_id = ask_setting.category_id end cal_html(fields,token_tag,form_id) end.join end switch_form end end