这可能适用于在Symfony 1.4中生成表单吗?

时间:2011-09-30 19:33:06

标签: php forms symfony1

我目前正在尝试根据应用程序的模型在Symfony中生成表单元素。我知道下面的代码无效,但我希望它能显示我正在尝试做的事情。我真的碰到了它......我似乎无法理解我是如何利用表单库实现这一目标的。

$formElementArray = FormElementsTable::getInstance()->getElementList($advertiserID);
$formElements = array();
foreach ($formElementArray as $formElement)
{
  $formElements['name'] . => new sfWidgetForm.$formElements['type'] . (array('label' => $formElements['label'])),
}

$this->setWidgets(array($formElements));

我现在关注的是,这是不可能的,我应该放弃这个想法,也许写一个symfony组件,从模型中生成表单。这实际上相当简单,但我想我只是想在框架内保持尽可能深的原因。

感谢您的任何意见。

编辑:更多信息...

目的是能够使用数据库的某一行中出现的任何元素填充表单。例如,adsiserX可能需要名称,性别和头发颜色字段,而advertiserY需要名称,性别,体重和眼睛颜色字段。我需要能够即时生成那些,最好使用symfony的表单功能。

解决方案

这是表单的配置方式......

public function configure()
{

  $elements = Doctrine_Core::getTable('FormFields')->getElementsById(0);

  foreach ( $elements as $element )
  {
    $widgetName = $this->getWidgetName($element);
    $args = $this->getConstructorArguments($element);
    $widgets[$element->name] = new $widgetName($args);

    $validatorName = 'sfValidatorString';
    $validators[$element->name] = new $validatorName(array('required' => false));
  }


  $this->setWidgets($widgets);

  $this->setValidators($validators);

}

简单,对吧?我不应该过多考虑它。

2 个答案:

答案 0 :(得分:4)

从您的模型生成表单是最好的实践,因为如果您更改模型,您可能也想要更改表单。 Doctrine和Propel都支持这一点,所以不要重新发明方形轮:使用已存在的东西;)

<强>更新

在您的情况下,可能所有广告客户的模型都相同,您需要做的就是扩展表单以使表单中出现小变化。您的类将调用生成的表单的父方法,并稍微更改小部件和验证器。

答案 1 :(得分:1)

如果您打算存储填写用户表单时发送的数据(而不是表单),那么我认为您应该使用NoSQL系统,因为您的架构是动态的(当广告客户时它会发生变化变化)。阅读this blog post以了解有关它们的更多信息。另请阅读this SO post以了解symfony可以使用的内容。