CakePHP中锚链接内的Span标签

5

我想让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在<span>标签之后附加"FooBar"?

编辑:值得一提的是,我知道<span>标签通常不应位于锚标记内,但在这种情况下必须这样做。


在编程中,IMO span标签在<a>标签内是完全可以的! - thaJeztah
4个回答

5
使用空字符串代替null作为span的文本,这样您的代码就能按预期工作了。
查看HtmlHelper的源代码,null被视为“特殊”值,导致只创建span的开放标签。您可以在以下代码行中看到其实现: 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> 没有关闭,浏览器将尝试纠正此错误并自动假设您“忘记”关闭它。因此,在找到下一个标签之前(在本例中为关闭的 </a>),它会添加一个关闭的 </span>

您浏览器中的 '检查器' 总是显示浏览器用于呈现输出的 HTML。这包括浏览器进行的自动更正以及动态生成的元素(例如通过 JavaScript 添加的元素)。

要检查 PHP 脚本的输出,请始终查看源代码,而不是检查器


1
在这种情况下,我完全避免使用CakePHP帮助程序,因为标记变得非常混乱,并且无法利用IDE中的自动完成或验证。 我通常会做这样的事情:
<a href="<?php echo Router::url(array('controller'=>'myController', 'action'=>'index'))?>"><span class="icon-new"></span>Foobar</a>

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年了,我不认为在这种情况下使用标签有什么好处。


我同意你的观点,在像这样简单的情况下,我也会选择你的方法。我决定以原帖的代码为基础(基本上是正确的,除了一些对空值的“魔法”Cake处理),并解释为什么它不起作用。 - thaJeztah

-3

在这种情况下,您能使用常规的PHP吗?

我认为你可以这样做:

<?PHP
   echo('<a href="' . '/foo/bar' . '" class="' . 'some other classes' . '"><span class="' . 'icon new' . '"></span>' . 'FooBar' . '</a>')
?>

在这种情况下,他可以简单地使用HTML制作整个网页。那么框架的意义是什么呢? - tomsseisums
在CakePHP中,使用文本URL绝对不是明智之选,因为您将无法使用(反向)路由,即使您为此操作创建了特殊路线,/foo/bar/也将始终是/foo/bar - thaJeztah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接