Silverstripe 3.5 到 4.x 迁移。模型管理员找不到 $managed_models 类
Silverstripe 3.5 to 4.x migration. Model Admin can't find $managed_models classes
我已将站点从 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 中,ClassName 为 "NewsPost"。因此,ModelAdmin 的 managed_model(我认为)无法找到它们。当然,升级前的所有文章都不再可见。我假设它正在寻找 Vendor\SilverstripeNews\NewsPost,其中有 none.
查看 this article,显然 managed_models 仍然使用旧格式,并且 Object::class 方法可能是升级代码工具的简单错误。但是我试着改回去关注这篇文章,dev/build,然后重新加载,我被告知"Class NewsPost does not exist"。
The issue lies in the original data that was created under the old system. They are in SiteTree_Live with a ClassName of "NewsPost". Therefore, they cannot be found by ModelAdmin's managed_model (I think).
您可以为此使用 classname_value_remapping
配置道具。这将更新数据库中的 ClassName 枚举字段以反映新的命名空间:
# File: yourmodule/_config/legacy.yml
SilverStripe\ORM\DatabaseAdmin:
classname_value_remapping:
NewsPost: Vendor\SilverStripeNews\NewsPost
有关更多示例,请参阅核心中的其他 legacy.yml 文件。
这在 dev/build
期间获得 运行。
我已将站点从 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 中,ClassName 为 "NewsPost"。因此,ModelAdmin 的 managed_model(我认为)无法找到它们。当然,升级前的所有文章都不再可见。我假设它正在寻找 Vendor\SilverstripeNews\NewsPost,其中有 none.
查看 this article,显然 managed_models 仍然使用旧格式,并且 Object::class 方法可能是升级代码工具的简单错误。但是我试着改回去关注这篇文章,dev/build,然后重新加载,我被告知"Class NewsPost does not exist"。
The issue lies in the original data that was created under the old system. They are in SiteTree_Live with a ClassName of "NewsPost". Therefore, they cannot be found by ModelAdmin's managed_model (I think).
您可以为此使用 classname_value_remapping
配置道具。这将更新数据库中的 ClassName 枚举字段以反映新的命名空间:
# File: yourmodule/_config/legacy.yml
SilverStripe\ORM\DatabaseAdmin:
classname_value_remapping:
NewsPost: Vendor\SilverStripeNews\NewsPost
有关更多示例,请参阅核心中的其他 legacy.yml 文件。
这在 dev/build
期间获得 运行。