Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Zend Form: How to pass parameters into the constructor?

I'm trying to test my form. It will be constructing other objects, so I need a way to mock them. I tried passing them into the constructor...

class Form_Event extends Zend_Form
{
    public function __construct($options = null, $regionMapper = null)
    {
        $this->_regionMapper = $regionMapper;
        parent::__construct($options);
    }

...but I get an exception:

Zend_Form_Exception: Only form elements and groups may be overloaded; variable of type "Mock_Model_RegionMapper_b19e528a" provided

What am I doing wrong?

like image 818
Andrew Avatar asked Jun 17 '10 17:06

Andrew


2 Answers

A quick look at the sourcecode of Zend_Form shows the Exception is thrown in the __set() method. The method is triggered because you are assigning $_regionMapper on the fly when it doesn't exist.

Declare it in the class and it should work fine, e.g.

class Form_Event extends Zend_Form
{
    protected $_regionMapper;

    public function __construct($options = null, $regionMapper = null)
    {
        $this->_regionMapper = $regionMapper;
        parent::__construct($options);
    }

See the chapter on Magic Methods in the PHP Manual.

like image 61
Gordon Avatar answered Nov 12 '22 17:11

Gordon


Zend_Form constructor looks for a specific pattern in method's names in your form. The pattern is setMethodName. the constructor calls the MethodName method and pass the parameter to it.

So you'll have this in your class :

class My_Form extends Zend_Form
{

    protected $_myParameters;

    public function setParams($myParameters)
    {
        $this->_myParameters = $myParameters;
    }

And you pass the parameters to your form with :

$form = new My_Form( array('params' => $myParameters) );

So instead of params you can use any other names ( of course if it doesn't already exists in Zend_Form ).

like image 45
Ali Mousavi Avatar answered Nov 12 '22 17:11

Ali Mousavi