SilverStripe 3.4:如何从模型

时间:2016-08-25 06:45:27

标签: php silverstripe

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

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

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

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

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

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

更新 我被下面的@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"
    );
}

1 个答案:

答案 0 :(得分: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();
        }
    }
}

最后一条评论是SilverStripe使用的module SiteConfig,大多数模块,我建议您将配置值改为此类。

如果您选择SiteConfig,请查看功能populateDefaultsdocumentation以供使用,这是一个示例......

/**
 * 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更方便。< / p>