我有2个自定义对象:Category
和Subcategory
已链接
每个子类别都有CategoryID
。
结构如下:
Category1
- Subcategory 1
- Subcategory 2
- Subcategory 3
Category 2
Category 3
我想做什么:
我有一个小部件,我需要有一个具有上述结构的Dropdown字段。
我创建了一个自定义函数,这就是我现在所拥有的:
function getCategoriesAndSubcategories() {
$categories = Category::get();
$cat_array = array();
foreach ($categories as $category) {
$cat_array[$category->ID] = $category->Title;
$subcategories = SubCategory::get()->filter(array('CategoryID' => $category->ID));
foreach ($subcategories as $subcategory) {
}
}
}
我不确定这是解决方案的正确方法,但这就是我现在所拥有的全部内容。
有人可以提出建议吗?
答案 0 :(得分:0)
由于没有人能够回答我的问题(只有我的语法错误),我最终创建了名为MultipleGroupedDropdown的自定义表单字段,它具有从Listbox +普通Grouped DropDownfield的所有其他功能中获取的多重选择能力。
如果有人需要这个,他们可以联系我,我会免费为他们提供这个字段。
答案 1 :(得分:0)
执行此操作的传统方法是使用层次结构扩展(与页面和安全组相同)。
层次结构添加了一个"孩子"类的方法,因此类别将具有也是类别的子项。
如果您想为子类别使用不同的类,则子类别可以扩展类别。
如果这样做,您还可以使用TreeMultiSelectField(支持层次结构)。
我在目录模块中使用过类别(https://github.com/i-lateral/silverstripe-catalogue/blob/master/code/model/CatalogueCategory.php)。
希望有帮助吗?
答案 2 :(得分:0)
我们可以使用GroupedDropdownField
创建一个下拉字段,其子类别按类别分组:
假设我们的Category
和Subcategory
类如下:
class Category extends DataObject {
private static $db = array(
'Title' => 'Varchar(1024)'
);
private static $has_many = array(
'Subcategories' => 'Subcategory'
);
}
class Subcategory extends DataObject {
private static $db = array(
'Title' => 'Varchar(1024)'
);
private static $has_one = array(
'Category' => 'Category'
);
}
我们可以按如下方式创建GroupedDropdownField
:
$categories = Category::get();
$subcategoryArray = array();
foreach ($categories as $category) {
$subcategoryArray[$category->Title] = $category->Subcategories()->map('ID', 'Title')->toArray();
}
$groupedSubcategories = GroupedDropdownField::create(
'Subcategories',
'Subcategories',
$subcategoryArray
);