InPlaceEditor Select Tag
Come avrete avuto modo di osservare il controllo InplaceEditor fornisce solo il meccanismo per la generazione di text box per la modifica dei contenuti, di seguito troverete una versione modificata della ricetta presente sul libro Rails Recipes, in grado di funzionare correttamente anche con Internet Explorer.
I passi da seguire per la reazlizzazione dell’in place editor per i tag select sono i seguenti:
- realizzare una classe javascript inplaceselecteditor
- creare un helper ad hoc
- utilizzare l’InplaceSelectEditor
Realizzare la classe javascript
Creare un file inplaceselect_editor.js per poterlo poi includere nei vostri progetti nella cartella /public/javascript e incollare il seguente codice:
1 AjaxInPlaceSelectEditor = Classcreate 2 ObjectextendObjectextendAjaxInPlaceSelectEditorprototype 3 AjaxInPlaceEditorprototype 4 5 var text 6 ifthisoptionsloadTextURL 7 text = thisoptionsloadingText 8 else 9 text = thisgetText 10 11 thisoptionstextarea = false 12 var selectField = documentcreateElement"select" 13 selectFieldname = "value" 14 var options=thisoptionsselectOptionsHTML 15 var pvalue = thisoptionspassedValue 16 for var x=0 x < optionslength x++ 17 18 var option = documentcreateElement"option" 19 optionappendChilddocumentcreateTextNodeoptionsx 20 optionsetAttribute"value"pvaluex 21 selectFieldappendChildoption 22 23 24 $AselectFieldoptionseachfunctionoptindex 25 iftext == opttext 26 selectFieldselectedIndex = index 27 28 29 30 selectFieldstylebackgroundColor = thisoptionshighlightcolor 31 thiseditField = selectField 32 thiseditFieldstylebackgroundColor="" 33 thiseditFieldclassName= "editor_field" 34 ifthisoptionsloadTextURL 35 thisloadExternalText 36 37 thisformappendChildthiseditField 38 39 40
Il file in_place_select_editor.js è una versione modificata di quello presente nella ricetta del Rails Recipe, che non consentiva la generazione corretta degli elementi option della select con il Browser internet Explorer.
Di seguito l’estratto della riga che creava problemi:
1 2 selectFieldinnerHTML=thisoptionsselectOptionsHTML || "<option>" + text + "" 3
Usando innerHTML Internet Explorer non visualizza le option una volta renderizzate, mentre con la seguente modifica non si verifica più il problema:
1 for var x=0 x<options length x++ 2 3 var option = documentcreateElement"option" 4 optionappendChilddocumentcreateTextNodeoptionsx 5 optionsetAttribute"value"pvaluex 6 selectFieldappendChildoption 7
Includere il costruttore
Includere il javascript nel layout del vostro progetto
1 ... 2 3 ...
Creare un helper ad hoc
Nell’ApplicationHelper
1 2 tag = ::ActionView::Helpers::InstanceTag.new(object, method, self) 3 tag_options = {:tag => "span", 4 :id => "___in_place_editor", 5 :class => "in_place_editor_field"}.merge!(tag_options) 6 in_place_editor_options[:url] = 7 in_place_editor_options[:url] || 8 url_for({:action => "set__", :id => tag.object.id }) 9 tag.to_content_tag(tag_options.delete(:tag), tag_options) + 10 in_place_select_editor(tag_options[:id], in_place_editor_options) 11 end 12 13 14 function = "new Ajax.InPlaceSelectEditor(" 15 function < < "'', " 16 function < < "''" 17 js_options = {} 18 js_options['cancelText'] = %('') if options[:cancel_text] 19 js_options['okText'] = %('') if options[:save_text] 20 js_options['loadingText'] = %('') if options[:loading_text] 21 js_options['rows'] = options[:rows] if options[:rows] 22 js_options['cols'] = options[:cols] if options[:cols] 23 js_options['size'] = options[:size] if options[:size] 24 js_options['externalControl'] = "''" if options[:external_control] 25 js_options['loadTextURL'] = "''" if options[:load_text_url] 26 js_options['ajaxOptions'] = options[:options] if options[:options] 27 js_options['evalScripts'] = options[:script] if options[:script] 28 js_options['callback'] = "function(form) { return }" if options[:with] 29 select_options = options[:select_options].map{|opt| escape_javascript(opt[0])} 30 val = options[:select_options].map{|opt| opt[1]} 31 js_options['passedValue'] = "new Array('"+val.join("','") +"')"; 32 js_options['selectOptionsHTML']= "new Array('"+select_options.join("','") +"')" 33 function < < (', ' + options_for_javascript(js_options)) unless js_options.empty? 34 function < < ')' 35 javascript_tag(function) 36 end
Utilizzare l’InplaceSelectEditor
Adesso è possibile utilizzare editor in line per i tag select, semplicemente, in un file .rhtml potrete utilizzarlo cosi:
1 2 Nazione: 3 7 8
Adesso serve la funzione che esegua la modifica del campo interessato. Siccome mi occorrevano altre funzionalità, provate a leggere questa soluzione se vi può interessare lavorare con l’in-place-select-editor e gli Array.

