Zend Framework 2 - Submitting a form

2019-08-27 14:18发布

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条回答
再贱就再见
2楼-- · 2019-08-27 14:33

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.

查看更多
登录 后发表回答