Silverstripe 3.5至4.x迁移。模型管理员找不到$ managed_models类

问题描述 投票:1回答:1

我已将网站从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'
    );
}

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

的ModelAdmin

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

NewsPost

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中,ClassName为“NewsPost”。因此,ModelAdmin的managed_model(我认为)无法找到它们。当然,升级之前存在的所有文章都不再可见。我认为它正在寻找供应商\ SilverstripeNews \ NewsPost,其中没有。

看看this article,显然managed_models仍然使用旧格式,而Object :: class方法可能是升级代码工具的一个简单的不准确。但我尝试改回来遵循这篇文章,dev / build,并重新加载,我被告知“Class NewsPost不存在”。

silverstripe silverstripe-4
1个回答
2
投票

问题在于在旧系统下创建的原始数据。它们位于SiteTree_Live中,ClassName为“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期间运行。

© www.soinside.com 2019 - 2024. All rights reserved.