我正在研究一个论坛控制器,我遇到了一个问题,即选择论坛类别。
Forum hasmany ForumCategory (forum_id)
ForumCategory hasmany ForumPost (category_id)
ForumCategory hasmany ForumSubcat (parent_id)
ForumCategory belongs to Forum (forum_id)
ForumPost belongs to ForumCategory (category_id)
ForumSubcat belongs to ForumCategory (parent_id)
Forum belongs to Page (page_id)
当用户为论坛添加新主题(模型称为ForumPost)时,他们必须选择category_id(ForumCategory)。如果用户转到http://www.domain.com/forum/add/5,则应将category_id预选为5,并显示该类别的标题。如果用户转到http://www.domain.com/forum/add,则应取消选择category_id,并且下拉菜单应以默认选项“选择类别”开头。
代码是
if($category_id){
echo $this->Form->input('category_id', array('value' => $category_id, 'empty' => 'Select a Category'));
}
else{
echo $this->Form->input('category_id', array('empty' => 'Select a Category'));
}
$ category_id从路由传递到控制器到视图,上面的代码当前正在工作。
我希望我的选择列表是分层的,用page_id = $ page_id显示所有论坛(因此条件必须在论坛模型上)。在此之下,属于上述论坛的所有类别。最后,属于父类别的所有子类别。这是一个例子:
Select a Category // default option
Help // Forum
--- Announcements // Category
--- Feedback & Suggestions // Category
--- Questions & Support // Category
General Discussion // Forum
--- Games & Polls // Category
--- Introductions // Category
--- Chit Chat // Category
Off Topic // Forum
--- Movies // Category
--- TV // Category
--- Music // Category
-------- Pop // Sub Category
-------- Rock // Sub Category
-------- R&B // Sub Category
--- Games // Category
我需要它,以便如果用户选择论坛选项说“关闭主题”,则选择的id为空,验证将告诉他们选择一个类别,直到他们的选择是类别或子类别选项。
我尝试了一些方法,但我真的错过了这个方法。
这为我提供了按其相应论坛分组的有效类别列表以及Forum.page_id = $page_id
的条件,但子类别不属于其父级。
$this->ForumCategory->find('list', array(
'fields' => array('ForumCategory.id', 'ForumCategory.title', 'Forum.title'),
'conditions' => array('Forum.page_id' => $page_id),
'recursive' => 0
));
这给了我想要的数组但不在选择兼容列表中。 有没有办法可以很好地转换它,或者我不应该在这个字段中使用表单助手?
$this->Forum->find('all', array(
'fields' => array('Forum.title'),
'conditions' => array('Forum.page_id' => $page_id),
'contain' => array(
'ForumCategory' => array(
'ForumSubcat'
)
)
));
StackOverflow上的This post是最大的帮助,但原始海报没有更新问题,包括将查找('all')转换为列表。