【问题标题】:SilverStripe 3.4: How to add default records to db from modelSilverStripe 3.4:如何将默认记录从模型添加到数据库
【发布时间】:2017-01-01 11:32:04
【问题描述】:

无法在SilverStripe Documentation 中找到如何让 DataObject 模型在 /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"
    );
}

【问题讨论】:

  • 我认为您应该将这些问题分成两个不同的问题,因为@barry 的回答对于您提出问题的方式是正确的。但是关于数据扩展的几点:self::get 你期望它返回什么?或者您实际上是在扩展 SiteConfig 吗?如果您是,那么您正在尝试使用该 for 循环创建多个站点配置。您应该做的是将数据写入手头的当前站点配置。例如。 $this->password = "耶"
  • 我也这么认为,但是问题仍然围绕着默认值的注入。因此,与其重复自己,不如更新这个问题。相关性是齐头并进的。可能应该将self 换成static,只是不喜欢在类本身中引用类名的想法。
  • self:: 不是您要扩展的类 AFAIK: 您应该使用 SiteConfig::get 因为它不知道您要正确过滤的数据对象。遗憾的是,目前无法证实这一点。而且您最初是在某种程度上创建 EAV 表,现在您应该将数据写入当前/新创建的 SiteConfig,而不是创建新的站点配置。无论如何。让我们看看@Barry 是否扩展了答案。
  • @FinBoWa 我决定根据下面的评论进行扩展......这两种方法都适用于两个对象,因此选择哪个方向都是相关的

标签: php silverstripe


【解决方案1】:

在 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();
        }
    }
}

最后一条评论是 SiteConfig 有一个 module SiteConfig,它被 SilverStripe、大多数模块使用,我建议您在其中放置这样的配置值。

如果您确实选择了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 更方便使用。

【讨论】:

  • 感谢@Barry,如果您想在此上下文中详细说明 SiteConfig 以涵盖所有基础以供将来参考,请参阅当前赏金
  • 这回答了原始问题。而且@Zanderwar 的问题仍然是关于添加默认记录,而不是关于使用 SiteConfig ;) 因此应该添加一个新问题。
  • @koodimyyra 我通常会同意,但我应该像现在所做的那样放置另一行......因为这两种方法都适用,因为它们都是 DatObjects......并且在上下文中我我推荐这两种方法都值得添加。
  • @barry: 为什么不直接使用default_records config var 而不是覆盖requireDefaultRecords() 方法?见github.com/silverstripe/silverstripe-framework/blob/3.4/model/…
  • @wmk 我也添加了这个,我想我试图给出的答案比用所有可能的方法给出的答案更少更简洁
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多