我设置了一个变量,因此可以从控制器使用它将值“current”传递给用户浏览的位置。它工作正常,但我需要一个条件编程来补偿其他页面。假设我浏览到页面类别,类别控制器会将变量$ current传递给我的布局但是出了问题我们将有两个带有该特殊ID的链接,例如。
<li id="<?php echo "$current";?>"><?php echo $this->Html->link('Home', '/'); ?></li>
<li id="<?php echo "$current";?>"><?php echo $this->Html->link('Category', '/categories'); ?></li>
我知道有条件要求,有人可以写出来吗?我不确定我是否可以使用if else,因为其他页面声明了未定义的变量。这有点棘手,也许有人可以为这个做一个工作编程逻辑?
更新 嗨,我正在努力做到这一点:
<?php if($current==NULL) {
<?php echo "<li id="current">";?>
<?php echo $this->Html->link('Home', '/'); ?>
<?php echo "</li>"; ?>
}
<?php else: ?>{
<?php echo "<li>";?>
<?php echo $this->Html->link('Home', '/'); ?>
<?php echo "</li>"; ?>
}
<?php endif ?>
我在<li> tags
解析时遇到错误。有谁知道如何用PHP包裹<li> tag
?
P.S。我已经尝试了下面所有建议的可能解决方案,无法让它对我有用。我认为这个目前我正在尝试似乎是最简单的?感谢。
即使在用PHP包装标签之后,我也不确定它是否会起作用。
答案 0 :(得分:2)
如果其他回复正确,您尝试突出显示导航中的当前页面,请查看以下帮助:http://www.richardathome.com/blog/cakephp-smarter-links
它扩展了内置的链接助手,增加了两位功能:
-Links应该在a)时自动为自己添加一个类 指向同一个资源 控制器和b)指向 自己。
- 能够显示/隐藏自己。
帮助程序工作正常,我在几个项目中使用它。
响应更新
如果这是您的实际PHP,则会出现一些格式错误。这一行无效:
<?php echo "<li id="current">";?>
你需要逃避内部引号,如下所示:
<?php echo "<li id=\"current\">";?>
但是你的牙套也有点不合适。请尝试以下方法:
<?php
if($current==NULL) {
echo "<li id=\"current\">";
echo $this->Html->link('Home', '/');
echo "</li>";
}
else {
echo "<li>";
echo $this->Html->link('Home', '/');
echo "</li>";
}
?>
更新2
正如评论中提到的,我怀疑$ current实际上从来就不是NULL。在PHP中,空字符串不是NULL。我建议不要测试NULL,而是测试空虚。
如果值为null,0,false,“”或空数组,则empty()函数将返回true。见这里:http://au.php.net/manual/en/function.empty.php
所以你的代码变成了:
<?php
if(empty($current)) {
echo "<li id=\"current\">";
echo $this->Html->link('Home', '/');
echo "</li>";
}
else {
echo "<li>";
echo $this->Html->link('Home', '/');
echo "</li>";
}
?>
甚至更好(只是减少重复):
<?php
if(empty($current)) {
echo "<li id=\"current\">";
}
else {
echo "<li>";
}
echo $this->Html->link('Home', '/');
echo "</li>";
?>
答案 1 :(得分:1)
我不确定CakePHP的具体细节,但是你需要一些能够实现的效果:
$current = 'category'; // in controller
if($current=='category') { echo 'current' } // in view
每个链接。
如果尚未内置。
答案 2 :(得分:1)
我猜你正在尝试建立一个菜单,其中菜单上的当前页面的样式不同?如果情况并非如此,那么我的答案将需要适应您的具体情况。
如果是这种情况,那么罗斯是完全正确的,虽然我可能会略微区别地写出来以适应我的个人美学:
<li class="<?php ($current=='category') ? echo 'active' : echo 'inactive' ?>">
另请注意,我使用class
而不是id
,因为这是编写CSS的更好方法。如果你不认识语法,它就是三元运算符 - 一种条件'切换'的简写。
修改强>
逻辑($current==null
??),语法,风格和效率都存在一些问题。我希望我已在下面更正了这些内容。
除非字符串包含变量或特殊字符(换行符等),否则应使用单引号(')。 PHP会更慢地解析double(“)引号。在第一行<li>
行中使用双引号在语法上是错误的。
你有<?php ... ?>
块以外的大括号。
整个代码块可以包含在一对<?php .. ?>
中。
<?php
if($current)
{
echo '<li id="current">';
echo $this->Html->link('Home', '/');
echo '</li>';
}
else
{
echo '<li>';
echo $this->Html->link('Home', '/');
echo '</li>';
}
?>
答案 3 :(得分:0)
您是否尝试制作可自动了解用户所在页面的导航,并相应地突出显示导航(标签?)?
如果是这种情况,那么我对你有一些想法。
如果你想为所有控制器设置$ current变量,那么你可能想把它放在app_controller中。您可能没有,默认情况下它不在蛋糕部署中。您可以在CAKE_HOME / app / app_controller.php
添加它它看起来像
<?php
class AppController extends Controller {
function beforeFilter() {
$this->set('current', $this->name . '.' . $this->action);
}
}
?>
替代方案,我在我的应用程序中执行的操作,是不使用变量$ current,而是使用内置变量$ this-&gt; name(控制器名称)和$ this-&gt;操作(行动名称)
<?php $tmp = $this->here . '/'. $this->action; ?>
<li class="<?php ($tmp == '/') ? e('active-tab') : e('tab'); ?>">
<?php echo $this->Html->link('Home', '/'); ?>
</li>
<li class="<?php ($tmp == '/categories/index') ? e('active-tab') : e('tab'); ?>">
<?php echo $this->Html->link('Category', '/categories'); ?>
</li>
好处是您不必在每个控制器操作中显式设置$ category变量。所有显示逻辑都在布局或视图中,它们应该在哪里。我喜欢任何能让我减少编码的东西。