我正在尝试让CakePHP输出一个如下所示的链接:
<a href="/foo/bar" class="some other classes">
<span class="icon new"></span>FooBar</a>
Run Code Online (Sandbox Code Playgroud)
所以我在视图中使用以下代码
<?php
echo $this->Html->link(
$this->Html->tag('span', null, array('class' => 'icon new')) . "FooBar",
array('controller' => 'foo', 'action' => 'bar'),
array('class' => 'some other classes', 'escape' => false)
);
?>
Run Code Online (Sandbox Code Playgroud)
但CakePHP输出如下:
<a href="/foo/bar" class="some other classes">
<span class="icon new">FooBar</span></a>
Run Code Online (Sandbox Code Playgroud)
这打破了我的设计.如何让CakePHP 在标签后附加"FooBar" <span>?
编辑:它也值得一提,我知道<span>标签通常不应该在锚标签内,但在必须的情况下.
您需要使用空字符串而不是nullspan的文本,然后您的代码将按预期工作.
查看HtmlHelper的源代码,将null其视为"特殊"值,仅创建跨度的开始标记.你可以在这一行看到这个:
https://github.com/cakephp/cakephp/blob/2.3.2/lib/Cake/View/Helper/HtmlHelper.php#L906
将您的代码更改为此代码应该可以正常工作;
echo $this->Html->link(
$this->Html->tag('span', '', array('class' => 'icon new')) . "FooBar",
array('controller' => 'foo', 'action' => 'bar'),
array('class' => 'some other classes', 'escape' => false)
);
Run Code Online (Sandbox Code Playgroud)
</span>对于那些想知道的人,有点解释:
您的示例中的结束 </span>实际上不存在于CakePHP生成的输出中,而是由您的浏览器自动"添加".如果您在浏览器中查看HTML 的来源,您会发现这实际上是HTML中的内容:
<a href="/foo/bar" class="some other classes">
<span class="icon new">FooBar</a>
Run Code Online (Sandbox Code Playgroud)
如你所见,没有关闭'跨度'
由于<span>未关闭,浏览器将尝试更正此错误并自动假设您"忘记"关闭它.因此,它会</span>在找到的下一个标记之前添加一个结束(在这种情况下是结束</a>).
浏览器中的"检查器"将始终显示浏览器用于呈现输出的HTML .这包括浏览器和动态生成的元素(例如通过JavaScript添加的元素)进行的自动更正.
要检查PHP脚本的输出,请始终查看源,而不是检查器