【问题标题】:Create related record form on separate page with CakePHP使用 CakePHP 在单独的页面上创建相关记录表单
【发布时间】:2016-03-24 14:37:43
【问题描述】:

我有这个模型:

School hasMany Teachers

我的学校控制器上有一个查看操作/页面,我需要在其中放置一个“为这所学校添加新教师”链接。此链接必须指向教师添加页面,新教师必须引用上一页中的学校。

我通过在我的链接上添加一个查询字符串来做到这一点,例如:

<a href="/teachers/add?school_id=4">Add new teacher for this school</a>

然后在我的 TeachersController 中,我将此值作为 $school_id 传递给我的视图 (teacher::add.ctp),并在 add.ctp 中创建一个隐藏输入,例如:

$this->hidden('school_id', ['value' => $school_id])

所以当我提交教师添加表单时,它的 school_id 字段设置正确。

有没有更好的方法来做到这一点?我对我的解决方案和查询字符串技巧不太满意(可以在地址栏中进行更改...)。

谢谢

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    我猜你必须以某种方式将信息传递给操作。

    您可以使用表单代替链接(Cake FormHelper 有一个 formlink() 方法)并通过 POST 传递 school_id

    无论如何,即使您使用 POST 数据,用户仍然可以通过多种方式修改数据。

    我在这里看到的问题是您使用了隐藏字段。我认为这是多余的,因为当您将数据发送到/teachers/add?school_id=4时,您的查询数据中已经包含此信息

    这样你就可以了

    $teacher =  $this->Teachers->newEntity()
    $teacher = $this->Teachers->patchEntity($teacher , $this->request->data);
    $teacher->school_id = $this->request->query('teacher_id');
    

    【讨论】:

    • 你说得对,我可以摆脱隐藏的输入。我想我的问题是保持某种上下文,那么使用 Session 组件来存储和使用我的 school_id 呢?这会是一种更清洁的方式吗?我可以在我的 School::view 操作中设置它并在我的 Teacher::add 中使用它...
    • 如果您在不同的浏览器选项卡中打开不同的学校会发生什么?最后打开的选项卡在会话中保存schoold_id。但是,如果您随后转到第一个打开的选项卡并单击“添加教师”,您将结束将教师添加到最后一所学校。
    • 确实是个坏主意:)...即使在我的用例中这种情况从未发生过。
    • 你告诉过你有一个/schools/view/4 页面,你想在其中添加一个/teachers/add/school_id=4 链接。如果是这样,我想您总是可以打开一个新标签,然后转到/schools/view/7。如果您有某种内部控制来避免这种情况(即用户只能看到他自己的学校,而不能看到其他学校),那么请使用相同的控制来避免将教师添加到其他学校
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2016-04-20
    相关资源
    最近更新 更多