我目前正在尝试根据应用程序的模型在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);
}
简单,对吧?我不应该过多考虑它。
答案 0 :(得分:4)
从您的模型生成表单是最好的实践,因为如果您更改模型,您可能也想要更改表单。 Doctrine和Propel都支持这一点,所以不要重新发明方形轮:使用已存在的东西;)
<强>更新强>
在您的情况下,可能所有广告客户的模型都相同,您需要做的就是扩展表单以使表单中出现小变化。您的类将调用生成的表单的父方法,并稍微更改小部件和验证器。
答案 1 :(得分:1)
如果您打算存储填写用户表单时发送的数据(而不是表单),那么我认为您应该使用NoSQL系统,因为您的架构是动态的(当广告客户时它会发生变化变化)。阅读this blog post以了解有关它们的更多信息。另请阅读this SO post以了解symfony可以使用的内容。