0

フォームの情報をデータベースに保存しようとすると問題が発生します。選択したネットワーク内のすべてのシアターのシアター ID を手動で設定した後でも、フォームが有効に見えません。私のモジュールのactions.class.phpの関連部分は次のとおりです。

executeCreate()は次のとおりです。

public function executeCreate(sfWebRequest $request) {
    $this->form = $this->configuration->getForm();
    $this->showing = $this->form->getObject();
    $this->processCreateForm($request, $this->form);
    $this->setTemplate('new');
} 

そして今processCreateForm():

protected function processCreateForm(sfWebRequest $request, sfForm $form) {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

    $form_name = $form->getName();
    $parameters = $request->getParameter($form_name);
    $network_id = $parameters['network_id'];

    $theaters_list = Doctrine_Query::create()
            [...]
            ->execute();

    foreach ($theaters_list as $theater) {
        $form->getObject()->setTheaterId($theater->theater_id);
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

        if ($form->isValid()) {
            $showing = $form->save();
        } else {
            foreach ($form->getErrorSchema()->getErrors() as $key => $error) {
                echo '<p>' . $key . ': ' . $error . '</p>';
            }
        }
    }
    $this->getUser()->setFlash('update_success', true);
    $this->setTemplate('new');
}

出力は次のとおりです。

Theater_id 必須出力

ご協力ありがとうございました

4

1 に答える 1

2

ここで、コードを壊すと思われる奇妙なことが 2 つあります。

  1. メソッドを 2 回実行するbind()と、オブジェクトの値がリセットされる可能性があります。

  2. getObject()メソッドが参照によってオブジェクトを返すとは思わない。

したがって、実行すると:

    $form->getObject()->setX($val);
    $form->save();

次に、フォームによって返されたオブジェクトのフィールドを更新しますが、フォームにまだバインドされている元のオブジェクトを保存します。

次のようにしてみてください。

    $myObject = $form->updateObject()->getObject();
    $myObject->setX($value);
    $myObject->save();

updateObject()新しいオブジェクトを作成するためではなく、既存のオブジェクトを編集するためにフォームを使用する場合、これは重要です。これがないと、オブジェクトの古い値が取得されます。

ループで実行したい場合は、設定と保存の部分だけをループできます。したがって、次のようなものがありますprocessCreateForm

protected function processCreateForm(sfWebRequest $request, sfForm $form)
{
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

    if ($form->isValid()) { //You can check the validity of your form at this point.

        //Create $theatersList
        ...

        $myObject = $form->updateObject();

        foreach ($theatersList as $theater) {
            $myObject->setTheaterId($theater->theater_id);
            $showing = $myObject->save();

            //Do something with $showing

        }
    } else {
         //Print the errors.
    }
}

このコードを使用するtheatre_idと、フォーム内のウィジェットの設定を解除できます。これは、ユーザーが設定するべきではなく、フォーム検証の一部である必要がないためです。

編集

コードへのいくつかの変更:

protected function processCreateForm(sfWebRequest $request, sfForm $form)
{
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

    if ($form->isValid()) { //You can check the validity of your form at this point.

        //Create $theatersList
        ...

        $myObject = $form->updateObject();
        $myObjectVars = $myObject->toArray();

        foreach ($theatersList as $theater) {

            $myNewObject = new SomeClass();
            $myNewObject->fromArray($myObjectVars);
            $myNewObject->setTheaterId($theater->theater_id);
            $showing = $myNewObject->save();

            //Do something with $showing

            $myNewObject->free();
            unset($myNewObject);
        }
    } else {
         //Print the errors.
    }
}
于 2013-07-22T13:12:57.610 に答える