Search code examples
ajaxscalalift

How to create AJAX edit form in scala lift for one to many relationship?


I'm trying to create form to edit one to many relationship. I've created two classes:

class StudentGroup extends LongKeyedMapper[StudentGroup] with IdPK with OneToMany[Long, StudentGroup] {
  object groupName extends MappedString(this, 20)
  object students extends MappedOneToMany(Student,Student.studentGroup)
}


class Student extends LongKeyedMapper[Student] with IdPK {
  object firstName extends MappedString(this,35)
  object lastName extends MappedString(this,35)
  object studentGroup extends MappedLongForeignKey(this, StudentGroup)
}

Then I created a snippet to display a group with following code:

  val addStudentContent: NodeSeq = <div>
    <input type="text" placeholder="First Name"></input>
    <input type="text" placeholder="Last Name"></input>
  </div>

  def addStudent = AppendHtml("studentlist", addStudentContent)

  def render =
      "#addstudent" #> SHtml.ajaxButton("Add student", () => addStudent)

Now after clicking 'Add student' button two new fields appeared and I can put first and last name there. Problem is - how to store those data in database? Any hint?

Thanks


Solution

  • There are several ways you can begin to solve this problem. I never use Mapper myself, so there may be a much better way than what I am suggesting. However, something like the Ajax example in Simply Lift should get you started. Applying it to your code, we would get something like the following.

    object StudentSnippets {
      val addStudentContent: NodeSeq = <form data-lift="form.ajax">
          <div data-lift="StudentSnippets.ajaxSubmit"> // Calls ajaxSubmit below
            <input name="first" type="text" placeholder="First Name"></input>
            <input name="last"  type="text" placeholder="Last Name"></input>
            <input type="submit" value="Submit"></input>
          </div>
        </form>
    
      def addStudent = AppendHtml("studentlist", addStudentContent)
    
      def render =
        "#addstudent" #> SHtml.ajaxButton("Add student", () => addStudent)
    
      private object first extends RequestVar("")
      private object last  extends RequestVar("")
    
      def ajaxSumbit = {
        "name=first" #> SHtml.text(first.is, first(_), "id" -> "the_name") &
        "name=last"  #> (SHtml.text(last.is, last(_)) ++ 
          SHtml.hidden(ajaxProcess)) // Calls ajaxProcess below
      }
    
      def ajaxProcess = {
        println("First is "+first.is)
        println("Last is "+last.is)
        Noop  // This is the JS that will run after submit.
      }
    }
    

    You can view another approach here on the wiki.

    For more help with Lift, I strongly recommend posting your questions to the Lift Google Group. You will find that you get swarmed with Lift help more so than other forums such as SO.