0

在我的 Zend 应用程序中,我为每个表都有单独的模型,并使用以下方法检索数据TableGateway

现在我需要实现表单来创建编辑页面。我可以创建一个表格/模型的表格,如http://framework.zend.com/manual/2.2/en/user-guide/forms-and-actions.html中所述

这是我的编辑操作-

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();

此编辑操作将表单与一个表 (CandidateTable) 绑定。但在我的应用程序中,该页面包含来自多个表(CandidateSkills、CandidateQualifications 等)的数据。当我单击提交时,它应该将数据保存在单独的表中。

4

1 回答 1

1

您可以使用setFromArray

您获取行对象,而不仅仅是setFromArray并保存、提交。

要填充表单值,请使用填充方法,请参阅此填充和检索值

$form = new My_Form_Edit();
if( !$this->getRequest()->isPost() )// If the form isn't posted than populate the value
{
  $form->populate($myArrayValueToPopulate);//$myArrayValueToPopulate this is your array to populate for the form
  return;
}

// Than check validation and save data

对于 zend 框架 2,您可以使用 bind 填充数据绑定对象

直接来自文档

当您将对象绑定到表单时,会发生以下情况:

  • 组合的 Hydrator 对对象调用 extract(),并使用返回的值(如果有)来填充所有元素的值属性。如果表单包含一个本身包含另一个字段集的字段集,则该表单将递归提取值。
  • 调用 isValid() 时,如果之前未设置 setData(),则表单使用组合的 Hydrator 从对象中提取值,并在验证期间使用这些值。
  • 如果 isValid() 成功(并且启用了 bindOnValidate 标志,默认情况下为 true),则 Hydrator 将传递经过验证的值以用于对绑定对象进行水合。(如果您不希望这种行为,请调用 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
}
于 2013-09-03T09:59:12.767 回答