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)
欢迎来到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获取它的实例.
要做到这一点,请AddPizzaForm在module.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 -最后一件事是; 请阅读大部分的文件第一次做了一些实验前.阅读文档是在任何语言或框架中变得更好的最重要的一步.
希望能帮助到你.快乐的编码!