带有类别和子类别的SilverStripe下拉列表

时间:2017-05-26 07:27:56

标签: php silverstripe

我有2个自定义对象:CategorySubcategory已链接 每个子类别都有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) {  
        }
    }
}

我不确定这是解决方案的正确方法,但这就是我现在所拥有的全部内容。

有人可以提出建议吗?

3 个答案:

答案 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创建一个下拉字段,其子类别按类别分组:

假设我们的CategorySubcategory类如下:

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
);