Zend Framework 2 - 提交表格

时间:2015-06-20 14:06:04

标签: php forms zend-framework input-filter

我认为标题说明了一切。表单按原样呈现,但是当我决定为它编写InputFilter时,一切都开始了。表格仍然呈现,但当然我必须适应它周围的东西。现在,无论发送POST请求(Firebug同意),getPost()方法现在都返回false。

动作(在控制器中):

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,
    ));
    }
}

表格类:

<?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类:

<?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);
    }   

}
?>

文档没有那么有用,这里的类似线程看起来像是有一个不同的问题(我没有)。有任何想法吗?谢谢。
修改
在执行var_dump($ request-&gt; isPost())之后,我注意到如果收到post数据,它返回true。然后我不知道现在发生了什么。

1 个答案:

答案 0 :(得分:0)

嗯,我明白了。由于我的动作是我之前的2个动作的合并,我仍然有一些代码对于不同的模板有用。问题不是getPost()返回false,而是视图接收到意外数据。现在我的行​​动是:

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,
    ));
    }
}

现在我有另一个问题,所以我将转发到另一个线程。