我对Zend Form Elements的渲染有一点问题。我们目前正在使用Zendframework 2构建调查管理平台,因此需要以矩阵样式呈现的问题类型(如链接图像中)。
(它也可能只是一个问题而不是表格中的2个 - 所以2条蓝线右侧的所有内容都可以丢弃并添加到另一个表格中)
https://imageshack.com/i/ndynulp
我目前不知道如何最好地解决这个问题,因为表格中的所有元素当然都是从数据库中动态添加的。
显示多个这样的单选按钮的最佳解决方案是什么?
目前我正在尝试编写一个自定义表单元素,但我并不完全知道如何告诉View Helper渲染我的元素,如下图所示(或者我告诉他如何渲染我的元素)元素)。
感谢您的帮助: - )
答案 0 :(得分:1)
好的,我设法通过编写自己的视图Helper来实现,感谢Help @Sina。 : - )
对于遇到此问题的其他人,我解决了以下问题:
表单元素:(大小属性是将要呈现的单选按钮和表格标题的数量)。
<?php
/**
* @namespace
*/
namespace ExecuteSurvey\Form\Element;
/**
* @uses Zend\Form\Element
*/
use Zend\Form\Element;
/**
* Custom Form Element that is here for rendering a Matrix of Radio Elements
* @category ExecuteSurvey
* @package ExecuteSurvey_Form
* @subpackage ExecuteSurvey_Form_Element
* @author Dominik Einkemmer
*/
class RadioMatrix extends Element {
protected $attribute = array(
'type' => 'radiomatrix'
);
private $labels = array();
private $size;
public function setSize($size){
if($size == 0 || !is_numeric($size)){
throw new Exception("Size can't be 0 and has to be numeric");
}
$this->size = $size;
}
public function setLabels(array $labels){
if(!is_array($labels)){
throw new \Zend\Form\Exception\InvalidArgumentException("Array expected but ".gettype($labels)." given.");
}
foreach($labels as $label){
$this->labels[] = $label;
}
}
public function getLabels() {
return $this->labels;
}
public function getSize() {
return $this->size;
}
}
这是View Helper Class:
<?php
/**
* @namespace
*/
namespace ExecuteSurvey\Form\View\Helper;
/**
* @uses Zend\Form\ElementInterface
* @uses Zend\Form\View\helper\AbstractHelper
*/
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;
/**
* Class FormRadioMatrix which renders the actual element through a view
* @category ExecuteSurvey
* @package ExecuteSurvey_Form
* @subpackage ExecuteSurvey_Form_View
* @subpackage ExecuteSurvey_Form_View_Helper
*/
class FormRadioMatrix extends AbstractHelper {
/**
* Path to the .phtml file
* @var string
*/
protected $script = 'execute-survey/form-element/radiomatrix';
/**
* Method that renders the View Element
* @param \Zend\Form\ElementInterface $element
* @return \Zend\View\Renderer\RendererInterface
*/
public function __invoke(ElementInterface $element) {
return $this->getView()->render($this->script, array(
'element' => $element
));
}
}
这是将用于渲染元素的radiomatrix.phtml:
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th></th>
<?php for ($i = 1; $i <= $element->getSize(); $i++): ?>
<th><?php echo $i ?></th>
<?php endfor; ?>
</tr>
</thead>
<tbody>
<?php foreach ($element->getLabels() as $key => $label): ?>
<tr>
<td><?php echo $label?></td>
<?php for($j = 1;$j<=$element->getSize();$j++):?>
<td><input type="radio" value="<?php echo $j?>" name="<?php echo $label.'X'.$key?>" id="<?php echo $element->getName().'X'.$key.'X'.$j?>"></td>
<?php endfor;?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
答案 1 :(得分:0)
使用phtml文件中的默认zf2视图渲染器无法完成此操作
你必须在你的phtml中使用代码并将其渲染为你自己
使用foreach迭代表单字段并构建这样一个复杂的表单
默认$ this-&gt; formElement()在zf2视图中无法帮助