artyom-beilis / cppcms

CppCMS Framework
Other
450 stars 111 forks source link

Problem to customize a form #56

Open pcouderc12 opened 5 years ago

pcouderc12 commented 5 years ago

My form is ok with: <form class="form-signin" method="post" action="" ><% csrf %> <% form as_p mydata %> </form> But when I try: `

`

I get a compile error. Is ther an exmple of this case in the documentation ? I have found none. What am I missing ? Thank you for cppcms. PC

artyom-beilis commented 5 years ago

I get a compile error.

What error? Without details it is hard to answer

pcouderc12 commented 5 years ago

Sure ! (I though the error was trivial in my line...) output:

`templates/login_login.tmpl: In member function ‘virtual void myskin::login_login::page_content()’: templates/login_login.tmpl:13:54: error: no match for call to ‘(cppcms::widgets::email) ()’

`
and content.h :

`struct login_login_form : public cppcms::form { cppcms::widgets::email email; cppcms::widgets::password password; cppcms::widgets::submit submit; login_login_form() { email.message("votre email"); password.message("votre password"); add(email); add(password); add(submit); } virtual bool validate() { if(!form::validate()) return false; return true; } }; struct login_login : public master { std::string name,email,password; login_login_form data; };

`

masaoliou commented 5 years ago

Does adding a space between ) and % to make email()% become email() % help?

pcouderc12 commented 5 years ago

No. The generatedcode is : out()<<cppcms::filters::escape(content.data.email());

idkCpp commented 5 years ago

Quick recap to see if I got your problem:

The offending template line is:

<input type="email" id="inputEmail" name="<%= data.email()%>" class="form-control" placeholder="Email address" required autofocus>

The generated C++ Code is:

out()<<cppcms::filters::escape(content.data.email());

And content is of type login_login, so content.data is of type login_login_form.

This means content.data.email() is trying to call cppcms::widgets::email::operator() (which I believe to be nonexistant, hence no match for call to ‘(cppcms::widgets::email) ()’.

Try changing

<input type="email" id="inputEmail" name="<%= data.email()%>" class="form-control" placeholder="Email address" required autofocus>

to

<input type="email" id="inputEmail" name="<%= data.email.value()%>" class="form-control" placeholder="Email address" required autofocus>