Zend Framework / Form Element呈现为文本框而不是下拉框

时间:2011-08-22 22:31:25

标签: zend-framework drop-down-menu zend-form-element zend-config

我在config.ini文件中有以下内容:(Zend_Form_Element)

site_status.name = "site_status"
site_status.type = "select"
site_status.label = "Status"
site_status.options.multiOptions.active.key = "Active"
site_status.options.multiOptions.active.value = "Active"
site_status.options.multiOptions.active.key = "Inactive"
site_status.options.multiOptions.active.value = "Inactive"

正如您所看到的,这应该是一个下拉(选择)框,但它被渲染为标准文本框。我做错了什么?

- >修改

我不是将元素绑定到表单,而是尝试将它们绑定到数据库:在我的代码中,它看起来像这样:

[{tablename}] // the table name would represent a section in the ini
{column}.name = "{column_name/form_field_id}";
{column}.type = "{form_element_type}"
{column}.label = "{form_element_label}"
...

从那里我将拉入表单将表示数据的数据库表(必要时为一个或多个表)。至于这种方法的推理是(在路上),我想定义(通过ini或其他一些存储方法),一个配置文件,它将是属于特定形式的字段/元素列表(非程序员类型可以轻松编辑),'通用'表单类将读取,拉入元素信息,并动态创建表单。

我确实意识到这会带来另一个我尚未想到的问题,那就是如何对select元素使用表查找(没有将查找的数据库检索编码到表单中,以便非用户可以很容易地定义它而不需要任何编程,纯粹的配置,但这是一个完整的其他主题,不是我的问题的一部分。(我认为无论如何我对问题的这一部分有可行的想法/解决方案) - 额外的配置条目和几乎是一个通用例程。

我希望这能澄清我的思维过程,并说明我为什么这样做,就像我在上面的例子中一样。

1 个答案:

答案 0 :(得分:1)

我还没有使用Zend_Config来构建Zend_Form的实例。

但是看一下代码表明Zend_Form::addElement()没有直接将Zend_Config实例作为参数。相反,您似乎需要将Zend_Config实例传递给表单构造函数。为了将配置密钥映射到setXXX()调用,似乎配置格式需要更深一些。

path/to/config/myForm.ini

[myForm]

myForm.elements.site_status.name = "site_status"
myForm.elements.site_status.type = "select"
myForm.elements.site_status.label = "Status"
myForm.elements.site_status.options.multiOptions.active.key = "Active"
myForm.elements.site_status.options.multiOptions.active.value = "Active"
myForm.elements.site_status.options.multiOptions.inactive.key = "Inactive"
myForm.elements.site_status.options.multiOptions.inactive.value = "Inactive"

然后实例化:

$formConfig = new Zend_Config_Ini('path/to/config/myForm.ini', 'myForm');
$form = new Zend_Form($formConfig);

未经测试,但查看此示例:

Using Zend_Form with Zend_Config - Andrew Vayanis

感觉它应该像上面那样。

<强>更新

鉴于@Aaron的意见/反馈,还有两种方法。

  1. 我们可以扩展Zend_Form,实现一个名为addElementByConfig的方法,我们将在其中传递描述元素本身的浅Zend_Config实例。实际上,我们甚至可以覆盖addElement(),采用递归方法:如果第一个参数是Zend_Config的实例,则使用组件数据调用addElement()

    < / LI>
  2. 如果原子性和可重用性是我们使用Zend_Config来描述元素的主要好处,那么我们可能只需要创建一个自定义元素Zend_Form_Element。然后我们可以以任何形式使用这些元素。