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>标签通常不应该在锚标签内,但在这种情况下它是必须的。

4

4 回答 4

5

您需要使用空字符串而不是null跨度的文本,然后您的代码将按预期工作。

查看 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>)。

浏览器中的“检查器”将始终显示浏览器用于呈现输出的HTML。这包括浏览器进行的自动更正动态生成的元素(例如通过 JavaScript 添加的元素)。

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

于 2013-04-13T16:34:01.413 回答
1

在这种情况下,我完全避免使用 CakePHP 帮助程序,因为标记变得非常混乱,无法利用 IDE 中的自动完成或验证。

我通常会这样做:

<a href="<?php echo Router::url(array('controller'=>'myController', 'action'=>'index'))?>"><span class="icon-new"></span>Foobar</a>
于 2013-04-13T17:51:04.973 回答
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 年了,我看不到在这种情况下使用标签的好处。

于 2013-04-13T17:43:30.657 回答
-3

在这种情况下你能使用普通的 PHP 吗?

我想你可以这样做:

<?PHP
   echo('<a href="' . '/foo/bar' . '" class="' . 'some other classes' . '"><span class="' . 'icon new' . '"></span>' . 'FooBar' . '</a>')
?>
于 2013-04-13T15:11:17.953 回答