在与多个DataObject

时间:2017-01-24 05:27:04

标签: php enums silverstripe

我有一些DataObjects具有与之关联的价格等级。我可以在另一个DataObject中建立这种关系,但是这些层级不会改变,我认为最好的方法是在config.yml中定义它们。

理想情况下,我希望将DataObject定义为:

private static $db = array(
    'Price' => 'Enum(array("Tier 1", "Tier 2"))'
)

但是,我无法想象在SilverStripe中正确执行此操作的方法,只需yaml进行单点维护。我还想过把它变成Varchar并在设置它之前检查确保它在数组中但是这不能通过枚举来填充列表等等(可能应该这样做)无论如何我打电话给配置)。我也可以写出阵列,但是至少会有两个位置,这将更难维护。

做我想要实现的目标的最佳方式是什么?哪个是在一个地方引用数组的几个对象?

4 个答案:

答案 0 :(得分:3)

如其他答案所示,您可以通过多种方式实现这一目标。例如,在我参与的项目中,我有类似于以下内容的内容:

// You need to put this into a _config.php. It copies the definition
// of DataObject2.Field2 into DataObject1.Field1.
$cfg = Config::inst();
$db = $cfg->get('DataObject1', 'db');
$db['Field1'] = $cfg->get('DataObject2', 'db')['Field2'];
$db = $config->update('DataObject1', 'db', $db);

但在我看来,最优雅的解决方案是定义一个新类,如:

class MyEnum extends Enum
{
    /**
     * Enum values.
     * @config
     */
    private static $values;

    public function __construct($name = null, $default = null)
    {
        parent::__construct($name, $this->config()->get('values'), $default);
    }
}

之后你可以用普通的YAML定义值:

MyEnum:
  values:
    - First
    - Second
    ...

答案 1 :(得分:2)

您可以通过创建DataExtension并将其应用于要添加字段的所有DataObject来将相同的db字段应用于多个DataObject。

答案 2 :(得分:1)

我不能100%确定您要问的是什么,但如果它与标题相似,并且您在询问是否可以在YAML中定义Enum DB字段值,是 - 你可以:

MyDataObject:
  db:
    Price: Enum("Tier 1,Tier 2")

无法做什么是从其他配置源(包括私有静态)向Enum添加更多值,因为枚举值被视为字符串文字而不是YAML数组

如果您的问题是"我可以为$db定义一个通用配置并将其用于多个DataObjects",那么YAML方法(一般配置)不会起作用,因为配置值绑定到一个类,并且在过程的早期解析比DataObject::database_fields告诉DB模式要做什么。

答案 3 :(得分:1)

当然,您可以在配置yml中添加和覆盖$db个键,如:

MyDataObject:
  db:
    Price: "Enum('Tier 1,Tier 2,Tier 3', 'Tier 3')"

请务必使用right syntax for Enum,使用旧的逗号分隔语法更容易。在上面的示例中,"第3层"是默认的。

在yml中定义它可能会在你使用脚手架时破坏顺序,但尚未对此进行测试。

您也可以考虑使用has_one关系来代替简单的数据对象。您可以在ModelAdmin中管理它,以后可能更容易翻译。此外,QuickAddNew module是在下拉字段下方添加新DO的好帮手。