关于封装Drupal发行版时的默认内容处理

yunke 提交于 周五, 07/16/2021 - 17:06

在制作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”文件的相关行注释掉

 

添加新评论

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
请输入以上问题的答案,换一个问题请刷新,不区分大小写