【问题标题】:How do I populate a Zend Form from a Doctrine Model with Many To One relationships?如何从具有多对一关系的 Doctrine 模型填充 Zend 表单?
【发布时间】:2012-03-28 17:52:20
【问题描述】:

我有一个名为 Lead 的实体设置,其中包含汽车品牌、型号等,并且此 Lead 通过多对一关系映射到具有名字、姓氏等的客户实体。 即一个客户可能有很多潜在客户

我创建了一个 toArray 函数,它从 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;
}

然后使用以下命令填充 Zend 表单:

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

这适用于填充的潜在客户实体的字段,但它不会填充基于客户端的字段,例如姓名。

编辑

我已经通过以下方法解决了我的问题:

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

【问题讨论】:

    标签: forms zend-framework doctrine-orm populate


    【解决方案1】:

    试试:

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

    【讨论】:

    • 由于学说中的映射关系,客户数据已经成为记录的一部分,例如/** * @var Client * @ManyToOne(targetEntity="S2\Entity\Client", cascade={"persist"}) * */ protected $client;应该可以从学说实体那里得到它。
    • 做一个 print_r( $record->toArray() );如果您发现数据已经存在,请检查表单中的某些内容是否覆盖了值和/或数组键是否与字段名称匹配。
    • 该数组包含客户端实体的代理对象。访问这个就是问题所在。我会认为,从一个学说实体填充一个表格并映射到其他实体是一个共同的特征。必须有这样做的最佳实践方式,但我找不到任何示例。
    • setDefaults 采用 array('input_field_name' => value , .....) 因此您必须创建正确的数组才能使用它。我认为除了手动(使用 $element->setValue(...))之外没有其他方法
    • 在这种情况下,必须有一种最佳实践方法从 Doctrine 实体中获取一个数组,其中包括来自映射实体的数据?我不能是唯一一个试图展示这样的东西的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2018-10-08
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多