0

我正在尝试制作一个能够编辑带有一些自定义设置的自定义 config.ini 文件的表单,我正在尝试动态执行此操作,因此如果我在配置文件中添加另一行,它会显示在编辑表单上,或者更准确地说,我将把它与类似系统的扩展一起使用,其中新的扩展可以在这个 config.ini 文件中添加行。但是,我很难使用字段名称,所以对于这样的 en config 文件:

[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]"/>

谁能指出我正确的方向?

4

1 回答 1

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 = "欧洲/斯德哥尔摩"

phpSettings.display_startup_errors = 0

phpSettings.display_errors = 0

于 2012-07-19T23:26:06.073 回答