0

我正在使用论坛控制器,但在生成论坛类别的下拉选择时遇到问题。

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 并且下拉菜单应该以默认选项“Select a Category”开始。

代码是

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

我需要它,以便如果用户选择论坛选项说“Off Topic”,则选择的 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 上的这篇文章是最大的帮助,但原始发帖人没有更新问题以将他们将 find('all') 转换为列表。

4

0 回答 0