Zend_Form + DHTML内容

时间:2009-02-03 22:06:42

标签: php zend-framework zend-form

dhtml内容动态添加到通过Zend_Form生成的表单的最佳方法是什么。例如,表示表单是这样创建的:

class formUser extends Zend_Form {
    public function __construct( $options = null ) {
        parent::__construct( $options );

        $page1 = new Zend_Form_Element_Text( 'page1' );
        $page1->setLabel( 'Page 1' );

        $submit = new Zend_Form_Element_Submit( 'submit' );
        $this->addElements( array( $page1, $submit ) );
    }
}

这里表单创建一个且只有一个名为“page1”的元素,但如果我想在视图中引入一个动态生成更多元素的“添加”按钮,如page2,第3页,第4页等,同时将它与Zend_Form集成?

Here is the effect I'm talking about

This isn't me, but he's got the same question and maybe worded it better

在我的情况下,它实际上是一个孩子和父母的关系。在这个区域周围,一个人可能有0或15个孩子,我不会抬起眉毛。

谢谢!

4 个答案:

答案 0 :(得分:2)

我现在没有时间详细介绍这个编码的细节,但是我会这样做:

由于您希望表单的结构(而不​​仅仅是它的数据)是可编辑的,因此您必须将其实例化并将其存储在会话中。

JavaScript不必仅生成一些额外的HTML标记,而是必须向服务器发出Ajax回调。单击“添加”按钮时,以此方式调用的操作将更改会话中的Zend_Form实例存储。然后,Ajax调用可以返回要插入的附加标记或整个表单标记的新版本。

在前一种情况下,您的JavaScript代码将确保以浏览器显示与服务器上的Zend_Form表示一致的方式插入标记。在后一种情况下 - 返回整个表单 - 用户输入必须在Ajax调用中传输,否则当表单被新版本替换时它将丢失。

答案 1 :(得分:1)

答案 2 :(得分:0)

完成任务的提示可能是定义一个隐藏的输入,您可以在添加新元素时增加'pageNb'。

然后过滤&验证您的表单,您可以使用循环在控制器中动态创建元素及其验证要求。

类似的东西:

// PHP

$userForm = new formUser();

for ($i = 0; $i < $_POST['pageNumber']; ++$i)
{
  $element = new Zend_Form_Element_Text('page' . $i);
  $element->addValidator('SomeValidator');

  $userForm->addElement($element);
}

if ($userForm->isValid($_POST]) 
{
 // bla bla bla
}

// Javascript

function addNewInput ()
{
   pageNb = document.getElementbyId('pageNb').value;
   pageNb.value = ++pageNb;
   // here put the trick to create a new node/input element.
   newElement.id = pageNb.value;
}

答案 3 :(得分:0)

我认为你不需要任何特殊的Zend来解决这个问题 - 你发布的javascript示例会在你想要它的页面中添加html,然后当你提交它时,你会在发布的数据上有你的数据页面都一样。只需确保遵循您在开始时使用的命名方案。你甚至可以使用数组

$element->setIsArray(true);

创建像这样的HTML

name="foo[]" id="foo"