如何将您的旧 Joomla 3 模板 J4 化
Joomla 是一个美丽成熟的内容管理系统,长期使用 Joomla 的人可能会在我说它有时会是一段颠簸的旅程时点头同意。看看这篇文章 '庆祝 Joomla 4' 来了解 Joomla 4 的新功能。
如果您对 Joomla 相对较新,那么您的网站可能使用的是与 Joomla 4 兼容的模板(或者至少您的模板开发者提供了一个完全兼容 J4 的模板版本)。那么您很幸运,这篇文章对您来说并不重要。但如果您的网站已经运行多年,您正在考虑从 Joomla 3 迁移到 Joomla 4 呢?
在您决定之前,您必须回答许多问题,Joomla 3.10 中的新功能 Pre-Update-Checker (https://magazine.joomla.net.cn/all-issues/august/pre-update-check-your-path-to-joomla-4) 将在很大程度上帮助您回答这些问题。在这篇文章中,我专注于这些问题中的一个: 如何处理您当前的 Joomla 3 前端模板?
您的选择
和生活中一样,您有多种选择
- 您可以利用这个机会放弃您的旧模板,完全拥抱未来。我相信您阅读这篇文章的时候,会有很多 Joomla 4 的模板可供选择。
- 您希望在您的新的 Joomla 4 网站上继续使用当前的模板。在这种情况下,您也有两种可能的选择
- 您的模板开发者为您的模板提供了一个更新版本,兼容 Joomla 4。
- 您的模板没有更新版本
情景 2.b:没有可用的更新版本
我们正在查看场景2.b,因为所有其他场景的解决方案都很简单(与您的模板开发者一起)。事先提醒:这将是一个非常实际和技术的过程(您需要更改数据库和模板的PHP代码),所以如果您不熟悉代码或数据库,可能需要寻求专业帮助。确保您有备份,以便在出错时恢复,如果您不知道如何进行备份,请安排一个备用人员随时待命以帮助您。
准备工作
创建一个新的Joomla 4测试站点,以免破坏您的实际网站,该网站应仍运行在Joomla 3.10上。使用与J3站点相同的数据库表前缀。
激活Joomla的“调试”功能,请参阅以下博客文章了解如何操作:https://www.joomdev.com/blog/entry/how-to-enable-debug-and-error-reporting
将J3站点的'/templates/YOURTEMPLATE/'目录复制到您的J4-测试站点
将您的完整J3网站数据库备份到计算机上的本地文件中,请参阅相关文档了解如何操作(滚动到名为“数据库备份”的部分:https://docs.joomla.org/Backup_Basics_for_a_Joomla!_Web_Site
准备插入数据库记录
您需要从您的J3数据库中插入两个数据库记录到您的J4-测试数据库中,并且需要对这两个记录进行一些小的修改
- 在记事本或代码编辑器中打开您下载的文件。找到数据库表
'#__extensions'
(其中 '#__' 代表您实际的数据库表前缀)。 - 找到 'INSERT INTO #__extensions' 部分,带有 YOURTEMPLATE 数据行 - 它看起来像下面这样 - 将它复制到一个空的记事本或代码编辑器文件中:首先是从 INSERT INTO 到 VALUES 的部分,然后是适用于您的模板的部分。
第一部分应该看起来像这样
INSERT INTO `#__extensions` (`extension_id`, `package_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES
第二部分应该看起来像这样
(10007, 0, 'YOURTEMPLATE', 'template', 'YOURTEMPLATE', '', 0, 1, 1, 0, '{\"name\":\"YOURTEMPLATE\",\"type\":\"template\",\"creationDate\":\"01.01.2000\",……………..,\"filename\":\"templateDetails\"}', '{\"template_width\":\"1400\",\"body_color\":\"#ffffff\",…………….,\"bottom_modules_switch\":\"1\",\"base_modules_switch\":\"1\"}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
想法是将这两部分粘贴在一起,以便您有一个语句;第一部分包含有关存储数据的位置的信息,第二部分包含需要存储的数据。
重要: Joomla 4不再在此表中拥有《b>system_data字段,因此您需要从《b>INSERT语句中删除此字段 - 我们在示例中用黄色标记了此字段(字段名称和空值)。请确保您也删除相应的冒号。
- 找到数据库表 '#__template_styles'(其中 '#__' 代表您实际的数据库表前缀)。
- 找到 'INSERT INTO #__template_styles' 部分,带有 YOURTEMPLATE 数据行 - 它看起来像下面这样 - 并将其复制到一个空的记事本或代码编辑器文件中,就像您在上一个步骤中做的那样。
第一部分应该看起来像这样
INSERT INTO `#__template_styles` (`id`, `template`, `client_id`, `home`, `title`, `params`, `inheritable`, `parent`) VALUES
第二部分应该看起来像这样
(9, 'YOURTEMPLATE', 0, '1', 'YOURTEMPLATE - Standard', '{\"template_width\":\"1200\",………….. "base_modules_switch\":\"0\"}', 0, '');
想法是将这两部分粘贴在一起,以便您有一个语句;第一部分包含有关存储数据的位置的信息,第二部分包含需要存储的数据。
现在您有两个INSERT语句。
- 现在使用phpMyAdmin将这些两个INSERT INTO行提交到您的J4-测试数据库中。
在J4-测试网站上使用您的模板
登录到Joomla后端,转到“系统”->“网站模板样式”
请确保只有您的模板被选为“默认”。您可能需要取消选择卡西奥佩亚模板才能实现这一点。
为您的J4-测试站点创建一些内容,例如几篇文章和类似于您实际网站的菜单结构。这应该可以帮助您找到模板中最常见的问题。
现在,您可以修复Joomla 4与您的模板可能存在的任何问题!我们将在以下部分列出最常见的错误以及如何解决它们……但您可能会遇到其他问题,所以请在下方的评论中分享您找到的结果。
模板的附加插件/框架
您的模板可能需要额外的元素(位于“templates/YOURTEMPLATE”目录之外),例如库或插件。如果您看到的错误信息不涉及您的模板目录,而是其他地方,则表示这一点。
基本上,将这些元素转换为J4的步骤与模板类似
- 将您的J3站点上的相应目录复制到您的J4-测试站点
- 在'#__extensions'数据库表(可能不需要其他数据库表)中找到并插入相应的数据库记录
- 以与模板相同的方式修复您遇到的问题(请参阅以下章节)
未找到行为框架
要修复此错误,请查看第一个出现YOURTEMPLATE(当然,这是您模板的名称)的调用栈。在我们的示例中,这是您模板目录中的index.php,错误发生在该文件的第12行。使用纯文本编辑器打开该文件。在第12行,您将找到类似以下内容:
JHtml::_('behavior.framework', true);
您可以通过“忽略”此行来修复此错误:
/*** JHtml::_('behavior.framework', true); ***/
无法访问受保护的属性 …… ::$params
要修复此错误,请查看调用栈中的行。在我们的示例中,这是名为“STOOLS”的系统插件中的class.menu.php(我们示例中的模板需要该插件),错误发生在该文件的第65行。使用纯文本编辑器打开该文件。在第65行,您将找到类似以下内容:
… xyz->params ….
您可以通过调用函数'getParams()'而不是属性'params'来修复此错误
… xyz->getParams()
找不到JSite类
要修复此错误,请查看调用栈中的行。在我们的示例中,这是名为“STOOLS”的系统插件中的class.menu.php(我们示例中的模板需要该插件),错误发生在该文件的第170行。使用纯文本编辑器打开该文件。在第170行,您将找到类似以下内容:
… $router = JSite::getRouter();
您可以通过将'JSite'部分重命名为'JApplicationSite'来修复此错误
… $router = JApplicationSite::getRouter();
调用未定义的方法isSite / isAdmin
调用未定义的方法Joomla\CMS\Application\SiteApplication::isSite()
调用未定义的方法Joomla\CMS\Application\SiteApplication::isAdmin()
要修复此错误,请查看调用栈中的行。在我们的示例中,这是模板框架WARP(我们示例中的模板需要该框架)中的system.php,错误发生在该文件的第86行。使用纯文本编辑器打开该文件。在第86行,您将找到类似以下内容:
… isSite()
…isAdmin()
您可以通过将'isWhichone()'部分重命名为'isClient('whichone')'来修复此错误
… isClient('site')
… isClient('administrator')
未定义属性: stdClass::$catslug
要修复此错误,请使用纯文本编辑器打开错误消息中引用的文件。在错误消息中引用的行,您将找到类似以下内容:
… $this->item->catslug…
您可以通过将'catslug'部分重命名为'catid'来修复此错误
… $this->item->catid…
将您的更改复制回您的 Joomla 3 网站上
一旦您对您的 J4-Test 网站中的所有 Joomla 4 问题都感到满意,您就可以将所有更改复制回您的真实网站。
- 将您的 J3 网站切换到维护模式,了解如何操作:[https://docs.joomla.org/Taking_the_website_temporarily_offline](https://docs.joomla.org/Taking_the_website_temporarily_offline)
- 通过检查预更新检查器确保所有其他扩展程序都与 Joomla 4 兼容。
- 重要提示:请为您的 Joomla 3 网站再做一个完整的备份!您接下来采取的步骤可能会破坏您的网站(尽管您已经检查了您的扩展程序,但仍然,安全比后悔好)!
- 将您的 J4-Test 网站中的 '/templates/YOURTEMPLATE/' 目录复制到您的 J3 网站上。
- 检查您的网站(由于您处于维护模式,您首先需要登录)以确保一切正常运行。如果不正常,那么
找到问题,可能您需要撤销所做的更改(并且仅在您实际迁移到 Joomla 4 时再次进行更改)。 - 将维护模式切换为关闭
在此还有另一个警告:如果您的网站严重依赖于第三方扩展程序(如网店、活动预订、社区工具等),则您的模板可能与这些扩展程序有关联的问题。因此,请记录下您在模板中必须更改的内容,以便在迁移到 Joomla 4 后对模板进行类似的更改。
现在您可以回答“是,可能”来回答问题:您的模板是否已准备好使用 Joomla 4?
结论
如果您的 Joomla 网站已经运行多年,那么您的当前模板可能与 Joomla 4 不兼容。如果您决定保留模板并需要手动修复可能出现的问题,我这里提供了一些常见问题的解决方案。
您可能需要解决许多与 Joomla 4 相关的旧 Joomla 3 模板问题,但我相信,凭借您所拥有的相关软件开发技能和这篇文章,大部分问题都可以解决。确实,这需要一些资源,您需要考虑这种努力是否合理,或者您最好拥抱未来,立即使用现代 J4 模板。
一旦您的网站上的所有内容看起来都为 Joomla 4 准备就绪,您就可以计划将您的网站实际迁移到 Joomla 4。但作为一般规则,您应该留出足够的时间来解决可能在您的新 Joomla 4 网站上出现的任何进一步问题 -这次迁移远不止是一个简单的更新(例如,从 Joomla 3.10.1 更新到 3.10.2)。
其他资源
这里的大多数解决方案都是通过“有教育意义的谷歌搜索”找到的,但 Joomla 4 后向兼容性问题博客文章也是一个很好的来源。
与我们分享您的经验!
请还与我们分享您自己的模板 J4ification 经验,以提高这篇文章并帮助他人解决挑战。
在 Joomla 社区杂志上发表的一些文章代表了作者在特定主题上的个人观点或经验,可能不代表 Joomla 项目官方立场。
通过接受,您将访问由 https://magazine.joomla.net.cn/ 之外的第三方提供的服务。
评论 2
当然,一旦你开始将你的网站J4化,你总会发现更多问题(至少对我来说是这样 )。
0 - 未找到类 'JRequest'
如果你遇到这个错误信息,你将在你的代码中找到类似以下的内容
JRequest:
你可以用以下代码替换此代码以解决这个问题
JFactory::getApplication()->input->
还有另一个。
错误处理现在使用异常而不是JError(参见 https://docs.joomla.org/Potential_backward_compatibility_issues_in_Joomla_4 )。
为了避免这个错误,替换JError调用
JError::raiseError(500, JText::_('T3_MISSING_T3_PLUGIN'));
为THROW NEW EXCEPTION
throw new Exception(JText::_('T3_MISSING_T3_PLUGIN'), 500);