CakePHP:当用户从一个页面更改为另一个页面时,在布局上使用变量

时间:2011-02-10 18:19:41

标签: php cakephp layout cakephp-1.3

我设置了一个变量,因此可以从控制器使用它将值“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包装标签之后,我也不确定它是否会起作用。

4 个答案:

答案 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变量。所有显示逻辑都在布局或视图中,它们应该在哪里。我喜欢任何能让我减少编码的东西。