我在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元素使用表查找(没有将查找的数据库检索编码到表单中,以便非用户可以很容易地定义它而不需要任何编程,纯粹的配置,但这是一个完整的其他主题,不是我的问题的一部分。(我认为无论如何我对问题的这一部分有可行的想法/解决方案) - 额外的配置条目和几乎是一个通用例程。
我希望这能澄清我的思维过程,并说明我为什么这样做,就像我在上面的例子中一样。
答案 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的意见/反馈,还有两种方法。
我们可以扩展Zend_Form
,实现一个名为addElementByConfig
的方法,我们将在其中传递描述元素本身的浅Zend_Config
实例。实际上,我们甚至可以覆盖addElement()
,采用递归方法:如果第一个参数是Zend_Config
的实例,则使用组件数据调用addElement()
。
如果原子性和可重用性是我们使用Zend_Config
来描述元素的主要好处,那么我们可能只需要创建一个自定义元素Zend_Form_Element
。然后我们可以以任何形式使用这些元素。