magento产品视图页面中的W3C验证器问题

时间:2013-09-10 09:47:11

标签: magento magento-1.7 w3c-validation xhtml-1.0-strict

我在w3c验证器的产品视图页面中出错

我的产品是可下载的产品。我有该产品的自定义选项enter image description here

当我在w3c验证器中验证测试产品页面时,它会显示如下错误

  

没有属性“价格”

     

...“id =”options_21_2“value =”27“price =”0“/>

错误行:

<ul id="options-21-list" class="options-list"><li><input type="checkbox" class="checkbox product-custom-option" onclick="opConfig.reloadPrice()" name="options[21][]" id="options_21_2" value="27" price="0" /><span class="label"><label for="options_21_2">Test Product</label></span></li></ul> 

帮助解决此问题。

1 个答案:

答案 0 :(得分:1)

背景

问题在于,price自定义属性。尽管几乎所有浏览器都可以按照您发布的方式使用它,但有效的(X)HTML属性,例如idname

W3C验证程序根据文档<!DOCTYPE .. > declaration中的DTD(文档类型定义)验证您的源代码。

Magento CE / EE 1.x版本默认使用XHTML 1.0 Strict DTD

DTD声明文档必须遵循哪些规则才能对给定的文档类型有效。它定义了允许哪些元素类型,特定元素可以具有哪些属性,可以使用哪些实体等等。

如果您检查上面的链接DTD,您会发现文件中的任何位置都没有定义price属性。

这就是为什么W3C验证器正确地抱怨.. there is no attribute "price"

你能做什么?

主要关于如何处理这种情况,我想到以下三件事:

仔细检查后忽略

您可以简单地忽略此(并且仅限于此)特定类型的W3C验证错误。

我猜这是大多数开发人员所做的“..没有属性attr_name”验证错误,当他们已经双重检查时,它是一个真正使用的自定义属性,只有W3C验证失败(使用HTML5之前的DTD),但是否则完全正常。

扩展DTD

您可以扩展XHTML 1.0 Strict DTD,为特定元素添加自定义属性。

有关如何使用内部子集为price元素添加自定义input属性的示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[
<!ATTLIST input price CDATA #IMPLIED>
]
>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<title>Test</title>
</head>
<body>
<p>
<input type="checkbox" class="checkbox product-custom-option" onclick="opConfig.reloadPrice()" 
name="options[21][]" id="options_21_2" value="27" price="0" />
</p>
</body>
</html>

包含此内部子集,W3C验证程序将无错误地进行验证。

,当内部子集发挥作用时,大多数主要浏览器都会渲染丑陋的]>

也许吧,因为他们不支持嵌套标签(根本没有,或者说是正确的),或者他们一旦在<!DOCTYPE .. >找到正式的DTD就切换到他们的硬连线DTD,我无法分辨准确。

要避免使用]>,您可以使用原始DTD作为基础构建自定义DTD ,使用自定义属性对其进行扩展,并更改!<DOCTYPE .. >以使用该属性自定义DTD。

使用自定义DTD的关键是,即使技术上正确,浏览器也不再渲染丑陋的]>,您也不能再使用W3C验证器了。它不支持自定义DTD。

因此,如果必须遵守W3C,您唯一的选择就是保持内部子集。但是你仍然需要以某种方式摆脱丑陋的]>。要实现这一点,您可以使用一些CSS,例如与此类似:

html {
    color: transparent;
}

请注意,扩展DTD可能会导致大量工作。您需要扩展自定义属性可能出现的所有元素类型。当然,您需要为每个自定义属性执行此操作。

使用HTML5 data-*属性

您可以重写Magento模板以使用HTML5及其data-* attributes,这样您只需使用data-为自定义属性名称添加前缀,即可使其完全有效。

但是,由于将Magento 1.x从XHTML 1.0严格转移到HTML5会导致大量复杂的工作,我不认为这是一个选项。

Afaik,即使是Magento 2.x也会切换到HTML5,但继续使用XHTML 1.0 Strict。

也许出于同样的原因^^