2011-06-11 55 views
1

我正在关注this线程来创建表单,并且当表单元素的数目已知时它正在工作。现在我必须根据用户选择创建表单域。如何在zend中创建表单

例如:

<?php 

class Form_MyForm extends Zend_Form { 

    public function __construct($options = null) { 

     parent::__construct($options); 

     // Set the method for the display form to POST 
     $this->setMethod('post'); 

     $elements = array(); 

     // Get user input to create elements 
     $fields = $options['columns']; 

     // Create form elements 
     for($i = 0; $i < count($fields); $i++) { 
      $element = $this->CreateElement('text', 'field'.$i); 
      $element->setLabel($fields[$i]['name']); 
      $elements[] = $element; 
     } 

     $this->addElements($elements); 
     $this->setElementDecorators(array('ViewHelper')); 
     $this->setDecorators(array(array('ViewScript', array('viewScript' => 'myform-form.phtml')))); 

    } // end construct 


} // end class 
?> 

I can render each element separately但现在我不知道如何通过循环来呈现myForm的-form.phtml这些元素。我不得不循环,因为号字段没有在开始时知道..

感谢

+0

我不完全Zend_Form的行家(其实我恨它),但也许你应该将你的代码移动到另一个方法中(比如'configureForm()'并让它接受一个字段数量的参数? – netcoder 2011-06-11 20:34:38

+0

你的'$ columns'变量是什么?我看不到它在哪里创建。 – Marcin 2011-06-12 01:39:23

+0

@Marcin :对不起,它是错字,它实际上是** $ field **数组,它包含表单域的标签,例如:'array('FirstName' ,'LastName','BirthDate');'请再次查看问题。谢谢 – Student 2011-06-12 04:46:44

回答

1

应该使用这样的 (没有测试)

<? 
foreach ($this->element->getElements() as $element){ 
    echo $this->{$element->helper}(
     $element->getName(), 1, $element->getAttribs() 
    ) 
} 
?> 

$this->element应该是你的形式

0

旁注开始:这是典型的做这一切在init()方法,而不是覆盖表单构造函数。但这不是什么大不了的事情。

回复:在myform-form.phtml,好像你可以调用$this->getOption('columns'),然后执行foreach循环来再现元素,类似于用于创建等领域的循环:用ViewScript装饰的视图脚本领域的渲染。