Forms 在symfony中,分两步填写表单的正确性是什么?

Forms 在symfony中,分两步填写表单的正确性是什么?,forms,symfony1,doctrine,Forms,Symfony1,Doctrine,Hy 在symfony中,分两步填写表单的正确性是什么?假设我们有一个名为Enterprise的实体,我们希望创建一个只包含必填字段和另一个表单的表单,当用户登录时,可以填充其他非必填字段 正确性表格是怎样的?现在我有一个要注册的表单('lib/form/doctor/enterpriseeform.class.php')和另一个('lib/form/doctor/enterpriseecompleteform.class.php')。在每个类中,我们设置标签、验证器。。。但问题在于第二种形式。

Hy

在symfony中,分两步填写表单的正确性是什么?假设我们有一个名为Enterprise的实体,我们希望创建一个只包含必填字段和另一个表单的表单,当用户登录时,可以填充其他非必填字段

正确性表格是怎样的?现在我有一个要注册的表单('lib/form/doctor/enterpriseeform.class.php')和另一个('lib/form/doctor/enterpriseecompleteform.class.php')。在每个类中,我们设置标签、验证器。。。但问题在于第二种形式。当我尝试提交时,它会给我一个错误,因为我并没有发布模型中定义的必填字段。我该怎么做?这样对吗?我怎样才能解决这个问题


谢谢。

您应该在第二个表单中取消设置每个不需要的表单字段(当然,您应该保留一个带有记录ID的隐藏字段)。
基本上,您只需使用第二个表单更新记录,以便数据库中的每个必填字段都已作为值

如果你把第二张表格的代码贴出来会有帮助的

总之,您的方法是有效的(也许有更好的方法我不知道),只要确保您的代码是正确的


编辑:

protected function processRegisterForm(sfWebRequest $request, sfForm $form,$route)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));    
    if ($form->isValid())
    {
      $customer = $form->save();  
      $this->redirect('customer/'.$route);
    }
  }
因此,如果我理解正确,那么代码中使用的表单将更新现有对象。您应该将此对象传递给表单,因为表单知道该对象已经存在,并且可以相应地验证值:

public function executeStepOne(sfWebRequest $request){
    $this->customer = Doctrine::getTable('Customer')->find(1);
    $this->forward404Unless($this->customer);

    $this->form = new CustomerFormStepOne($this->customer);

    if ($request->isMethod(sfRequest::POST)){
        $this->processRegisterForm($request, $this->form,'paso2'); 
}
对于重复键错误,如果此表的主键自动递增,请检查您的数据库定义。

好的,Felix,我对它进行“取消设置”更改,它工作正常。。。但我有个问题。我尝试对同一个动作进行更新。我的代码是这样的

在行动中

 public function executeStepOne(sfWebRequest $request){
    $this->form = new CustomerFormStepOne();

    if ($request->isMethod(sfRequest::POST)){
        $this->processRegisterForm($request, $this->form,'paso2');

    }else{
        $this->customer = Doctrine::getTable('Customer')-> find(1);
                $this->forward404Unless($this->customer);
    }   
  }
其中ProcessRegisterPerform代码为:

protected function processRegisterForm(sfWebRequest $request, sfForm $form,$route)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));    
    if ($form->isValid())
    {
      $customer = $form->save();  
      $this->redirect('customer/'.$route);
    }
  }

如果我尝试这样做,他们会返回一个错误“主键重复”。

下次您应该编辑您的问题,而不是自己回答。无论如何:这是第一个formstep,您只显示必需的字段,对吗?你的模板看起来怎么样<代码>原则::getTable('Customer')->find(1)在我看来是错误的,因为您总是使用ID 1加载客户。很抱歉,Felix,下次我将编辑我的问题;)是的,我知道只加载代码等于1的客户(此代码是测试和测试的结果,当然是不正确的)。不,这个表单只显示两个字段(不是第一个表单),在我的模板中,我只有两个字段和showHiddenFields()语句。我看到生成的代码,有一个customercode字段有值,但问题是当它们验证时:它们确实正确,但(通过验证),但向我打印一个错误“primary_key duplicate”或类似错误。。。非常感谢菲利克斯。