扩展布局.xml在不同<供应商>的子主题中不起作用的文件,作为父主题:Magento 2.0.4


Extending Layout .xml files not working in child theme in different <vendor> as to parent theme: Magento 2.0.4

重现的步骤

  1. 在WAMP服务器3.0上安装Magento 2.0.4,Windows 10 Pro - 32位,PHP 5.6.15,MySQL 5.7.9
  2. 在应用程序''设计''前端''供应商 1''主题父中创建Magento_blank的子主题主题父级,其中包含多个用于扩展的布局 xml 文件以及模板 .phtml 文件。从管理员激活。 工作正常。

主题.xml => <parent>Magento/blank</parent>

  1. 创建了上述主题父级的另一个子主题主题子级(它本身就是 magento 空白的子级)。此子主题在不同的供应商文件夹中创建,即供应商2此主题路径是 app''design''frontend''Vendor2''themechild 。在内部创建了布局.xml文件以扩展其父主题布局。从管理员激活了这个二级子主题。 .xml文件甚至没有处理。不工作。

主题.xml => <parent>Vendor1/themeparent</parent>

3b.尽管如果从 Vendor1''themeparent 布局文件调用相应的布局容器/块,则模板 .phtml 文件或子主题中存在的.css文件工作正常。

  1. 如果对于测试,相同的子主题子主题放入其父级的同一供应商中,即 Vendor1,主题路径变为应用程序''设计''前端''供应商 1''主题子,然后相同的布局.xml文件工作正常。

已经尝试清除洋红色的公共/静态var文件夹。另外,在使用 cli 命令运行后尝试

php bin/magento setup:static-content:deploy
php bin/magento indexer:reindex 
php bin/magento setup:upgrade

但没有什么能解决它。

预期成果

所需的主题继承是这样的:

Magento_blank => 供应商 1_themeparent => 供应商 2_childtheme 。(注意供应商不同)

结果:布局.xml无法在子主题中加载。

但如果为了测试,继承是这样做的:

Magento_blank => 供应商 1_themeparent => 供应商 1_childtheme .(注意供应商相同)

结果:布局.xml正确加载并在子主题中正常工作。

根据Magento 2关于 http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/themes/theme-inherit.html#set-a-parent-theme 的指南,明确提到"父主题和子主题可以属于不同的供应商。例如,您的自定义主题可以从Magento Blank主题继承。因此,如果我从父主题(在供应商 2 中)创建二级子主题(在供应商 2 中),该父主题是Magento_blank的子主题(供应商:Magento),这在理想情况下应该可以正常工作。但它没有发生。如果布局.xml文件位于不同的供应商下,则不会对其进行处理以输出。如果我将两个主题放在同一个供应商中,它们工作正常。

实际结果

在不同供应商文件夹中扩展第 2 级子主题.xml布局

文件不起作用。

为什么Magento 2.0.4不能正常工作,用于具有不同供应商名称的2级主题继承?这是一个严重的问题,就好像您假设从某个地方购买了付费主题(他们通过继承Magento_blank创建),现在您想创建该付费主题的子主题,但在不同的供应商名称文件夹中(显然在您的公司名称下),您将无法这样做!您只剩下两个选择,要么将子主题放在他们的供应商名称中;或编辑其主题.xml文件以调用您的子主题模板文件或.css/.js(如果您的供应商名称);第二种情况显然会丢失更新,方式很奇怪,不推荐。

那么解决方案是什么??

给它更多的时间来找到原因,我用不同的供应商名称创建了不同的父主题和子主题集,并在同一安装中检查了它,它有效!我很惊讶,与我之前在主题中所做的方式相匹配;新旧都一模一样。再次激活了我的孩子主题,令人惊讶的是它不起作用。更惊讶和厌倦。:(

然后我深入研究了magento数据库,发现了一件令人惊奇的事情。在 magento 数据库的"主题"mysql 表中,不知何故,与我的子主题对应的"类型"列的值设置为"1",所有其他列都设置为"0"。在怀疑下,我试图通过表列名称中的注释找到它的含义,该注释显示..

0 => Physical
1 => Virtual
2 => Staging

我猜这可能是一个原因,并手动将"类型"列值设置为0对应于我的子主题。清除了变量和公共/静态文件夹。重新测试,瞧!成功了!!

这个小问题浪费了我的 4-5 天,没有解决方案。即使停用激活或从管理员切换主题也没有将其值重置为 0(始终保持 1),因此它从未起作用。

为了进行交叉检查以确认,我从数据库主题表中删除了该行,然后重新安装了主题,运行了php bin/magento setup:upgrade,现在它将值设置为 0,这是完美的并且会自动工作。

不知道它是如何设置为 1 的,什么时候。它应为 0。

无论如何,问题现在已经解决了,并且

我发现了一件非常小的事情,但一件非常大的事情

如果不知道,这可能会浪费每个开发人员的时间。但是,令人惊讶的是,互联网上没有提到这个愚蠢的观点,甚至在必须存在的 magento 文档中也没有提到。希望这个解释和解决方案能帮助更多以后对同一问题感到沮丧的人。:)

这个问题也在 https://github.com/magento/magento2/issues/4330 上提出和解释

谢谢。