Adam Sykes
Adam Sykes

Reputation: 290

How do I populate a Zend Form from a Doctrine Model with Many To One relationships?

I have an entity setup called Lead which contains a car make, model, etc and this Lead is mapped by a Many to One relationship to a Client entity, which has forname, surname, etc. i.e. A client may have many leads

I have created a toArray function which gets the data from the Lead,

public function toArray()
{
    $record_data = get_object_vars($this);
    $formatted_record_data = array();
    foreach($record_data as $name=>$value){
        if (is_object($value)){
            if (get_class($value) == 'DateTime') {
                $value = $this->datetimeToString($value);
            } else {
                $value = $value->toArray();
            }
        }
            $formatted_record_data[$this->from_camel_case($name)] = $value;
    }
    return $formatted_record_data;
}

which then populates a Zend Form using:

$record = $this->_em->getRepository($this->_entity)->find($this->_primaryId);
$form->setDefaults($record->toArray());

This works fine for the fields for the Lead entity which are populated, but it does not populate the Client-based fields e.g. forname.

EDIT

I have fixed my problem by the following method:

1) Adding the following method to my Update Action.

$this->_record = $this->_em->getRepository($this->_entity)->find($this->_primaryId);
$this->_form->setRecord($this->_record);
$this->view->form = $this->_form;

2) Adding the following method to my Form Model

public function setRecord($record)
{
    $data = array('registration' => $record->registration,
                'make' => $record->make,
                'model' => $record->model,
                'pav' => $record->pav,
                'salvage_value' => $record->salvageValue,
                'forname' => $record->client->forname,
                'surname' => $record->client->surname,
                'vehicle_address1' => $record->vehicleAddress1,
                'vehicle_address2' => $record->vehicleAddress2,
                'vehicle_address3' => $record->vehicleAddress3,
                'vehicle_address4' => $record->vehicleAddress4,
                'vehicle_address5' => $record->vehicleAddress5,
                'vehicle_postcode' => $record->vehiclePostcode,
                'category' => $record->category,  
                'colour' => $record->colour
    );
    $this->setDefaults($data);
}

This way I can manually get the related data, in this case:

'forname' => $record->client->forname,
'surname' => $record->client->surname,

and add them to the form using:

$this->setDefaults($data);

Upvotes: 1

Views: 882

Answers (1)

redmoon7777
redmoon7777

Reputation: 4526

try :

$leads = $record->toArray();
$client_info = array('name' => 'test', 'surname' => 'test 2'); // or if from db use what you did for the leads.

$defaults = array_merge($leads, $client_info);

$form->setDefaults($defaults);

Upvotes: 0

Related Questions