我在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或其他存储方法),一个配置文件,它将是属于特定表单的字段/元素列表(非程序员类型可以轻松编辑),"泛型"表单类将读取,拉入元素信息,并动态创建表单。
我确实意识到,然而这提出了另一个问题,我还没有弄清楚,那就是如何使用表查找选择元素(没有编码数据库检索查找到的形式,这样一个非用户可以很容易地只是定义它没有任何编程,纯粹的配置,但这是一个完整的其他主题不是我的问题的一部分在这里。(我认为我有可行的想法/解决方案的那部分问题)——额外的配置项和一个通用的例程。
我希望这能澄清我的思考过程,以及为什么我在上面的例子中这样做。
我还没有使用Zend_Config
来构建Zend_Form
的实例。
但是查看代码可以发现,Zend_Form::addElement()
并没有直接将Zend_Config
实例作为参数。相反,看起来您需要将Zend_Config
实例传递给表单构造函数。似乎配置格式需要更深一点,以便将配置键映射到setXXX()
调用。
In 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);
没有测试,但是看看这个例子:
使用Zend_Form与Zend_Config - Andrew Vayanis
感觉应该像上面那样。
考虑到@Aaron的评论/反馈,还有两个方法。
我们可以扩展
Zend_Form
,实现一个类似addElementByConfig
的方法,在这个方法中,我们将传递描述元素本身的浅Zend_Config
实例。事实上,我们甚至可以直接覆盖addElement()
,采用递归方法:如果第一个参数是Zend_Config
的实例,那么使用组件数据调用addElement()
。如果原子性和可重用性是我们在使用
Zend_Config
来描述元素时所寻求的主要好处,那么也许我们只是创建一个扩展Zend_Form_Element
的自定义元素。然后我们可以在任何我们想要的形式中使用这些元素。