Php Zend表单与多个表的绑定
在我的Zend应用程序中,每个表都有单独的模型,使用Php Zend表单与多个表的绑定,php,forms,zend-framework2,Php,Forms,Zend Framework2,在我的Zend应用程序中,每个表都有单独的模型,使用TableGateway 现在我需要实现表单来创建编辑页面。我可以创建一个表/模型的形式,如中所述 这是我的编辑操作- public function editAction() { $id = (int) $this->params()->fromRoute('id', 0); if (!$id) { return $this->redirect()->toRoute('candidat
TableGateway
现在我需要实现表单来创建编辑页面。我可以创建一个表/模型的形式,如中所述
这是我的编辑操作-
public function editAction()
{
$id = (int) $this->params()->fromRoute('id', 0);
if (!$id) {
return $this->redirect()->toRoute('candidate', array(
'action' => 'index'
));
}
try {
$candidate = $this->getCandidateTable()->getCandidate($id);
}
catch (\Exception $ex) {
return $this->redirect()->toRoute('candidate', array(
'action' => 'index'
));
}
$form = new CandidateForm();
$form->bind($candidate);
$form->get('submit')->setAttribute('value', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) {
$form->setInputFilter($candidate->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$this->getCandidateTable()->saveCandidate($candidate);
return $this->redirect()->toRoute('candidate');
}
}
return array(
'id' => $id,
'form' => $form,
);
}
编辑视图-
<?php
$title = 'Edit Candidate';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
<?php
$form = $this->form;
$form->setAttribute('action', $this->url(
'candidate',
array(
'action' => 'edit',
'id' => $this->id,
)
));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('title'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
你可以用
获取row对象,然后仅setFromArray并保存、提交
要填充表单值,请使用“填充”方法,请参见
对于zend framework 2,您可以使用bind来填充数据
直接来自文档
将()对象绑定到窗体时,会发生以下情况:
- OR对对象调用extract(),并使用返回的值(如果有)填充所有元素的值属性。如果表单包含一个本身包含另一个字段集的字段集,则该表单将递归提取值
- 调用isValid()时,如果之前未设置setData(),则表单使用OR从对象中提取值,并在验证期间使用这些值
- 如果isValid()成功(并且启用了bindOnValidate标志,默认情况下为true),则将向水合器传递用于水合绑定对象的已验证值。(如果不希望出现这种行为,请调用setBindOnValidate(FormInterface::BIND_MANUAL))
- 如果对象实现Zend\InputFilter\InputFilterAwareInterface,则将使用它所组成的输入过滤器,而不是表单上所组成的输入过滤器
这在实践中更容易理解
$contact = new ArrayObject;
$contact['subject'] = '[Contact Form] ';
$contact['message'] = 'Type your message here';
$form = new Contact\ContactForm;
$form->bind($contact); // form now has default values for
// 'subject' and 'message'
$data = array(
'name' => 'John Doe',
'email' => 'j.doe@example.tld',
'subject' => '[Contact Form] \'sup?',
);
$form->setData($data);
if ($form->isValid()) {
// $contact now looks like:
// array(
// 'name' => 'John Doe',
// 'email' => 'j.doe@example.tld',
// 'subject' => '[Contact Form] \'sup?',
// 'message' => 'Type your message here',
// )
// only as an ArrayObject
}
这是一个编辑表单。所以我需要在初始加载时用数据填充表单。我怎么能用这个?你能给我举个例子吗?谢谢。是$form->populateValues吗?@ChamingaD我看到你在使用zend framework 2,所以我再次更新了我的答案
$contact = new ArrayObject;
$contact['subject'] = '[Contact Form] ';
$contact['message'] = 'Type your message here';
$form = new Contact\ContactForm;
$form->bind($contact); // form now has default values for
// 'subject' and 'message'
$data = array(
'name' => 'John Doe',
'email' => 'j.doe@example.tld',
'subject' => '[Contact Form] \'sup?',
);
$form->setData($data);
if ($form->isValid()) {
// $contact now looks like:
// array(
// 'name' => 'John Doe',
// 'email' => 'j.doe@example.tld',
// 'subject' => '[Contact Form] \'sup?',
// 'message' => 'Type your message here',
// )
// only as an ArrayObject
}