我正在尝试使表单能够使用一些自定义设置编辑自定义config.ini文件,我试图动态执行此操作,因此如果我在配置文件中添加另一行,则显示在编辑表单,或者更准确地说,我将使用扩展名系统,其中新扩展可以在此config.ini文件中添加行。但是,我对字段名称很难,所以对于这样的en配置文件:
[production]
db.adapter = "pdo_mysql"
db.params.host = "localhost"
db.params.username = "user"
db.params.password = "123456"
db.params.dbname = "zend"
我需要为每个参数设置相应的字段,如下所示:
<input type="text" name="db[adapter]"/>
<input type="text" name="db[params][host]"/>
<input type="text" name="db[params][username]"/>
<input type="text" name="db[params][password]"/>
<input type="text" name="db[params][dbname]"/>
那么自动构建此表单的最简单方法是什么?
我已经创建了一个自定义Zend_Form,并以这种形式,使用Zend_Config获取配置文件, 并循环通过设置为每个参数创建一个文本字段,但我喜欢名称遵循与ini文件相同的模式,如上例所示,但我可以得到的是:
<input type="text" name="params[host]"/>
<input type="text" name="params[username]"/>
<input type="text" name="params[password]"/>
<input type="text" name="params[dbname]"/>
有人能指出我正确的方向吗?
答案 0 :(得分:0)
我不使用Zend_form所以我不是回答的合适人选,但是因为我已经做了类似的事情,我可以在我的应用程序中更改配置,无论如何我都试了一下。我个人会在一个view-helper中直接生成html-form而不使用Zend_form,但是如果你想使用Zend_form,那么Zend_sub_form就好了。我知道下面的代码并不是完全正确的,它应该引导你在路上一点点。
/**
* The action
*/
public function configAction(){
//get the zend config from file or from registry and cast it as an array
$config = Zend_Registry::get('config');
$config = $config->toArray
//create the form and a new subform for each part of the config array
$form = new Zend_Form();
foreach ($config as $key=>value){
$form = self::generateSubForm($key, $value, $form);
}
$this->view->form = $form;
}
/**
* Generates all subforms
*/
private function generateSubForm($key, $value, $form){
//generate a subform for this key if needed
if(!is_object($form->getSubForm($key)){
$$key = new Zend_Form_SubForm();
$form->addSubForm($$key, $key);
} else {
$$key = $form->getSubForm($key);
}
//if the value is an array, we must go deeper
//Else we create a textelement and go on the next one
if(is_array($value){
$form = self::generateSubForm($key, $value, $form->getSubForm($key));
} else{
$form->getSubForm($key)->addElement('text', 'value');
$form->getSubForm($key)->$key->setValue($value);
}
return $form;
}
这应该生成一个看起来像这样的表单
<input type="text" name="phpSettings[date][timezone][value]" value="Europe/Stockholm">
<input type="text" name="phpSettings[display_startup_errors][value]" value="0">
<input type="text" name="phpSettings[display_errors][value]" value="0">
来自看起来像这样的配置
phpSettings.date.timezone =“Europe / Stockholm”
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0