如何防止symfony中的表单保存?

时间:2012-09-04 08:03:17

标签: php symfony1 symfony-1.4 symfony-forms

我有一个基于名为'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表中是否存在customer_name,如果是,我希望不保存嵌入表单'customer',因为它会导致列唯一性错误! 相反,我应该将因子customer_id设置为db中已存在的客户的id。 我怎么能管理这个?

3 个答案:

答案 0 :(得分:1)

我认为您的网络应用程序的逻辑存在问题。在我看来,问题是您没有良好做法。世界上有人,同名和姓氏,在这种情况下你会做什么?或者,如果买家输入了他的名字错误的一个字母或者如果坏人输入别人的姓名。如果您创建了一个唯一的用户名字段,那么我认为如果您进行注册会很好,所以您将避免此问题,并且您只需在隐藏字段中将因子形式设置为user_id。有一个很棒的插件可以完成所有事情而不是你sfForkedDoctrineApplyPlugin

答案 1 :(得分: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>

答案 2 :(得分: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();