“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
在制作Drupal发行版时,通常需要自带默认内容,也就是内容实体数据,这里提供几种方式:
一、核心自带示例:
详见核心自带的示例profile(core\profiles\demo_umami),这用来进行官方展示
二、采用“default_content”模块
下载地址:https://www.drupal.org/project/default_content
三、云客自创的一种方法:
由于以上方法都比较麻烦,学习成本也较高,因此这里云客自创了一种方法推荐给大家,本篇进行着重介绍:
概述:首先将内容实体数据进行序列化保存到文本,然后在系统安装时采用安装任务进行导入。
在未来很美统一收银系统中即用到了该方法,关键代码示例如下:
第一步:在原系统中序列化保存实体数据:
$entityType = "menu_link_content";
$entityFile = $entityType . '.txt';
$storager = \Drupal::entityTypeManager()->getStorage($entityType);
$entities = $storager->loadMultiple();
$data = [];
foreach ($entities as $entity) {
$entityData = $entity->toArray();
//unset($entityData['uuid']);
$data[] = $entityData;
}
$data = serialize($data);
file_put_contents($entityFile, $data);
注意这里是否需要去掉UUID需要视情况而定,UUID用于对内容实体的配置依赖,如果有某些东西依赖内容实体,则必须一同转存UUID
导出数据后,通常保存到封装版的profile之下,这里假定profile名为will_nice,保存在其根目录default_content目录下,以实体类型ID命名
第二步:制作安装任务:
任务定义如下:
//安装默认内容
$tasks['will_nice_default_content_batch'] = [
'type' => 'batch',
'function' => 'will_nice_default_content_batch',
'display_name' => '安装默认内容',
'display' => TRUE,
'run' => INSTALL_TASK_RUN_IF_NOT_COMPLETED,
];
这里采用批处理导入法,批定义如下:
function will_nice_default_content_batch($install_state) {
$operations = [];
$types = ['node', 'menu_link_content', 'block_content'];
foreach ($types as $entityType) {
$operations[] = ['_will_nice_default_content_batch', [$entityType]];
}
$batch = [
'title' => '安装默认内容',
'operations' => $operations,
'init_message' => '初始化中',
'progress_message' => '已完成: @current 共: @total.',
'error_message' => '发生了一个错误',
];
return $batch;
}
批处理函数如下:
function _will_nice_default_content_batch($entityType, &$context) {
$message = '实体类型' . $entityType . '的默认内容安装完成';
try {
$storager = \Drupal::entityTypeManager()->getStorage($entityType);
$filePath = 'profiles/will_nice/default_content/' . $entityType . '.txt';
$data = file_get_contents($filePath);
$data = unserialize($data);
foreach ($data as $entity) {
$storager->create($entity)->save();
}
} catch (\Exception $e) {
$message = '实体类型' . $entityType . '的默认内容安装异常:' . $e->getMessage();
\Drupal::messenger()->addError($message);
}
$context['message'] = $message;
}
这样就可以为发行版安装默认数据了
注意:
1、如果数据量很大,那么可以拆分成多个文件保存
2、如果内容实体带了图片等文件附件,那么在封装版中一并打包到原位置,以上方法只操作数据库即可
3、注意导入顺序:如果有依赖项,比如一篇文章引用到了某文件实体,那么被依赖项应该先导入,即文件实体先导入
4、使用云客提供的方法时,注意GIT提交代码时的换行处理,如果你是在window下生成默认内容的序列化文件,git提交时可能将其换行符转化为unix风格换行符,导致解序列化时失败,从而导致安装默认内容失败,需要配置GIT,进行如下全局设置:
git config --global core.autocrlf false
且将系统根目录下“.gitattributes”文件的相关行注释掉
交流互动