【问题标题】:CakePHP: Additional select box data (from associated model) appended to existing select optionCakePHP:附加到现有选择选项的附加选择框数据(来自关联模型)
【发布时间】:2011-02-07 23:52:46
【问题描述】:

到目前为止,我认为这是不可能的,因为我已经做了 3.5 个小时了。没有运气。

我有一个表格。

我有一个选择字段(当然还有选择选项),我想在选择项旁边显示相关数据。

例如:

在我的添加计划表单上,我有一个标题为“计划详细信息”的选择框。 Plan Detail(模型)有一个与之关联的Plan Detail Note(模型)(PlanDetailNote 属于PlanDetail)。换句话说,每个计划细节在 plan_detail_notes 表中都有一个关于它的注释。

我想知道 cakephp 是否可以像这样显示它:

选择计划详情:
[计划细节选项 1] - [计划细节注释]
[计划细节选项 2] - [计划细节注释]
[计划细节选项 3] - [计划细节注释]
[计划细节选项 4] - [计划细节注释]

如您所见,注释被附加到正常的选择选项但只是静态的,仅供查看 - 不需要保存。

CakePHP 可以做到这一点吗?

【问题讨论】:

    标签: forms cakephp model rdbms


    【解决方案1】:

    只是另一个想法,如果你真正想要的是

    <select>
      <option value="1">[Plan Detail Option 1] - [Plan Detail Note]</option>  
      <option value="2">[Plan Detail Option 2] - [Plan Detail Note]</option>
      ...
      <option value="N">[Plan Detail Option N] - [Plan Detail Note]</option>
    </select>
    

    然后您可以使用 getAll 查询手动创建列表(假设关系已正确创建)

    [在控制器中]

    $plans_list = array();
    $plans = $this->Plan->findAll();
    foreach($plans as $row) {
        $plans_list["{$row['Plan']['id']}"] = "{$row['Plan']['name']} - {$row['PlanDetail']['note']}";
      }
    $this->set('plans_list', $plans_list);
    

    [然后在视图中]

    <?php echo $form->select('Plan.id', $plans_list); ?>
    

    【讨论】:

    • 非常感谢 :) 这让我走上了正轨。我在下面添加了我的代码和输出的示例屏幕截图。 findAll() 在 1.3 中似乎无效,所以我选择了 find('all')。我不得不修改 $this-> depth 以包含更深层次的相关模型 PlanDetail。我知道你不可能知道我的关系而没有看到我的表模式。感谢伟大的方向:)
    【解决方案2】:

    有一段时间没有使用 Cake,但是在您的计划详细信息控制器中,您能否在将其发送到视图之前附加计划详细信息注释?

    【讨论】:

      【解决方案3】:

      听起来您想要做的是在选择框旁边的 div 中将计划详细说明显示为文本。当您选择一个选项时,您希望 div 中的文本更新为所选选项的计划详细说明。

      如果这是您想要发生的事情,那么这将需要一些 ajax 工作。基本上,您将观察选择框的“onChange”事件字段。该事件将使用您的计划详细说明更新 div 的 innerHtml。

      我喜欢将计划详细说明存储为javascript数组或对象,然后onChange,将div innerHtml设置为javascript数组中的值。

      【讨论】:

      • 我很欣赏你的想法 :) 我只是不太熟悉使用 Ajax 助手和做所有这些。我认为有一种方法可以将控制器中的字段数据与设置关系的 find(list.. 选项一起附加到控制器中。在这一点上寻找最简单的方法:)
      【解决方案4】:

      零技能,

      根据您的概念,我能够通过一些调整使其正常工作。这是我所做的:

      在add.ctp(视图)中

      ...

      echo $this->Form->select('plan_detail_id',$plans_list);
      

      ...

      在函数 add() 中(在 plan_controller.php 中)

      ...

      $plans_list = array();
      $plans = $this->Plan->PlanDetail->find('all');
      foreach ($plans as $row) {
          $plans_list["{$row['PlanDetail']['id']}"] = "{$row['PlanDetail']['name']} - {$row['PlanDetailNote']['name']}";
      }
      $this->set('plans_list', $plans_list);
      }
      

      ...

      我什至不需要弄乱我的模型,这是一种解脱!

      这是选项输出示例的链接:

      http://prntscr.com/1jmid

      如您所见,我根据关联表 PlanDetailNote 的值附加了“Under 65”或“Over 65”。

      【讨论】:

      • 最重要的是,做一些选择以使数据输入更容易总是好的,例如: $plans = $this->Plan->PlanDetail->find(' all', array('order' => array('PlanDetail.name ASC')));
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2015-02-18
      • 2015-06-25
      相关资源
      最近更新 更多