【问题标题】:Getting related data using Wizard Component使用向导组件获取相关数据
【发布时间】:2011-08-22 05:09:12
【问题描述】:

这个问题的简短版本是:

如何获取仅存在于数组中的数据(即:尚未保存在模型中)并将其与模型中的 $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') 从 Nationality 模型中获取所有国籍的列表,作为正确显示的下拉菜单,然后 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' 就会被写入模型,这已经正常工作了。

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

【问题讨论】:

    标签: cakephp


    【解决方案1】:

    我可以看到你在这里得到了什么——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])
    

    如果您准备好迎接挑战,可以通过调用 DboSource::queryAssociation() 让 CakePHP 为您做这件事,但对于这个特定问题可能有点过分了。

    // model
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $data = $db->queryAssociation($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet, $recursive, $stack) {
    

    【讨论】:

    • 谢谢,deizel,您完全理解我的要求,并且您的解决方案有效。我将使用您提供的第一个示例,因为实施第二个解决方案只需要几秒钟,看起来对于网站的一部分甚至不会被大量使用来说工作量太大了.再次感谢!
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2021-02-26
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多