2

将新的 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、page3、page4 等,同时将其与Zend_Form ?

这就是我说的效果

这不是我,但他有同样的问题,也许措辞更好

就我而言,它实际上是一个孩子和父母的关系。在这个区域附近,一个人可能有 0 或 15 个孩子,我不会挑眉。

谢谢!

4

4 回答 4

2

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

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

除了生成一些额外的 HTML 标记之外,您的 JavaScript 还必须对您的服务器进行 Ajax 调用。单击“添加”按钮时以这种方式调用的操作将更改Zend_Form会话中的实例存储。然后,Ajax 调用可以返回要插入的附加标记或整个表单标记的新版本。

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

于 2009-02-06T13:41:54.817 回答
1

在这里很好地描述了“cg”答案的实现。 http://www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/

于 2009-03-22T16:10:19.753 回答
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;
}
于 2009-02-04T00:46:36.833 回答
0

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

$element->setIsArray(true);

像这样创建 HTML

name="foo[]" id="foo"
于 2009-02-04T05:21:51.817 回答