ZF2 - 在表单中找不到名称的元素

1 php zend-framework zend-framework2

我的zend框架2项目涉及一个在线餐厅菜单,我正在尝试制作一个表单来将Pizzas添加到数据库中.但是我的代码有问题.表单不会显示,而是出现此错误:

在表单中找不到[pizza_name]名称的元素

请帮我查一下我的代码有什么问题.

这是我的文件:

addPizzaForm.php:

<?php 
namespace Pizza\Form;
use Zend\Form\Form; 
use Pizza\Form\AddPizzaForm;
use Pizza\Model\Pizza;

class AddPizzaForm extends Form 
{
public function construct() { 
parent:: construct('addpizzaform'); 
$this->add(array(
      'name' => 'pizza_name',
      'type' => 'text',
      'options' => array(label => 'Pizza name')));
$this->add(array(
      'name' => 'ingredients',
      'type' => 'textarea',
      'options' => array(label => 'Ingredients')));
$this->add(array(
      'name' => 'small_price',
      'type' => 'text',
      'options' => array(label => 'Small price')));

$this->add(array(
      'name' => 'big_price',
      'type' => 'text',
      'options' => array(label => 'Big price')));

$this->add(array(
      'name' => 'family_price',
      'type' => 'text',
      'options' => array(label => 'Family price')));

$this->add(array(
      'name' => 'party_price',
      'type' => 'text',
      'options' => array(label => 'Party price')));

$this->add(array(
      'name' => 'add_pizza',
      'type' => 'submit',
      'attributes' => array(
                            'value' => 'Add New Pizza',
                            'id' => 'submitbutton')));
    }
}
Run Code Online (Sandbox Code Playgroud)

add.phtml视图:

<?php
echo $this->headTitle('Add new Pizza');
?>

<div class="row">
    <div class="col-md-8"> <h1> Add new Pizza </h1>
</div>

<?php

$form = $this->form;
$form->setAttribute('action', $this->url('pizza',array('action'=>'add')));
$form->prepare();

echo $this->form()->openTag($form);
echo $this->formRow($form->get('pizza_name')) . "</br>";
echo $this->formRow($form->get('ingredients')) . "</br>";
echo $this->formRow($form->get('small_price')) . "</br>";
echo $this->formRow($form->get('big_price')) . "</br>";
echo $this->formRow($form->get('family_price')) . "</br>";
echo $this->formRow($form->get('party_price')) . "</br>";
echo $this->formRow($form->get('add_pizza')) . "</br>";
echo $this->form()->closeTag();
?>
Run Code Online (Sandbox Code Playgroud)

PizzaController.php:

<?php

namespace Pizza\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Pizza\Form\AddPizzaForm;
use Pizza\Model\Pizza;

class PizzaController extends AbstractActionController { 

protected $pizzaTable;

public function addAction() 
{
    $add_form = new AddPizzaForm(); 
    $request = $this->getRequest(); 
    if($request->isPost()) 
    { 
        $pizza = new Pizza();
        $add_form->setInputFilter($pizza->getInputFilter());
        $add_form->setData($request->getPost()); 

        if($form->isValid())
        { 
            $pizza->exchangeArray($form->getData()); 
            $this->getPizzaTable()->save($pizza); 
        }

        return $this->redirect()->toRoute('pizza');
    }

    return array('form' => $add_form); 

} 

public function getPizzaTable() 
{ 
    if( !$this->pizzaTable) 
    { 
        $sm = $this->getServiceLocator(); 
        $this->pizzaTable = $sm->get('Pizza\Model\PizzaTable');
    }
    return $this->pizzaTable; 
} 

} 
Run Code Online (Sandbox Code Playgroud)

edi*_*igu 6

欢迎来到stackoverflow!

你得到了那些奇怪的错误,因为有四个需要注意的重要细节.

答 -您的construct()方法AddPizzaForm名称和签名错误.您必须重命名construct__construct更改以下内容:

class AddPizzaForm extends Form 
{    
    public function __construct($name = null, $options = array() )
    {
        $formName = is_null($name) ? 'addpizza-form' : $name;
        parent::__construct($formName, $options);
    }

}
Run Code Online (Sandbox Code Playgroud)

B -init()在表单中创建一个方法,并在其中添加表单元素.官方文件中明确说明了这一细节:

如果要通过扩展Zend\Form\Form来创建表单类,则不能在__construct中添加自定义元素,而是在init()方法中添加.

所以,在你的情况下:

class AddPizzaForm extends Form 
{    
    // constructor etc..

    public function init()
    {
        $this->add(array(
            'name' => 'pizza_name',
            'type' => 'text',
            'options' => array(label => 'Pizza name')
            )
        );

        // ... add other for elements ...
    }

}
Run Code Online (Sandbox Code Playgroud)

C.最后,在您的控制器中,您尝试手动实例化您的表单:

$add_form = new AddPizzaForm();
Run Code Online (Sandbox Code Playgroud)

这也是不好的做法.您需要AddPizzaForm从ServiceManager 获取您的实例.这个细节也在文档中说明:

您不能直接实例化您的表单类,而是通过Zend\Form\FormElementManager获取它的实例.

要做到这一点,请AddPizzaFormmodule.config.php下面介绍您的内容:

'form_elements' => array(
    'invokables' => array(
        'add-pizza-form' => 'Pizza\Form\AddPizzaForm',
    )
)
Run Code Online (Sandbox Code Playgroud)

并在你的控制器中抓住它,如下所示:

$add_form = $this->getServiceLocator()->get('FormElementManager')->get('add-pizza-form');
Run Code Online (Sandbox Code Playgroud)

D -最后一件事是; 请阅读大部分的文件第一次做了一些实验前.阅读文档是在任何语言或框架中变得更好的最重要的一步.

希望能帮助到你.快乐的编码!

  • 干净整洁的答案!唯一一点,我没有看到@foozy是选项**c**.让你的表单不在``FormElementManager``上是不错的做法.这只是一种替代方法,可以请求不通过FCQN的表单,并使用较短的名称来调用它们. (2认同)