构建Zend表单以编辑自定义Zend Config ini文件

时间:2012-07-19 14:47:53

标签: forms zend-framework frameworks

我正在尝试使表单能够使用一些自定义设置编辑自定义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]"/>

有人能指出我正确的方向吗?

1 个答案:

答案 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