如何为 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。我考虑过几种方法:
- Parent 编辑页面有两种不同的形式
parent/edit/1
页(一个用于 Parent,一个用于 Child)然后加载
来自 select 列表的 Child 字段发生变化 ("onchange")
Parent表格;
- Parent 编辑页面只有一种形式 Parent,但包括
Child 的字段也是如此;
- 在 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
- 与常规 children 和收藏 children 在 Parent 中的关系
型号
- 例如表单中Parent的实体
- 所有可用的 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]);
希望以上回答对您有所帮助。
我正在使用 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。我考虑过几种方法:
- Parent 编辑页面有两种不同的形式
parent/edit/1
页(一个用于 Parent,一个用于 Child)然后加载 来自 select 列表的 Child 字段发生变化 ("onchange") Parent表格; - Parent 编辑页面只有一种形式 Parent,但包括 Child 的字段也是如此;
- 在 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
- 与常规 children 和收藏 children 在 Parent 中的关系 型号
- 例如表单中Parent的实体
- 所有可用的 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]);
希望以上回答对您有所帮助。