此问题的简短版本是:
如何获取仅存在于数组中的数据(即:尚未保存在模型中)并将其与模型中$this->find('list')
数组中的值相关联?
此问题的长版本为:
我正在使用CakePHP和Wizard Component作为3步申请表。
3个表格步骤是联系方式,课程和详细信息。
在这些步骤之后,有一个“审核”步骤,我想显示前三个表单步骤中的所有提交,供用户在按提交前最后一次检查。在大多数情况下,这非常有效。我只需要在控制器中执行以下操作:
function _prepareReview() {
$contact = $this->Wizard->read('contact');
$course = $this->Wizard->read('course');
$details = $this->Wizard->read('details');
$this->set(compact('contact','course','details'));
}
然后,在review.ctp中,我可以引用$contact['Contact']['firstname'];
之类的内容来获取该人的名字等。
然而,问题是从“相关”模型获取数据。例如,有一个“国籍”字段,它只是一个ID。在“详细信息”步骤中,我使用find('list')
从族模型中获取所有国籍的列表,作为正确显示的下拉菜单,然后Cake保存相应的ID。
但是,当我进入向导组件中的“审核”步骤时,我只从向导组件的数组中获取实际ID。我真的不希望得到任何其他东西。
我看不到从向导组件的上下文中访问$details[Detail][Nationality][name]
(或类似的东西)的任何明显方法,因为设置递归不起作用,因为数据实际上不在模型中阶段,它只是一个表单数据的数组。
因此,换句话说,我在数组中有数据(不是来自模型,而是来自表单提交),如下所示:
Array
(
[Details] => Array
(
[firstname] => Test
[nationality_id] => 3
)
)
然后我有$this->Detail->Nationality->find('list')
来自以下内容:
Array
(
[0] => American
[1] => Australian
[2] => British
[3] => Canadian
)
那么我如何从向导组件中获取$details['Details']['nationality_id'];
以显示“加拿大”而不是“3”?当只有一个数组来自模型时,如何建立关系?我只需要暂时向用户确认所有数据。当然,一旦用户按下提交,id'3'将写入模型,这已经正常工作。
或者这是一种完全疯狂的做事方式,我应该看一个完全不同的方法,比如先保存数据?我不想在用户点击最终提交之前保存它。
答案 0 :(得分:2)
我可以看到你在这里得到的东西 - CakePHP不会自动为你查询这些相关的模型(因为你没有从数据库中提取)但是你不禁想到你错过了一些框架的免费功能。
如果您仍在使用FormHelper::input()
,它会自动选择正确的选项(假设您执行Model::find('list')
并首先将选项列表传递给视图),但我假设您希望审核屏幕没有表单输入(disabled
或不是)。
最直接的方法是简单地对向导中的每个步骤执行相同的Model::find('list')
调用,将每个步骤中的数据设置为视图,并手动打印出适当的值:
// controller
$nationalities = $this->Review->Details->Nationality->find('list');
$this->set(compact(/*..., */ 'nationalities'));
// view
<?php echo $nationalities['Nationality'][$details['Detail']['nationality_id']]; ?>
outputs 'Canadian' (the value for $nationalities['Nationality'][3])
有可能让CakePHP通过恰好调用DboSource::queryAssociation()
来为你做这件事 - 如果你正在接受挑战 - 但对于这个特殊问题可能有点过分。
// model
$db =& ConnectionManager::getDataSource($this->useDbConfig);
$data = $db->queryAssociation($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet, $recursive, $stack) {