SilverStripe 3.4:如何将默认记录从模型添加到数据库

SilverStripe 3.4: How to add default records to db from model

无法在 SilverStripe Documentation 中找到如何让数据对象模型在 /dev/build

上注入默认记录集合

任何人都可以指出正确的方向

这就是我目前拥有的,显然我想将预配置选项注入到我的模块的这个恰当命名的配置模型中。

class Configuration extends DataObject
{
    private static $db = array(
        'Option' => 'Varchar',
        'Value'  => 'Varchar'
    );

    private static $summary_fields = array(
        'Option' => 'Option',
        'Value'  => 'Value',
    );
}

提前感谢任何direction/pointers。

更新 我被下面的@Barry 转到 SiteConfig

然而,按照他的做法,requireDefaultRecords() 并没有注入默认值

Note: I have since revisited /dev/build?flush

class RMSConfiguration extends DataExtension
{
    private static $db = array(
        'username'  => 'Varchar',
        'password'  => 'Varchar',
        'agent_id'  => 'Varchar(15)',
        'client_id' => 'Varchar(15)',
        'testMode'  => 'Int(1)',
        'timezone'  => 'Varchar',
        'apiUrl'    => 'Varchar(255)'
    );

    public function updateCMSFields(FieldList $fields)
    {
        $fields->addFieldsToTab(
            "Root.RMSConfig",
            array(
                TextField::create('username', 'RMS Username'),
                TextField::create('password', 'RMS Password'),
                TextField::create('agent_id', 'RMS Agent ID'),
                TextField::create('client_id', 'RMS Client ID'),
                TextField::create('apiUrl', 'API Url'),
                CheckboxField::create("testMode", 'Toggle Test Mode'),
                DropdownField::create("timezone", 'Timezone', static::$timezones)
            )
        );

    }

    public function requireDefaultRecords()
    {
        parent::requireDefaultRecords();

        $arrOptions = array(
            'timezone' => 'Australia/Sydney',
            'apiUrl'   => 'https://api.example.com.au/',
            'testMode' => 0
        );

        foreach ($arrOptions as $strOption => $strValue) {
            if (!$configuration = self::get()->filter('Option', $strOption)->first()) {
                $configuration = self::create(array( 'Option' => $strOption ));
            }

            $configuration->Value = $strValue;
            $configuration->write();
        }
    }

    /**
     * List of timezones supported by PHP >=5.3.x
     *
     * @var array
     */
    public static $timezones = array(
        "Africa/Abidjan",
        "Africa/Accra",
        "Africa/Addis_Ababa",
        "Africa/Algiers",
        ...
        ...
        "Zulu"
    );
}

在 DataObject 中使用函数 requireDefaultRecords - 在每个 dev/build 期间调用此函数。

Note: First check if the option exists to prevent duplicates as this will be called every time you dev build.

class Configuration extends DataObject {

    private static $db = array(
        'Option' => 'Varchar',
        'Value'  => 'Varchar'
    );

    private static $summary_fields = array(
        'Option' => 'Option',
        'Value'  => 'Value',
    );

    function requireDefaultRecords() {
        parent::requireDefaultRecords();

        $arrOptions = array(
            'Option1' => 'Value1',
            'Option2' => 'Value2',
            'Option3' => 'Value3',
        );

        foreach ($arrOptions as $strOption => $strValue) {
            if (!$configuration = Configuration::get()->filter('Option',$strOption)->first())
                $configuration = Configuration::create(array('Option' => $strOption));

            $configuration->Value = $strValue;
            $configuration->write();
        }
    }
}

最后一个评论是,SilverStripe、大多数模块都使用 module for SiteConfig,我建议您将配置值改为这样。

如果你选择SiteConfig那么请看函数populateDefaults and documentation的用途,这是一个例子...

/**
 * Sets the Date field to the current date.
 */
public function populateDefaults() {
    $this->Date = date('Y-m-d');
    parent::populateDefaults();
}

(如果在扩展中使用以上内容,则可能需要 $this->owner->Date 而不是 $this->Date

如果所有值都是静态的,则不需要上述函数,而是仅从该数组中读取它们(同样在 DataObject 内)

public static $defaults = array(
    'Option1'  => 'Value1',
    'Option2'  => 'Value2'
);

这也适用于任何 DataObject,但由于 SiteConfig 管理一个记录,并且在创建时填充该记录一次,这比 requireDefaultRecords 使用起来更方便.