【问题标题】:CakePHP: Using a variable on the layout when user is changing from page to pageCakePHP:当用户从页面更改为页面时在布局上使用变量
【发布时间】:2011-06-25 01:34:31
【问题描述】:

我设置了一个变量,以便控制器可以使用它来将值“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 ?>

我在解析 &lt;li&gt; tags 时遇到错误。有谁知道如何在 PHP 中包装 &lt;li&gt; tag 吗?

附:我已经尝试了下面所有建议的可能解决方案,但无法让它为我工作。我认为目前我正在尝试的这个似乎是最简单的?谢谢。

我不确定它是否会工作,即使在 PHP 中包装了标签。

【问题讨论】:

  • 您这样做是为了突出显示列表中的当前操作吗?如果是,那么这可能会有所帮助$this-&gt;set('current', $this-&gt;params['controller'].'/'.$this-&gt;params['action']);
  • 大家好,是的,我正在尝试突出显示当前页面。我在这里尝试了一些建议,但尚未成功完成,我目前正在尝试使用助手。感谢您的热情回复,由于时区不同,更新延迟,敬请见谅。
  • 大家好,这个问题已经解决了,我还在尝试打勾哪个答案对成功的贡献最大。给我一些时间。

标签: php cakephp layout cakephp-1.3


【解决方案1】:

我不确定 CakePHP 的具体细节,但您需要以下效果:

$current = 'category';  // in controller

if($current=='category') { echo 'current' } // in view

对于每个链接。

如果还没有内置。

【讨论】:

    【解决方案2】:

    我猜您正在尝试构建一个菜单,其中菜单上的当前页面的样式不同?如果不是这种情况,那么我的回答将需要适应您的具体情况。

    如果是这样的话,那么罗斯是完全正确的,虽然我可能会写得稍微不同以适应我的个人审美:

    <li class="<?php ($current=='category') ? echo 'active' : echo 'inactive' ?>">
    

    还请注意,我使用了class 而不是id,因为这将是编写 CSS 的更好方法。如果您不认识语法,那就是 三元运算符 - 一种条件“切换”的简写。

    编辑: 逻辑($current==null??)、语法、风格和效率都存在一些问题。我希望我在下面更正了这些。

    除非字符串包含变量或特殊字符(换行符等),否则应使用单引号 (')。 PHP 解析双 (") 引号的速度较慢。您在第一行 &lt;li&gt; 中使用双引号在语法上是错误的。

    您在&lt;?php ... ?&gt; 块之外有大括号。

    整个代码块可以包含在一对&lt;?php .. ?&gt;中。

    <?php
    if($current) 
        {              
            echo '<li id="current">';
            echo $this->Html->link('Home', '/');
            echo '</li>';
        }
    else
        {
            echo '<li>';
            echo $this->Html->link('Home', '/');
            echo '</li>';
        }
    ?>
    

    【讨论】:

    • 嗨 Leo,谢谢,但我选择了另一个答案,因为首先;你们和其他建议都是一样的,只是你可能搞砸了我的意图,如果存在变量 $current,我希望家不显示当前样式。无论如何,感谢您的帮助,我投了 1 票,这是您应得的。
    【解决方案3】:

    您是否正在尝试制作一个可以自动知道用户在哪个页面上的导航,并相应地突出显示导航(标签?)?

    如果是这样,那么我有一些想法给你。

    如果你想为所有控制器设置 $current 变量,那么你可能想把它放在 app_controller.您可能没有,默认情况下它不在 cake 部署中。您可以在 CAKE_HOME/app/app_controller.php 中添加它

    它看起来像

    <?php
    class AppController extends Controller {
      function beforeFilter() {
        $this->set('current', $this->name . '.' . $this->action);
      }
    }
    ?>
    

    我在我的应用程序中使用的替代方法是不使用变量 $current,而是使用内置变量 $this->name(控制器名称)和 $this->action(动作名称)

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

    【讨论】:

    • 而不是 if($current == NULL) try if(isset($current) && !empty($current)) { 这只是吹毛求疵。
    【解决方案4】:

    如果其他回复正确,即您正试图在导航中突出显示当前页面,请查看以下帮助程序:http://www.richardathome.com/blog/cakephp-smarter-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>";
    ?>
    

    【讨论】:

    • 嘿,我已经回复了。如果我没有关注,请告诉我。
    • 嗨 Botman,它没有显示“内容”样式,但它现在没有给我任何解析错误。就好像什么都没有改变一样。我猜这是向前迈出的一大步。您认为阻止它显示 id="content" 的原因是什么?谢谢..
    • 嗨,约翰,我怀疑问题在于 $current 永远不会为空,即使您希望它为空,它实际上也是一个空字符串。尝试添加 var_dump($current);在你看来。这将显示 $current 的数据类型和值。我会用解决方案更新我的答案...
    • 嗨 Botman,哇,我成功完成了。并感谢您提供的大量信息。当我用你的测试时,我不记得哪里出了问题。我遗漏了正确的布局。我不确定我是否一直在改变,据我所知你的帖子是正确的,所以我打勾了。此外,来自我的提示;我们可以通过简单地为控制器创建“布局”来使用最简单的方法来突出显示选项卡。只有在包含“成员”区域的情况下,我们才可能希望使用上面显示的条件,因为为每个视图创建新布局是非常疯狂的。
    • 嗨,John,是的,您真的不想为每个视图使用布局!我之前链接的那个助手会为你解决这个问题。 IE。条件逻辑发生在控制器内部,因此您无需编写/担心它。帮助器本身可以确定它是否是活动链接。如果您确实想在视图中编写条件逻辑,有很多 vars 可能会有所帮助,例如 $this->here 或 $this->action。把它放在一个视图中以查看它们:
    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2012-05-04
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多