0

我有一个基于名为“因子”的模型类的通用形式。在该表单中,有一个名为“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_id 设置为数据库中已经存在的客户 ID。我该如何管理?

4

3 回答 3

1

我认为您的 Web 应用程序的逻辑存在问题.. 在我看来,问题在于您没有一个好的做法。世界上有同名同姓的人,遇到这种情况你会怎么做?或者,如果买家输入了错误的一个字母或者如果一个坏人输入了别人的名字和姓氏。如果你做了一个唯一的用户名字段,那么我认为如果你注册会很好,这样你就可以避免这个问题,你只需在隐藏字段中以因子形式设置 user_id。有一个很棒的插件可以代替你做所有事情sfForkedDoctrineApplyPlugin

于 2012-09-04T21:22:51.537 回答
0

我建议您不要使用嵌入式表单。取而代之的是,使用没有 customer_id 的简单因子表单(使用 unset 或 useFields)和简单的客户表单。在 actions.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 :)

问题很简单,可以通过轻松取消设置嵌入式客户表单和更新因子表单对象来解决。

我在 actions.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 回答