2012-01-02 2 views
1

У меня есть сущность, названная Lead, которая содержит марку автомобиля, модель и т. Д., И этот Lead сопоставляется отношением Many to One к объекту клиента, который имеет имя, фамилию и т. Д. т.е. клиент может иметь много ссылокКак заполнить форму Zend из модели Doctrine со многими отношениями?

Я создал функцию ToArray, которая получает данные из свинца,

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; 
} 

, который затем заполняет форму Zend с помощью:

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

Это прекрасно работает для полей который заселен, но он не заполняет поля на основе клиента, например. forname.

EDIT

Я установил мою проблему с помощью следующего метода:

1) Добавление следующий метод для моего обновления действий.

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

2) Добавление следующего метода к моей форме модели

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); 
} 

Таким образом, я могу вручную получить соответствующие данные, в данном случае:

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

и добавить их к с использованием:

$this->setDefaults($data); 

ответ

0

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); 
+0

Данные клиента уже являются частью записи из-за сопоставленных отношений в доктрине, например. /** * @var Клиент * @ManyToOne (targetEntity = "S2 \ Entity \ Client", каскад = { "упорствовать"}) * */ \t защищенный $ клиент; Должно быть возможно получить его из сущности доктрины. – Quanano

+0

сделать print_r ($ record-> toArray()); если вы обнаружите, что данные уже там, то проверьте, переопределяет ли что-то в форме значения и/или что ключ массива соответствует имени поля. – redmoon7777

+0

Массив включает прокси-объект для объекта Client. Это доступ к этому, что является проблемой. Я бы подумал, что заполнение формы из объекта доктрины с сопоставлениями с другими объектами является общей чертой. Должно быть, это лучший способ сделать это, но я не могу найти примеров. – Quanano