Zend 表单/子表单部分渲染

Posted

技术标签:

【中文标题】Zend 表单/子表单部分渲染【英文标题】:Zend form/subform partial render 【发布时间】:2012-11-07 05:53:13 【问题描述】:

我正在使用 Zend_Form 构建一个表单...我需要动态地向表单添加一些字段(jquery/ajax)...我为需要在运行时创建的每组字段创建了一个子表单... 要将我的元素放入具有正确名称的数组中,例如 subform1[index][element] ,我又添加了 2 个子表单: subform1 :呈现为字段集的包装器 subform2 : 播放名称中index 部分的容器 元素子表单:这是包含元素的主要子表单

对于每组新元素,subform2 和元素部分都会重复...

现在在视图中创建和呈现表单时一切正常,我得到了正确的名称 (subform1[index][element]) ...

但是当我使用 ajax 生成新元素时,我不知道如何呈现表单并获取具有正确名称的 subform2 部分...

这是创建子表单的函数:

    private function makeSubForm($id, $legend)
    
        $wrapper = new Zend_Form_SubForm();
        $wrapper->setOptions(array('legend' => $legend, 'class' => 'ui-corner-all multi_value'))
            ->setIsArray(true);

        $array = $this->_getArray($id);
        //-------------------------LOOP--------------------------
        $form_name = "Application_Form_Employ_$id";
//        var_dump($array);
        foreach ($array as $key => $value) 

            $form = new $form_name();

            $container = new Zend_Form_SubForm();
            $container->setOptions(array('class' => 'subform'))
                ->setIsArray(true)
                ->addSubForm($form, 'xxxxx');

            $wrapper->addSubForm($container, $key);
        
        Zend_Registry::get('session')->$id = $array;
        //----------------------------------------------------------

        $this->addSubForm($wrapper, $id);
    

这是我的行动方法:

    public function newElementAction()
    
        $this->_disableView();
        $id = $this->getRequest()->getParam('id');
        $form = new Application_Form_Employment();
        $params = array();
        $keys = Zend_Registry::get('session')->$id;
        $lastKey = end(array_keys($keys));
        $keys[++$lastKey] = array();

        $params[$id] = $keys;
//        var_dump($params);
        $form->create($params);
//        $form->render();

        $this->_response->appendBody($form->getSubForm($id)->getSubForm($lastKey));
    

使用此代码,我得到subform2[element] 作为我的名字... 但是如果我取消注释$form->render(); 我会得到subform1[subform2][subform1][subform2][element]

那么我怎样才能获得具有正确名称的第二个子表单的 html 呢?


好吧,我找到了一个 hack 来获得我想要的东西,但我正在寻找更好的方法......

public function newElementAction()

    $this->_disableView();
    $id = $this->getRequest()->getParam('id');
    $form = new Application_Form_Employment();
    $params = array();
    $keys = Zend_Registry::get('session')->$id;
    $lastKey = end(array_keys($keys));
    $keys = array(++$lastKey => array());

    $params[$id] = $keys;
    $form->create($params, $id);

    $this->_response->appendBody($form->$id);

我只创建了最后一个孩子并输出了父母 并在客户端在插入页面之前删除了父标记...

必须有一种可靠的方法来渲染子表单,其父索引完好无损!!??

【问题讨论】:

【参考方案1】:

您不需要子表单层来对动态字段进行分组。子表单的 setIsArray 属性将确保子表单元素将被分组到一个数组中。因此,根据 id,您将拥有 child1[element1]、child1[element2]、child2[element1]、child2[element2] 等。

我在here 中回答了类似的问题。也请查看pastebin。

【讨论】:

坦克,但我希望我的名字像 child[1][elementA],child[1][elementB],child[2][elementA],child[2][elementB]跨度>

以上是关于Zend 表单/子表单部分渲染的主要内容,如果未能解决你的问题,请参考以下文章

zend 框架子表单isValidPartial?

Zend Framework 调用表单作为表单中的子表单

检索 Zend 框架中的子表单元素?

你能在 Zend 子表单中添加错误装饰器吗?

对 Zend_Form 中的特定子表单使用自定义 isValid() 函数

Zend Validate - 你如何从不同的子表单传递上下文值?