0

'factor'という名前のモデルクラスに基づく一般的な形式があります。そのフォームには、「customer」という名前のモデルクラスに基づく「customer」という名前の埋め込みフォームがあります。

これが私のschema.ymlの関連部分です:

factor:
  actAs:
    Timestampable: ~
  columns:
    customer_id: {type: bigint}
    final_sum: {type: Integer}
  relations:
    customer: {local:customer_id, foreign:id, alias: customer, foreignAlias:factors}

customer:
  columns:
    name: {type: string(255), notnull:true, unique:true}

ユーザーが一般フォームを送信するときに、customer_nameがcustomerテーブルに存在するかどうかを確認します。存在する場合は、列の一意性のエラーにつながるため、埋め込みフォーム「customer」を保存しないようにします。代わりに、ファクターcustomer_idをdbにすでに存在するcustomerのIDに設定する必要があります。どうすればこれを管理できますか?

4

3 に答える 3

1

私はあなたのウェブアプリケーションの論理に問題があると思います..私の意見では、問題はあなたが良い習慣がないということです。世界には同じ名前と名前の人がいますが、この場合はどうしますか?または、購入者が自分の名前の間違った1文字を入力した場合はどうなりますか?または、悪者が他の人の名前と名前を入力した場合。一意のユーザー名フィールドを作成した場合は、登録するとよいと思いますので、この問題を回避し、隠しフィールドに因子形式でuser_idを設定するだけです。sfForkedDoctrineApplyPluginの代わりにすべてを実行する素晴らしいプラグインがあります。

于 2012-09-04T21:22:51.537 に答える
0

埋め込みフォームでは使用しないことをお勧めします。その代わりに、customer_idのない単純な因子フォーム(unsetまたはuseFieldsを使用)と単純な顧客フォームを使用します。アクション.class.phpのこのようなもの:

$this->factorForm = new SimpleFactorForm; // (without customer_id)
$this->customerForm = new CustomerForm; // 

if($request->getMethod() == sfRequest::POST) {
  $this->factorForm->bind($request->getPostParameter($this->factorForm->getName());
  $this->customerForm->bind($request->getPostParameter($this->customerForm->getName());

  if(($this->customerForm->isValid()) && ($this->factorForm->isValid()) ) {
    // customer unique validation -- create or find a uniqueCustomerObject
    // something like
    $uniqueCustomerObject = Doctrine::getTable('customer')->findOneBy('name',$this->customerForm->getValue('name'));
    if(!$uniqueCustomerObject) $uniqueCustomerObject=$this->customerForm->save();

    $this->factorForm->getObject()->setCustomer($uniqueCustomerObject);
    $factor = $this->factorForm->save();
  }
}

そして、もちろん、あなたのテンプレートでは:

<form method="post">
 <?php echo $factorForm; ?>
 <?php echo $customerForm; ?>

</form>
于 2012-09-04T19:01:28.457 に答える
0

ありがとうdenys281とglerendegui:)

問題は単純で、埋め込まれた顧客フォームの設定を簡単に解除し、ファクターフォームオブジェクトを更新することで解決できます。

アクション.class.phpファイルのprocessForm関数に次の行を追加しました。

$pFactor=$form->getObject();

$customer=Doctrine_Query::create()->from('customer c')->where('c.name=?',$form['customer']['name']->getValue())->execute();

if(!empty($cus[0]))
{
    $pFactor->setCustomer($cus[0]);
    unset($form['customer']);
}

$form->save();
于 2012-09-05T17:56:14.653 に答える