【问题标题】:Zend_Form + DHTML contentZend_Form + DHTML 内容
【发布时间】:2009-02-03 22:06:41
【问题描述】:

向通过 Zend_Form 生成的表单动态添加 NEW dhtml 内容的最佳方式是什么?例如,假设表单是这样创建的:

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 集成?

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 个孩子,我不会挑眉。

谢谢!

【问题讨论】:

  • 您能否发布一个用例或更多信息,说明您何时/为什么想要/需要添加 page1、page2 等?
  • 我发布了一个示例页面

标签: php zend-framework zend-form


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

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

      $element->setIsArray(true);
      

      像这样创建 HTML

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

      【讨论】:

        【解决方案4】:

        完成任务的提示可能是定义一个隐藏输入,您可以在其中增加新元素时的“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;
        }
        

        【讨论】:

        • 我对它的 dhtml 或 javascript 方面感兴趣。没有页面加载
        猜你喜欢
        • 2012-04-20
        • 2011-12-02
        • 2011-04-13
        • 2011-01-08
        • 2010-11-28
        • 2011-07-31
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多