SilverStripe 3.4:如何从模型向db添加默认记录

zan*_*war 6 php silverstripe

无法在SilverStripe文档中找到如何让DataObject模型在/ dev/build上注入默认记录的集合

任何人都能指出我正确的方向

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

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

    private static $summary_fields = array(
        'Option' => 'Option',
        'Value'  => 'Value',
    );
}
Run Code Online (Sandbox Code Playgroud)

提前感谢任何方向/指针.

更新 我被@Barry转到SiteConfig下面

但是在遵循他的练习时,requireDefaultRecords()不会注入默认值

注意:我已经重新访问/ 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"
    );
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 5

在DataObject中使用requireDefaultRecords函数- 在每次调用期间调用它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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一个评论是,有一个模块用于SiteConfig它使用SilverStripe,大多数模块和在那里我会建议你把配置值,这样代替.

如果您选择SiteConfig那么请查看函数populateDefaults文档供它使用,这是一个例子......

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

(如果以上用于扩展,则可能需要$this->owner->Date代替$this->Date)

如果所有值都是静态的,则不需要上面的函数,而是只从这个数组中读取它们(再次在内部DataObject)

public static $defaults = array(
    'Option1'  => 'Value1',
    'Option2'  => 'Value2'
);
Run Code Online (Sandbox Code Playgroud)

这也适用于任何一个DataObject,但是作为SiteConfig管理一个记录并且这在创建时填充该记录一次,这对于使用而言更方便requireDefaultRecords.