我已将网站从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方法可能是升级代码工具的一个简单的不准确。但我尝试改回来阅读这篇文章,开发/构建和重新加载,我告诉" Class NewsPost不存在"。
答案 0 :(得分: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
期间运行。