繁体   English   中英

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

[英]How to prevent form saving in symfony?

我有一个基于名为“ 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。 我该如何管理?

我认为您的Web应用程序逻辑存在问题。.我认为,问题是您没有良好的实践习惯 世界上有同名同姓的人 ,在这种情况下您会怎么做? 或者,如果买家输入了错误的姓名字母 或者,如果有坏人输入别人的名字和姓氏 如果您创建了唯一的用户名字段,那么我认为进行注册会很好,因此可以避免此问题,您只需在隐藏字段中以因子形式设置user_id。 有一个很棒的插件可以代替您sfForkedDoctrineApplyPlugin来完成所有工作

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM