问题
I suppose title says everything. The form is rendered as it should, but everything begun when i decided to write an InputFilter
for it. The form is still rendered, but of course i had to adapt something around it. Now, however POST request is sent (Firebug agrees), the getPost()
method returns false now.
Action (in the controller):
public function contactAction () {
$form = new ContactForm();
$request = $this->getRequest();
if ($request->isPost()) {
$vm = new ViewModel();
$vm->setTerminal(true);
$form->setData($request->getPost());
if($form->isValid()) {
$to = "";
$from = $request->getPost("email");
$name = $request->getPost("nome");
$subject = "Message sent by ".$name." (phone ".$request->getPost("phone").")";
$body = $request->getPost("message");
$mail = new SendEMail($to, $from, $subject, $body);
if (!$mail) {
$vm->setVariables(array(
"result" => "Error while sending. Retry."
));
return $vm;
} else {
$vm->setVariables(array(
"result" => "Thank you! We'll answer as soon as possible."
));
return $vm;
}
} else {
$vm->setVariables(array(
"result" => "Some fields aren't properly fullfilled."
));
return $vm;
}
} else {
return new ViewModel(array (
"welcome" => $this->homeService->findText(),
"form" => $form,
));
}
}
Form class:
<?php
namespace Site\Form;
use Zend\Form\Form;
use Zend\Form\Element;
class ContactForm extends Form {
public function __construct($name=null, $options=array ()) {
parent::__construct ($name, $options);
$this->setAttributes(array(
"action" => "./",
));
$nameInput = new Element\Text("nome");
$nameInput->setAttributes(array(
"placeholder" => "Nome e cognome",
"tabindex" => "1"
));
$this->add($nameInput);
$emailInput = new Element\Text("email");
$emailInput->setAttributes(array(
"placeholder" => "Indirizzo e-mail",
"tabindex" => "2"
));
$this->add($emailInput);
$phoneInput = new Element\Text("phone");
$phoneInput->setAttributes(array(
"placeholder" => "Numero di telefono",
"tabindex" => "3",
));
$this->add($phoneInput);
$messageArea = new Element\Textarea("messaggio");
$messageArea->setAttributes(array(
"placeholder" => "Scrivi il tuo messaggio",
"tabindex" => "4"
));
$this->add($messageArea);
$submitButton = new Element\Button("submit");
$submitButton
->setLabel("Invia messaggio")
->setAttributes(array(
"type" => "submit"
));
$this->add($submitButton);
$resetButton = new Element\Button("reset");
$resetButton
->setLabel("Cancella")
->setAttributes(array(
"type" => "reset"
));
$this->add($resetButton);
$this->setInputFilter(new ContactInputFilter());
}
}
?>
InputFilter class:
<?php
namespace Site\Form;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Input;
use Zend\Validator;
class ContactInputFilter extends InputFilter {
public function init() {
$nome = new Input("nome");
$nome->getValidatorChain()
->attach(new Validator\StringLength(3));
$email = new Input("email");
$email->getValidatorChain()
->attach(new Validator\EmailAddress());
$phone = new Input("phone");
$phone->getValidatorChain()
->attach(new Zend\I18n\Validator\PhoneNumber());
$message = new Input("message");
$phone->getValidatorChain()
->attach(new Validator\StringLength(10));
$this->add($nome)
->add($email)
->add($phone)
->add($message);
}
}
?>
Documentation isn't being so helpful, and similar threads around here look like having had a different problem (which i don't have). Any ideas? Thank you.
EDIT
After performing a var_dump($request->isPost()) i noticed that it returns true if it receives post data. Then i don't know what is really happening now.
回答1:
Well i got the point. Since my action was a merge of 2 previous actions i had, i still had some code that was good for a different template. The problem wasn't getPost()
returning false, but the view receiving unexpected data. Now my action is:
public function contactAction () {
$form = new ContactForm();
$request = $this->getRequest();
$vm = new ViewModel();
$vm->setTerminal(true);
$vm->setTemplate("Site\Skeleton\Email"); //here the proper template is set
if ($request->isPost()) {
$form->setData($request->getPost());
if($form->isValid()) {
$to = "";
$from = $request->getPost("email");
$name = $request->getPost("nome");
$subject = "Messaggio inviato da ".$name." (tel. ".$request->getPost("phone").")";
$body = $request->getPost("messaggio");
$mail = new SendEMail($to, $from, $subject, $body);
if (!$mail) {
$vm->setVariables(array(
"result" => "Error while sending. Retry."
));
return $vm;
} else {
$vm->setVariables(array(
"result" => "Thank you! We'll answer as soon as possible."
));
return $vm;
}
} else {
$vm->setVariables(array(
"result" => "Some fields aren't properly fullfilled."
));
return $vm;
}
} else {
return new ViewModel(array (
"welcome" => $this->homeService->findText(),
"form" => $form,
));
}
}
Now i have another problem, so i'll forward to another thread.
来源:https://stackoverflow.com/questions/30954866/zend-framework-2-submitting-a-form