使用向导组件获取相关数据

时间:2011-08-22 05:09:12

标签: cakephp

此问题的简短版本是:

如何获取仅存在于数组中的数据(即:尚未保存在模型中)并将其与模型中$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'将写入模型,这已经正常工作。

或者这是一种完全疯狂的做事方式,我应该看一个完全不同的方法,比如先保存数据?我不想在用户点击最终提交之前保存它。

1 个答案:

答案 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) {