我正在尝试让CakePHP输出一个如下所示的链接:
<a href="/foo/bar" class="some other classes">
<span class="icon new"></span>FooBar</a>
所以我在视图中使用以下代码
<?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)
);
?>
然而,CakePHP输出以下内容:
<a href="/foo/bar" class="some other classes">
<span class="icon new">FooBar</span></a>
这打破了我的设计。我怎样才能让CakePHP在<{i> <span>
标签之后附加“FooBar”?
编辑:还值得一提的是,我知道<span>
标签通常不应该在锚标签中,但在必须的情况下。
答案 0 :(得分:5)
您需要使用空字符串而不是null
作为范围的文本,然后您的代码将按预期工作。
查看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)
);
</span>
对于那些想知道的人的一些解释:
示例中的结束 </span>
在CakePHP生成的输出中实际上不存在,但是您的浏览器会自动“添加”。如果您在浏览器中查看HTML的来源,您会发现这实际上是HTML中的内容:
<a href="/foo/bar" class="some other classes">
<span class="icon new">FooBar</a>
如您所见,没有关闭'span'
由于<span>
未关闭,浏览器会尝试更正此错误并自动假设您“忘记”关闭它。因此,它会在找到的下一个标记之前添加一个结束</span>
(在这种情况下是结束</a>
)。
浏览器中的“检查器”将始终显示浏览器使用呈现输出的HTML。这包括由浏览器和动态生成的元素(例如通过JavaScript添加的元素)进行的自动更正。
要检查PHP脚本的输出,请始终查看源,而不是检查器
答案 1 :(得分:1)
在这种情况下,我完全避免使用CakePHP助手,因为标记变得非常混乱,无法在IDE中利用自动完成或验证。
我通常做这样的事情:
<a href="<?php echo Router::url(array('controller'=>'myController', 'action'=>'index'))?>"><span class="icon-new"></span>Foobar</a>
答案 2 :(得分:0)
对我来说这看起来有点矫枉过正。就这样做:
echo $this->Html->link(
"<span class="icon new"></span> FooBar",
array('controller' => 'foo', 'action' => 'bar'),
array('class' => 'some other classes', 'escape' => false)
);
我已经使用CakePHP 4年了,在这个例子中我没有看到使用tag的好处。
答案 3 :(得分:-3)
在这种情况下,您是否可以使用常规PHP?
我想你可以这样做:
<?PHP
echo('<a href="' . '/foo/bar' . '" class="' . 'some other classes' . '"><span class="' . 'icon new' . '"></span>' . 'FooBar' . '</a>')
?>