0

私のZendアプリケーションでは、テーブルごとに個別のモデルがあり、データは次を使用して取得されますTableGateway

ここで、編集ページを作成するフォームを実装する必要があります。http://framework.zend.com/manual/2.2/en/user-guide/forms-and-actions.htmlに記載されているように、1つのテーブル/モデルのフォームを作成できました

これが私の編集アクションです-

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

この編集アクションは、フォームを 1 つのテーブル (CandidateTable) にバインドします。しかし、私のアプリケーションでは、そのページには複数のテーブル (CandidateSkills、CandidateQualifications など) からのデータがあります。送信をクリックすると、データが別のテーブルに保存されます。

4

1 に答える 1

1

setFromArrayを使用できます

行オブジェクトをフェッチし、setFromArrayを保存してコミットするだけです。

フォームの値を入力するには、populate メソッドを使用します。この値の入力と取得を参照してください。

$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 Framework 2 の場合、 bind を使用してデータを入力できますオブジェクトのバインド

ドキュメントから直接

オブジェクトをフォームに 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 に答える