InPlaceEditor per Ajax.Autocompleter
La classe ajax.autocompleter è veramente utile e semplice da usare, infatti includendo il prototype.js potete implementarlo così:
1 2 3 ... 4
Con il Rails avete l’helper con il quale autogenerare il campo input e la chiamata ajax alla funzione che popolerà il div “autocomplete _choices”.
Ma se vi servisse l’inplace editor per l’autocomplete? Cosa si dovrebbe fare?
Sarebbe necessario creare a RunTime, cliccando sul testo da modificare, qualcosa di simile al codice sopra… vediamo insieme una possibile soluzione, premetto soltanto che c’è un bug con IE (non mostra i risultati nel div ma le chiamate ajax funzionano correttamente) e se qualcuno di voi trovasse la soluzione vi prego comunicatela!!
la classe inPlaceAutocompleteEditor
Allora il primo passo è creare la classe Javascript che estende l’implaceEditor che chiameremo in_place_autocomplete_editor.js:
1 AjaxInPlaceAutocompleteEditor = Classcreate 2 ObjectextendObjectextendAjaxInPlaceAutocompleteEditorprototype 3 AjaxInPlaceEditorprototype 4 5 var url = thisoptionsautourl 6 var text 7 ifthisoptionsloadTextURL 8 text = thisoptionsloadingText 9 else 10 text = thisgetText 11 12 var obj = this 13 thisoptionstextarea = false 14 var textField = documentcreateElement"input" 15 textFieldobj = this 16 textFieldtype = "text" 17 textFieldid = "auto_city" 18 textFieldname = thisoptionstextfieldname 19 textFieldclassName = "text" 20 thiseditField = textField 21 //Questo Div creato a RunTime non viene visualizzato da IE 22 //La soluzione a questo problema è inserire il div direttamente nell'rhtml 23 var div = documentcreateElement"div" 24 divobj = this 25 divsetAttribute"id""auto_complete_div2" 26 divsetAttribute"class""auto_complete" 27 divsetAttribute"style""display:none" 28 thisautodiv = div 29 ifthisoptionsloadTextURL 30 thisloadExternalText 31 32 thisformappendChildthiseditField 33 thisformappendChildthisautodiv 34 var empty = windowdocumentcreateTextNode'&npsp;' 35 thisautodivappendChildempty 36 var element = thiseditField 37 new AjaxAutocompleterthiseditFieldthisautodivurl 38 39
Bene il costruttore della classe è pronto per essere incluso nel vostro layout.
Gli helper
Adesso ecco gli helper da mettere nell’ApplicationHelper da riusare poi nelle viste:
1 2 tag_options = { 3 :id => "__auto_editor_field", 4 :class => "in_place_autocomplete_editor_field"}.merge!(tag_options) 5 in_place_autocomplete_editor_options[:url] = in_place_autocomplete_editor_options[:url] || url_for({:action => "address_") 6 in_place_autocomplete_editor_options[:auto_url] = autocomplete_options[:auto_url] 7 in_place_autocomplete_editor_options[:textfieldname] = autocomplete_options[:textfieldname] 8 in_place_autocomplete_editor_options[:save_text] = 'Salva' 9 in_place_autocomplete_editor_options[:cancel_text] ='Annulla' 10 in_place_autocomplete_editor_options[:loading_text] = 'Sto salvando...' 11 content_tag("span", object, tag_options) + in_place_autocomplete_editor(tag_options[:id], in_place_autocomplete_editor_options) 12 end 13 14 15 function = "new Ajax.InPlaceAutocompleteEditor(" 16 function < < "'', " 17 function << "''" 18 js_options = {} 19 js_options['cancelText'] = %('') if options[:cancel_text] 20 js_options['okText'] = %('') if options[:save_text] 21 js_options['loadingText'] = %('') if options[:loading_text] 22 js_options['textfieldname'] = %('') 23 js_options['autourl'] = %('') 24 js_options['size'] = options[:size] if options[:size] 25 js_options['externalControl'] = "''" if options[:external_control] 26 js_options['loadTextURL'] = "''" if options[:load_text_url] 27 js_options['ajaxOptions'] = options[:options] if options[:options] 28 js_options['evalScripts'] = options[:script] if options[:script] 29 js_options['callback'] = "function(form) { return }" if options[:with] 30 function << (', ' + options_for_javascript(js_options)) unless js_options.empty? 31 function << ')' 32 javascript_tag(function) 33 end
Allora in_place_autocomplete_editor_field accetta tra i parametri le autocomplete_options io le ho messe per specificare:
- :auto_url => ‘url_for(:action=>…)’,
- :textfieldname
Questi due parametri consentono di dare il nome alla funzione da chiamare per riempire il div dell’autocomplete mentre il textfieldname è l’id della textbox generata a runtime usata dall’autocompleter. La riga url_for({ :action => “auto_#{method}”) setta il nome della funzione che verrà chiamata cliccando sul tasto salva dell’inPlaceEditor.
La vista
L’ultimo passo è quello della vista .rhtml
1


bel lavoro, anche se non l’ho ancora provato
non sarebbe male che tu lo mandassi al nostro amato Thomas Fuchs…