Forum OpenACS Development: Re: ad_form for new and edit requests

Collapse
Posted by Joel Aufrecht on
Okay, here's an example of a view/edit page built on ad_form. A functional description would be:
  • Record: word
  • Fields
    • word:text
    • locale:lookup to ad_locale.
      • default to system locale for new records.
    • ipa_phonetic:text
    • local_phonetic:text
      • only show this field if word's locale has a "local phonetic alphabet" defined.
      • If creating a new word, determine based on system locale
      • Field title is dynamic, based on locale

And the code (actual running code; I've just omitted some irrelevant bits)

ad_page_contract {
    
    Form for editing individual words
    
} {
    id:integer,optional
    {return_url ""}
}

set page_title "Edit"
set context [list $page_title]
set package_id [ad_conn package_id]

# catch missing local_phonetic when submitting from a form
# where that field was hidden
if {![exists_and_not_null local_phonetic] } {
    set local_phonetic ""
}

set working_locale [lang::user::locale]
# pre-query for the object's locale, which can override working_locale
# yes, we're querying the database twice for the same thing
# that's still faster than hacking ad_form
if { [exists_and_not_null id]} {
    set working_locale [db_string get_locale "
                            select locale
                              from vocab_word
                             where id = :id
" -default ""]
}

set phonetic_alphabet [vocab::phonetic_alphabet_for_locale -locale $working_locale]
set locale_options [vocab::locale_list -all all]
set form_mode [ad_decode [ad_form_new_p -key id] 1 "edit" "display"]

ad_form \
    -name word \
    -mode $form_mode \
    -form {

	{id:key}
	{word:text 
	    {label Word}
	}
	{locale:text(select)
	    {label Locale}
	    {options $locale_options}
	}
	{ipa_phonetic:text,optional
	    {label "IPA"}
	}
    }

if { ![string equal $phonetic_alphabet none]} {
    ad_form -extend -name word -form {
	{local_phonetic:text,optional
	    {label "[set phonetic_alphabet]"}
	}
    }
}

ad_form -extend -name word \
     -new_request {
	set page_title "Add a Word"
	set context [list $page_title]
        # this pre-sets the form locale
        set locale $working_locale

    } -edit_request {

	db_1row word_select {
	    select word,
                   locale,
                   ipa_phonetic,
                   local_phonetic
              from vocab_word
             where id = :id
	}
	set page_title "$word"
	set context [list $page_title]

        # this may be redundant with the prefetch
	set working_locale $locale
	set phonetic_alphabet [vocab::phonetic_alphabet_for_locale -locale $working_locale]

    } -new_data {

	set user_id [auth::require_login]
	set new_id [db_string word_insert "
        select vocab_word__new(:package_id, :word, :locale, :ipa_phonetic, :local_phonetic, :user_id,null) 
    "]

	if {![exists_and_not_null return_url]} {
	#TODO: new_id is the wrong thing to redirect to, so this breaks
	#    set return_url [export_vars -base word-edit {{id $new_id}}]
	    set return_url "."
	}
	ad_returnredirect $return_url

    } -edit_data {

	auth::require_login
	db_dml word_edit {
	    update vocab_word
	       set word   = :word,
    	           locale = :locale,
	           ipa_phonetic = :ipa_phonetic,
	           local_phonetic = :local_phonetic
	     where id = :id
	}

    } -after_submit {

	ad_returnredirect $return_url
	ad_script_abort

    }