【问题标题】:Silverstripe 3.5 to 4.x migration. Model Admin can't find $managed_models classesSilverstripe 3.5 到 4.x 的迁移。模型管理员找不到 $managed_models 类
【发布时间】:2018-03-02 01:39:23
【问题描述】:

我已将网站从 3.5 升级到 4.x。大多数情况下进展顺利,但在命名空间方面遇到了主要障碍。

这个来自一个名为 silverstripe-news 的模块,我不得不手动升级它,因为它是废弃软件。我在上面使用了升级代码工具,并按照指南手动完成了其余的工作。但我可能错过了一些东西。但我可以看出问题所在。

这里是原始模型管理员的基础知识:

class NewsAdmin extends ModelAdmin {
    private static $url_segment = 'news';
    private static $menu_title = 'News';

    private static $managed_models = array(
        'NewsPost'
    );
}

这里是NewsPost:

class NewsPost extends Page {
    private static $pages_admin = true;
    private static $db = array(
        'DateTime'          => 'SS_Datetime',
        'Tags'              => 'Varchar(500)',
        'Author'            => 'Varchar(100)',
        'Summary'           => 'HTMLText'
    );
}

升级工具完成后,我的手动更改,它们看起来更像这样:

模型管理员

namespace Vendor\SilverstripeNews;

class NewsAdmin extends ModelAdmin {
    private static $url_segment = 'news';
    private static $menu_title = 'News';

    public $showImportForm = false;

    private static $managed_models = array(
        NewsPost::class
    );
}

新闻发布

namespace Vendor\SilverstripeNews;

class NewsPost extends Page {
    private static $singular_name = 'News Post';
    private static $plural_name   = 'News Posts';
    private static $table_name = "NewsPost";
    private static $pages_admin = true;

    private static $db = array(
        'DateTime'          => 'DBDatetime',
        'Tags'              => 'Varchar(500)',
        'Author'            => 'Varchar(100)',
        'Summary'           => 'HTMLText'
    );
}

问题在于在旧系统下创建的原始数据。它们在 SiteTree_Live 中,类名为“NewsPost”。因此,ModelAdmin 的 managed_model (我认为)找不到它们。当然,升级前的所有文章都不再可见。我假设它正在寻找 Vendor\SilverstripeNews\NewsPost,其中没有。

查看this article,显然 managed_models 仍然使用旧格式,并且 Object::class 方法可能是升级代码工具的简单错误。但我尝试改回按照这篇文章进行开发/构建,然后重新加载,我被告知“Class NewsPost 不存在”。

【问题讨论】:

    标签: silverstripe silverstripe-4


    【解决方案1】:

    问题在于在旧系统下创建的原始数据。它们位于 SiteTree_Live 中,类名为“NewsPost”。因此,ModelAdmin 的 managed_model 找不到它们(我认为)。

    您可以为此使用 classname_value_remapping 配置属性。这将更新 DB 中的 ClassName 枚举字段以反映新的命名空间:

    # File: yourmodule/_config/legacy.yml
    SilverStripe\ORM\DatabaseAdmin:
      classname_value_remapping:
        NewsPost: Vendor\SilverStripeNews\NewsPost
    

    有关更多示例,请参阅核心中的其他 legacy.yml 文件。

    这将在dev/build 期间运行。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2018-09-08
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多