[英]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.