如何为 parent 模型设计编辑模板,以便也可以使用 CakePHP 3 创建新的 child 模型?

How to design an edit template for parent model such that a new child model can also be created using CakePHP 3?

我正在使用 CakePHP 3.1。一个Parent有很多Child人,也有一个最喜欢的Child。 (因此有一个名为 Parent.favourite_child 的字段设置为其 Children 之一的 Child.id,或者是 null。)模型和基本模板都工作正常。

在 Parent 的编辑页面(模板)上,我可以为此 Parent 编辑当前 select 收藏夹Child 的详细信息(使用 FavouriteChild.id, 等等)。但是,我想让页面更加动态(通过添加 Ajax 或 Javascript)来执行以下操作:让用户能够 Select 另一个 [=56] =]ren 作为收藏夹,然后编辑 Child 的详细信息,或者将 select "new" 编辑为当前收藏夹 Child,这应该会显示一个空白的详细信息( yet-to-be-created) 新 Child,并编辑这些详细信息。

(这个问题的另一个例子是当一个东西有很多版本时,但只有一个版本是 active 版本。)

我不确定如何处理这个问题。这似乎是一个常见的 use-case。我考虑过几种方法:

  1. Parent 编辑页面有两种不同的形式 parent/edit/1 页(一个用于 Parent,一个用于 Child)然后加载 来自 select 列表的 Child 字段发生变化 ("onchange") Parent表格;
  2. Parent 编辑页面只有一种形式 Parent,但包括 Child 的字段也是如此;
  3. 在 Child 形式中使用 ajax。

(我还没有包括 JavaScript 或 Ajax 电话在内的经验,所以如果您的回答中提出建议,那么这方面的建议会很有帮助。)

我在想一些 javascript 就像这个网站上给出的例子将是动态加载当前最喜欢的 children 之一的方法: Dynamic web coding

编辑 这有助于解决问题的 "dynamic" 方面。我只是在 Parent 字段发生任何变化时立即更新表单。 (还没有决定我是否会使用两种形式(一种用于 Parent,一种用于 Fav Child)或仅一种用于加载 FavChild 字段的 Parent到 parent,例如 parent.favorite_child.child_name,等等)

下面是对表单输入的简单更改:

        echo $this->Form->input('recyclable', [
            'type' => 'checkbox',
            'onChange' => 'this.form.submit()'
        ]);

对于 select 下拉菜单,类似地,也只是添加 'onChange' 选项。

What you need

  1. 与常规 children 和收藏 children 在 Parent 中的关系 型号
  2. 例如表单中Parent的实体
  3. 所有可用的 children 列表 偏袒。

Relation To Regular children and Favorited children in the Parent model

建立关系到Children table与关系hasOne / hasMany 取决于你是想要一个普通的 child 每个 parent 还是多个

对 Children 和收藏的 Children 执行此操作,它们使用相同的 table,因此您可以这样写:

$this->hasMany('Children');

$this->hasMany('FavoritedChildren', ['className' => 'Children']);

在 Childrens 模型中将关系设置为 belongsTo();

The entity of the Parent in a form for example

按照 CakePHP 命名约定创建控制器方法和视图。 http://book.cakephp.org/3.0/en/intro/conventions.html

$this->Form->create($parentEntity);

添加您的输入字段,如果您想保存关联数据,请使用关联的 Childrens 模型的索引,如下所示:

'Children.name', '已收藏Children.name'

输入应该像这样生成:

$this->Form->input('FavoritedChildren.name');

一旦您的表单设置正确,您就可以将 parent 实体与您的 child 关联保存,无论它是否包含收藏数据。

$parent = $this->Parents->newEntity($data, [
    'associated' => ['FavoritedChildren']
]);

http://book.cakephp.org/3.0/en/orm/saving-data.html#saving-hasmany-associations

A list of all the children available for favoritism

这是 select child 所需要的。在您的控制器方法中,只需找到您要从中选择的所有 children 的列表

$availableChildren = $this->Childrens->find('list');
$this->set(compact('availableChildren')); 

并在您的视图中使用带有输入 select 的 $availableChildren 变量,或者您想要 select children.

$this->Form->input('Children.id', ['options' => $availableChildren]);
$this->Form->input('FavoritedChildren.id', ['options' => $availableChildren]);

希望以上回答对您有所帮助。