【问题标题】:Symfony forms or normal HTML formsSymfony 表单或普通 HTML 表单
【发布时间】:2010-09-30 11:23:33
【问题描述】:

我正在使用 Symfony 1.4 创建项目,我需要根据来自数据库的问题集类型创建动态表单。我在我的项目的其余部分使用了 Symfony 表单,但在这种情况下,使用 symfony 表单似乎很困难,因为我需要动态表单。 在 symfony 项目中使用普通的 HTML 表单是否安全,或者建议使用 Symfony 表单。所以需要你的帮助。

【问题讨论】:

  • 你能提供更多关于你想要做什么的信息吗? “动态”形式——它们是如何动态的?无论你想做什么,Symfony 几乎都可以做到。
  • @jeremy ,对不起,我不能解释得非常清楚。我的意思是动态表单是......该表单将在运行时根据数据库创建......就像它有n个选择一样。 ..元素类型(即HTML元素)将根据问题类型而变化(如果单选则选择元素,如果多选则复选框..)我希望它很清楚..
  • 以前我用的是经典的 PHP,做同样的事情..当时我用 PHP 代码创建了这些问题集表单......并且也使用了 javascript..
  • 我的回答展示了如何根据问题的类型创建不同的小部件和验证器。

标签: forms symfony1 symfony-forms


【解决方案1】:

你可以使用 html 表单,但它会绕过 symfony 的表单验证系统。

您仍然可以通过创建输入小部件并将其添加到当前表单或操作中的新表单来构建动态表单。然后,您可以在模板中回显表单,动态生成的字段也将成为表单的一部分。

如果您从 lib/forms 中的 MyForm.class.php 开始,请确保添加:

$this->validatorSchema->setOption('allow_extra_fields', true);

否则,您将自动收到验证错误。如果您想在操作中向表单添加字段,您可以执行以下操作:

$this->form = new MyForm();
$widgetSchema = $this->form->getWidgetSchema();
$widgetSchema['add_field'] = new sfWidgetFormInputText();

当您回显表单时,“add_field”输入将被添加到其中。

【讨论】:

  • 我会试试这个,因为我想在运行时添加 HTML 元素并且不会丢失 Symfony 表单验证系统..
【解决方案2】:

获得更多关于你正在做什么的信息会有所帮助,但这是在 Symfony 中动态表单的一种方式。此代码根据问题的“类型”为调查动态创建小部件和验证器:

class SurveyAnswerForm extends BaseSurveyAnswerForm
{
  public function configure()
  {
    $question = $this->object->Question;

    $method = sprintf('createWidgetAndValidatorFor%sInputType', $question->type);
    $this->$method($question);
    $this->getWidget('value')->setOption('label', $question->question);
    $this->getValidator('value')->setOption('required', $question->required);
  }

  protected function createWidgetAndValidatorForTextFieldInputType(Question $question)
  {
    $this->setWidget('value', new sfWidgetFormInputText());
    $this->setValidator('value', new sfValidatorString());
  }

  protected function createWidgetAndValidatorForTextAreaInputType(Question $question)
  {
    $this->setWidget('value', new wfWidgetFormTextareaAutosize());
    $this->setValidator('value', new sfValidatorString());
  }

  //etc. for as many types as you require
}

注意:虽然这个答案是来自我的一个项目的代码,但它深受 SymfonyExperts 上的this answer 的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多