更新:这是一篇旧的博客,要获取关于迁移的最新信息,请查看文档维基上的指南: https://docs.joomla.org/Migrating_from_1.0.x_to_1.5_Stable

这篇文章将详细介绍组件背后的技术细节。对我来说,这比编写操作文档要简单一些,但它将提供给有兴趣的人所需的知识,所以实际上这将是一个带有技术细节的操作指南。话不多说,让我们开始吧!

迁移分为两部分:1.0 方面和 1.5 方面。1.0 方面发生在特殊的迁移器组件中。原始组件由 David 编写,主要是一个简单的 SQL 转储创建器,仅限于特定的表格,并且在这方面不是很可配置,然而它工作得相当不错。问题是它不太可配置,对于一个拥有大量第三方扩展的网站来说,这意味着他们将不得不编写自己的导出工具。此外,自从该工具被编写以来,1.5 版本中关于参数的很多东西已经发生了很大的变化。在 1.0 版本中有一个名为 'pdf' 的参数,它是用于 '显示 PDF 图标' 选项的,而在 1.5 中被重命名为 'show_pdf_icon'。这些都是新工具设计考虑的因素。

新工具基于两个概念:一个ETL插件定义了一个转换,该转换创建一个SQL语句。在大多数情况下,这些是提取转换(例如,它来自数据库表),但存在一个ETL插件(配置插件),它从1.0的configuration.php文件中提取设置并将它们放入1.5数据库的不同部分。ETL插件的核心非常简单,可以用最少五行扩展base ETLPlugin类的PHP代码成功实现。这些行基本上定义了插件转换的表名、一个友好的名称和几个括号作为度量。这仅仅是在不进行任何修改的情况下提取表的内容。ETL插件也可以更复杂,提供了跳过表列、重命名表列或轻松更改行中列值的简单方法(因此有转换部分)。这用于在从1.0导出某些表时进行修改,而不是在1.5中尝试这样做,因为我们已经在检查每一行以生成SQL文件。

ETL插件的大部分工作由'doTransformation'函数处理,该函数生成SQL语句。对于大多数插件,这个函数可以被子类安全地继承,其他函数(控制列名或值的修改)应该被更新以添加相关功能。'doTransformation'函数适合迁移者的任务系统,并按照当前任务(表名和当前迭代)的值执行。

还有另一种插件,称为SQL插件。SQL插件实际上是一个包含SQL的文本文件,设计用于第三方开发者可以在ETL插件触发之前在SQL文件中放置'CREATE TABLE'命令,并输出预期的表的INSERT语句。这些插件存储在迁移者的'tables'文件夹中,而ETL插件存储在'plugins'文件夹中。此目录中的文件存在意味着它将被包含在迁移中。由于这应该是一次性的事件,所以没有发布或未发布的状态。

迁移者使用任务系统来防止系统因执行过多命令而超时。任务系统通过询问ETL插件要转换多少行并将此信息存储在表中来工作。完成此操作后,它还会收集所有SQL插件并将它们放入新的迁移SQL文件中。完成所有这些后,任务处理程序将被执行并开始表的ETL。任务系统逐个处理ETL插件,调用'doTransformation'插件。当任务系统检测到接近PHP超时设置的阈值时,它将暂停迁移,更新当前任务并结束输出,告诉浏览器(通过JS)重新加载任务处理程序。它完成这个过程直到系统中没有剩余任务,并且SQL文件完成。

现在我们已经通过迁移者生成了一个漂亮的SQL文件,接下来我们需要将其放入1.5中,这样我们就可以使用所有真正酷炫的功能了。需要注意的是,目前迁移者的行为是剥离现有网站的前缀并替换为jos_ - 我做出这个决定是为了减少文档并简化特性(以便在1.5安装的最后一步中,迁移触发始终是'jos_',但我可能会改变它,因为它似乎造成了混淆)。这并不意味着1.5表必须具有'jos_'前缀,但您确实需要告诉迁移者这是前缀。这引导我进入迁移链的下一步:1.5安装。

