Search code examples
zend-frameworkzend-formzend-framework3

Invalid argument supplied for foreach() in \zendframework\zend-form\src\Form.php on line 773 when using $form->prepare() Zend Framework 3


I'm newbie ZF3

I had finished my searching form and implementing the autocomplete suggestion using zend framework 3 but I got an error message warning : in Invalid argument supplied for foreach() in \zendframework\zend-form\src\Form.php on line 773

Then I do remove $form->prepare(); and message error doesn't appear but once the button is clicked and verified then the error message back

my addkelas.phtml

<?php
$form->setAttribute('action',$this->url('kelasbimbingan',['action'=>'addkelas']));
$form->prepare();
echo $this->form()->openTag($form);
?>
<p>Type students names:</p>
<div id="prefetch">
<?= $this->formElement($form->get('nama')); ?>
</div>
<br>
<div>
<?php
    echo $this->formSubmit($form->get('submit'))."<br>";
    echo $this->form()->closeTag();
?>
</div>
<?php
echo "<script language='javascript'> var country_list =".$data.";</script>";
$this->headScript()
    ->appendFile('/js/typeahead.bundle.js', 'text/javascript')
    ->appendFile('/js/bloodhound.js', 'text/javascript')
    ->appendFile('/js/autocompletejavascript.js', 'text/javascript');
?>

my addkelasAction()

public function addkelasAction()
    {
        $form = new CarimahasiswaForm();

        $data = \Zend\Json\Json::encode($this->getMahasiswaData());

        if ($this->getRequest()->isPost()) {
            //get data, fill in the form with POST data
            // Fill in the form with POST data
            $dataMahasiswa = $this->params()->fromPost();
            $form->setData($dataMahasiswa);
            //validate form
            // print_r($data);
            if($form->isValid()){
                $dataMahasiswa = $form->getData();
                print_r($dataMahasiswa);
            }
        }

        return new ViewModel(['form'=>$form,'data'=>$data]);
    }

and my form

<?php

namespace Skripsiku\Form;

use Zend\Form\Form;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilter;
use Zend\Form\Element;


class CarimahasiswaForm extends Form
{
    public function __construct()
    {
        parent::__construct('tambah-kelas');

        $this->getElements();

        $this->add([
            'name'=>'submit',
            'type'=>'submit',
            'attributes'=>[
                'value'=>'Cari Mahasiswa',
                'id'=>'SaveButton',
                'class'=>'btn btn-info btn-md',
            ],
        ]);
    }

    public function getElements()
    {
        $this->add([
            'name'=>'nama',
            'type'=>'text',
            'attributes'=>[
                'placeholder'=>'Ketik Nama Mahasiswa',
                'class'=>'typeahead',
            ],
            'options'=>[
                'label'=>'Cari Mahasiswa :',
            ]
        ]);

    }

    private function addInputFilter() 
    {
        // Create main input filter
        $inputFilter = new InputFilter();        
        $this->setInputFilter($inputFilter);

        $inputFilter->add([
                'name' => 'nama',
                'required' => true,
                'filters'  => [
                    ['name' => 'StringTrim'],                    
                    ['name' => 'StripTags'],                    
                ], 
                'validators' => [
                    [
                        'name'    => 'StringLength',
                        'options' => [
                            'encoding' => 'UTF-8',
                            'min'      => 5,
                            'max'      => 255,
                        ],
                    ],
                ],
            ]);     
    }   
}

?>

please suggest.. Sorry for my bad English.. Thanks


Solution

  • Zend Form extends Fieldset which declares a getElements function

    public function getElements()
    {
        return $this->elements;
    }
    

    The line which throws the exception/error tries to loop through a value retrieved from:

     $elements = $fieldset->getElements();
    

    You might think that $fieldset != $this in the given context, but zend handles forms like fieldset:

    $this->attachInputFilterDefaults($this->filter, $this);
    

    Solution: Don't overwrite the getElements function, either rename your current function or add that piece of code to your constructor.