ZF2将无线电元素渲染为矩阵

时间:2014-07-04 23:14:54

标签: zend-framework2 custom-component radiobuttonlist zend-form-element

我对Zend Form Elements的渲染有一点问题。我们目前正在使用Zendframework 2构建调查管理平台,因此需要以矩阵样式呈现的问题类型(如链接图像中)。

(它也可能只是一个问题而不是表格中的2个 - 所以2条蓝线右侧的所有内容都可以丢弃并添加到另一个表格中)

https://imageshack.com/i/ndynulp

我目前不知道如何最好地解决这个问题,因为表格中的所有元素当然都是从数据库中动态添加的。

显示多个这样的单选按钮的最佳解决方案是什么?

目前我正在尝试编写一个自定义表单元素,但我并不完全知道如何告诉View Helper渲染我的元素,如下图所示(或者我告诉他如何渲染我的元素)元素)。

感谢您的帮助: - )

2 个答案:

答案 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视图中无法帮助