Anchor标签内的CakePHP跨度标签

时间:2013-04-13 14:54:57

标签: html css cakephp

我正在尝试让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>标签通常不应该在锚标签中,但在必须的情况下。

4 个答案:

答案 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>')
?>