1.5版本的安装通常会正常完成,直到最后的配置屏幕。至此,迁移安装和全新Joomla!安装的流程是一样的。但是在最后一个屏幕上,有一些内容需要填写。这个屏幕会要求您输入站点名称、管理员邮箱和密码,最后询问您是要进行迁移加载数据还是样本安装。我们正在进行迁移,所以勾选那个选项并输入信息。记住,迁移的旧前缀总是jos_,所以将其放在那里。编码将使用您旧数据库的编码。您的旧数据库可能是已经是UTF-8,所以选择那个,如果您来自大多数英语国家,默认设置应该没问题,而对于世界其他地区,您需要选择与您所在地区相关的编码。迁移工具使用服务器的'iconv'功能将文件从该格式转换为UTF-8(如果已经是UTF-8则不进行操作!)。如果您没有安装iconv,您需要在将SQL文件提供给Joomla!之前将其转换为UTF-8,这种情况下,您可以将此字段的编码设置为UTF-8。对于Linux用户,可以在本地机器上轻松安装iconv并从那里操作。Windows用户有各种选项(包括我在之前的帖子中提到的一个小型Java应用程序)来将文件转换为UTF-8。

最后几个选项涉及Joomla!获取SQL文件以及它是否是迁移文件。对于小文件,通过HTTP上传界面直接上传很容易,但对于超过PHP上传限制的大文件,可以将文件上传到'installation/sql/migration/'目录,并将文件命名为'migrate.sql',以便安装程序可以找到它。您还需要勾选“I have already uploaded”(我已经上传)复选框以及“This is a 1.0 migration script”(这是一个1.0迁移脚本)复选框。也可以选择使用HTTP上传选项。请记住,无论您选择哪种选项,迁移系统都会修改SQL文件。所以即使您必须通过FTP上传文件,如果迁移失败,您也必须复制文件或重新上传,就像它是通过HTTP上传的一样。

接下来的步骤涉及对迁移文件进行一些更改。这些更改包括重写一些文件,以及修改菜单和模块表,将它们的数据插入临时迁移表而不是实际表。这修改了文件,然后将其输入数据加载脚本。数据加载脚本然后批量将所有信息导入数据库,同时进行检查以确保系统不会超时。这个脚本是一个由Alexey Ozerov编写的'BigDump'脚本的修改版本(可在以下地址找到:http://www.ozerov.de/bigdump.php),它为我们处理导入(并省去了我编写它的麻烦!)。从这里开始,迁移系统会进行一些神奇的操作。它会重写菜单以匹配1.5的新样式,抓取并导入模块,还执行各种批量SQL更新来更改内容。它不会抓取(任何时候)已经更改的站点URL,无论是在URL字段中还是在内容项中。至此,迁移完成,网站准备好运行。

此时,还有一些最后的注意事项。安装过程中会创建并发布一个新的菜单模块(这是在您的旧模块之外的)。您旧站点的所有其他模块即使它们是第三方模块也会被迁移,并设置为未发布。您可以轻松安装模块的1.5版本(或在遗留模式下使用1.0版本),这不会更改数据库条目,所以模块可以轻松迁移。编写ETL插件的第三方组件需要一个特殊的1.5安装程序,该安装程序不会尝试创建数据库表(它们已经存在),以安装文件和相关的数据库条目。

关于迁移器状态,我计划在本周五发布迁移器的一个更新,我正在尝试解决 SQL 文件中创建重复行的最后一个错误。我不太确定是什么原因造成的,但这将是我本周五发布迁移器 RC2 版本之前的最后一个错误(或者希望是明天 GMT+10!)。我还将对 1.5 版本进行一些更改,以确保某些条件得到正确满足,所以请继续关注(我发布时会写一篇简短的博客文章,所以请设置您的聚合器关注 Joomla! 以保持最新)。

给第三方开发者的一个提示,如果您目前在使用数据库之外的配置文件,在 1.5 版本中您可以考虑使用 JRegistry 函数并将您的配置文件迁移到组件表中。有一些非常巧妙的代码可以快速使用这种方法创建配置对象(非常酷),而无需创建自己的配置文件。一个类似于配置插件的 ETL 插件可以允许您进行迁移。