我有一个基于名为'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。 我怎么能管理这个?
答案 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();