创建具有相同名称(ZF3)的zend表单元素数组?

创建具有相同名称(ZF3)的zend表单元素数组?

问题描述:

Since i've to position checkboxes in design I'm not using MultiCheckbox and using Checkbox instead in zend. I've seen some zf1 solutions but didnt found any zf2 or zf3 solutions.

My Php Code

$languages = new \Zend\Form\Element\Checkbox('languages[]');
$languages->setLabel('English');
$languages->setValue('1');

This produce the following output

<?php 
    echo $this->formRow($form->get('languages[]')); 
    //It produce the following
?>
<input type="checkbox" name="languages[]" value="1" checked="checked">

How can I add more items with name "languages[]" without writing direct HTML code ?

由于我要在设计中定位复选框,我不使用MultiCheckbox并在zend中使用Checkbox。 我见过一些 zf1解决方案,但没有找到任何zf2或zf3 解决方案。 p>

My Php Code p>

  $ languages = new \ Zend \ Form \ Element \ Checkbox('languages []');  
 $ languages-&gt; setLabel('English'); 
 $ languages-&gt; setValue('1'); 
  code>  pre> 
 
 

这会产生以下输出 p>

 &lt;?php 
 echo $ this-&gt; formRow($ form-&gt; get('languages []'));  
 //它产生以下
?&gt; 
&lt; input type =“checkbox”name =“languages []”value =“1”checked =“checked”&gt; 
  code>  pre  > 
 
 

如何在不编写直接HTML代码的情况下添加名称为“languages []”的更多项目? p> div>

You can use a Form collection for this:

1) In your form:

use Zend\Form\Element\Collection;

...

$languages = new \Zend\Form\Element\Checkbox();
$languages->setLabel('English');
$languages->setValue('1');
$languages->setName('language');

$collection = new Collection();
$collection->setName('languages');
$collection->setLabel('Language Collection');
$collection->setCount(2);
$collection->setTargetElement($languages);
$collection->populateValues(array(
        1, 0
));

$this->add($collection);

2) Do not forget to prepare your form in your controller action:

$form->prepare();

3) Finally, in your view, get all elements of the collection and render them separately:

<?php $elements = $form->get('languages')->getElements(); ?>
<?php //echo $this->formCollection($form->get('languages')); ?>
<?php echo $this->formRow($elements[0]); ?>
<?php echo $this->formRow($elements[1]); ?>

My solution (Method 2)

Method 1: Give name as "language[1]" instead of "language[]". By using this I can call the elements in view seperately.

Creating form.

$language1 = new \Zend\Form\Element\Checkbox('language[1]');
$language2 = new \Zend\Form\Element\Checkbox('language[2]');

$form = new Form('Set');
$form->add($name)
        ->add($language1)
        ->add($language2)
        ->add($submit);

In view file

<div><?php echo $form->get('language[1]');?></div>
<div><?php echo $form->get('language[2]');?></div>

Edit: Method 2 Using fieldset

//Create form
$languages = [
    ['id' => 1, 'language' => 'English'],
    ['id' => 2, 'language' => 'Malayalam'],
] ;
$fieldSet = new \Zend\Form\Fieldset('languages') ;
foreach( $languages as $one ) {
    $c = new \Zend\Form\Element\Checkbox($one['id']);
    $c->setLabel($one['language']) ;            
    $fieldSet->add($c) ;
}
//Add collection of checkboxes to form
$form->add($fieldSet) ;        

In view file

<?php
$language = $form->get('languages') ;
?>        
<div class="form-group row">
    <label class="control-label col-sm-2" >Choose Languages</label>
    <div class="col-sm-10"> 
        <?php foreach($language as $one ) { ?>
        <?php echo $this->formCheckbox($one); ?> <span> <?php echo $this->formLabel( $one ) ; ?> </span>
        <?php echo $this->formElementErrors($one); ?>
        <?php } ?>
    </div>
</div>

You can use MultiChebox

https://framework.zend.com/manual/2.2/en/modules/zend.form.element.multicheckbox.html

It works similar to radio form element. Your example implementation

use Zend\Form\Element;

$languages = new Element\MultiCheckbox('languages');
$languages->setLabel('Used languages');
$languages->setValueOptions([
    'en_US' => 'english',
    'de_DE' => 'german',
    'pl_PL' => 'polish',
]);
$languages->setValue('en_US'); //default value; you can use array