Pergunta

How to add extra field in SignUp form with my own validation.Shall I want to rewrite all views ,controllers from secure-social code.

I try to add my custom login form as follows.Is it correct way to do?

views.custom.SecuFocusTemplatesPlugin

val contactForm = Form(
      mapping(      
        "firstname" -> nonEmptyText(minLength=2, maxLength=64),
        "lastname" -> nonEmptyText(minLength=2, maxLength=64),
        "jobtitle" -> nonEmptyText(minLength=2, maxLength=64),
        "phone" -> nonEmptyText(minLength=2, maxLength=20),      
        "email" -> (email verifying nonEmpty),

        "password" -> tuple(
            "main" -> nonEmptyText(minLength = 6),
            "confirm" -> nonEmptyText(minLength = 6)
        ).verifying(
            // Add an additional constraint: both passwords must match
            "Passwords don't match", ps => ps._1 == ps._2
          ).transform[String]({case (p, _) => p}, {p => p -> p}),

        "companyname" -> nonEmptyText(minLength=2, maxLength=64),
        "employeescount" -> number
      )

      (Contact.apply)(Contact.unapply)
  )

 /**
   * Returns the html for the login page
   * @param request
   * @tparam A
   * @return
   */
  override def getLoginPage[A](implicit request: Request[A], form: Form[(String, String)],
                               msg: Option[String] = None): Html =
  {
    views.html.login(contactForm, msg)
    //securesocial.views.html.login(form, msg)
  }

login.scala.html

@(loginForm: Form[Contact], errorMsg: Option[String] = None)(implicit request: RequestHeader)


@import helper._
@import securesocial.core.Registry
@import securesocial.core.AuthenticationMethod._
@import securesocial.core.providers.UsernamePasswordProvider.UsernamePassword
@import securesocial.views._



@main(Messages("securesocial.login.title")) {
    <div class="page-header">
        <h1>@Messages("securesocial.login.title")</h1>
    </div>

    @errorMsg.map { msg =>
        <div class="alert alert-error">
            @Messages(msg)
        </div>
    }

    @request.flash.get("success").map { msg =>
        <div class="alert alert-info">
            @msg
        </div>
    }

    @request.flash.get("error").map { msg =>
        <div class="alert alert-error">
            @msg
        </div>
    }


@defining( Registry.providers.all.values.filter( _.id != UsernamePassword) ) { externalProviders =>

        @if( externalProviders.size > 0 ) {
            <div class="clearfix">
                <p>@Messages("securesocial.login.instructions")</p>
                <p>
                    @for(p <- externalProviders) {
                        @provider(p.id)
                    }
                </p>
            </div>
        }

        @Registry.providers.get(UsernamePassword).map { up =>
            <div class="clearfix">
                @if( externalProviders.size > 0 ) {
                    <p>@Messages("securesocial.login.useEmailAndPassword")</p>
                } else {
                    <p>@Messages("securesocial.login.useEmailAndPasswordOnly")</p>
                }

               @provider("userpass", Some(loginForm))
            </div>
        }
    }
}
Foi útil?

Solução

SecureSocial does not allow you to specify custom fields for registration as of this writing. You have 2 options:

  1. What you could do now is when the user logs in (after successful registration) redirect him to a page where he can complete the required information. I understand this might not be ideal in all cases but it's the easiest approach.

  2. Write your own registration controller that handles your custom flow of pages. You'd have to see the built in Registration controller and use it as a guide.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top