0

我有以下代码列出了在 CakePHP 中构建的博客的标签:

$tagsList = $this->requestAction('/tags/listTags');
foreach ($tagsList as $tagsListTag) {
    echo '<li'. strpos($this->here, Router::url(array('controller'=>'tags','action'=>'view','slug'=>$tagsListTag['Tag']['slug'])) ? ' class="selected"' : '' ).'>'.$this->Html->link($tagsListTag['Tag']['title'],array('controller'=>'tags','action'=>'view','slug'=>$tagsListTag['Tag']['slug']),array('class'=>'tag')).'</li>';
}

我添加了一些逻辑,将当前 URL 与每个链接的路由器 URL 进行比较,如果匹配,则应selected<li>

但是它不起作用,即使只是呼应$this->hereRouter::url表明它们是相同的!我添加课程的方式是否还有其他问题?

4

1 回答 1

1

首先,您的括号设置不正确,您的代码片段将产生解析器错误。我假设这个错误只存在于这个代码示例中?它应该看起来像这样:

'<li' . (strpos($this->here, Router::url(array(...))) ? ' class="selected"' : '') . '>'

另一个问题是strpos可以返回0(在needle位置找到)以及布尔值(未找到),并且因为评估为假(参见http://php.net/manual/en/language.types.boolean.php ) 如果 URL 在第一个字符处匹配,您的条件将失败。0haystackfalseneedle0

因此,您要么也必须进行测试,要么以0不同的方式比较这些值。在测试 URL 时,您很可能希望匹配确切的 URL,因此您可以简单地使用比较运算符===

$this->here === Router::url(...)

如果您只需要匹配 URL 的一部分,您可以保留strpos并严格匹配0

(strpos($this->here, Router::url(array(...))) === 0 ? '...' : '...')

这将匹配确切的 URL,以及所有以 . 开头的 URL needle

于 2013-09-09T11:40:39.730 回答