【问题标题】:CakePHP 2.9.5 $this->assign('title') does not work as described in documentationCakePHP 2.9.5 $this->assign('title') 不像文档中描述的那样工作
【发布时间】:2017-01-30 11:38:48
【问题描述】:

在 CakePHP 2.9.5 https://book.cakephp.org/2.0/en/views.html 的文档中说:

$title_for_layout 自 2.5 起已弃用,请在布局中使用 $this->fetch('title') 并改用 $this->assign('title', 'page title')

在 app/View/Layouts/default.ctp 我有这个,顺便是 CakePHP 自带的,没有修改过:

<title>
    <?php echo $cakeDescription ?>:
    <?php echo $this->fetch('title'); ?>
</title>

在我的视图文件中:

<?php $this->assign('title', 'My page title'); ?>

所以这应该在&lt;title&gt;标签中输出“我的页面标题”,但只是拿出了默认的CakePHP标题“CakePHP:快速开发php框架”

我哪里错了?

【问题讨论】:

  • 这不是默认布局标题标签的样子,它看起来像这样:github.com/cakephp/cakephp/blob/2.9.5/app/View/Layouts/…
  • 无论如何都不能解决问题
  • 我并不是说这会解决问题,只是您关于文件未被修改的说法似乎不正确。引用的短语在默认布局和错误模板的$cakeDescription 变量中定义,其他任何地方都没有。因此,默认模板看起来不像您所显示的那样,这一事实使您的问题更加不清楚,并且您的问题难以重现。
  • 好的,抱歉,我已经对其进行了编辑以准确显示文件中的内容。我总结它的原因是因为我知道$cakeDescription 没有引起问题,所以试图让它更具可读性。然而,那条线是否存在并没有什么区别。
  • 还是不行吗?如果您发布 default.ctp 的整个代码,它会更清楚。

标签: php cakephp


【解决方案1】:

这个问题的答案是我的原始代码有效。但是需要对默认布局文件进行更改...

Layouts/default.ctp 中,您有一个全新安装:

<title>
    <?php echo $cakeDescription ?>:
    <?php echo $this->fetch('title'); ?>
</title>

$cakeDescription 的字符串在视图中设置的标题之前回显。默认字符串很长,因此如果您在浏览器选项卡中查看它(就像我一样),标题似乎永远不会改变!除非你查看源代码。

在任何情况下,您都需要删除此变量,否则您的所有标题都会在前面加上 Cake 的默认文本。所以解决办法就是把上面的改成:

<title>
    <?php echo $this->fetch('title'); ?>
</title>

在您的视图中,代码按文档说明工作:

$this->assign('title', 'Page title here'); 

这对于 Cake 开发人员来说是一个糟糕的默认设置,因为您没有理由希望在实际应用程序的标题标签中使用他们的默认文本。

【讨论】:

    【解决方案2】:

    如果这对你不起作用 - 并且 2.9.5 是一个有趣的版本,试试这个:

    在您的视图/布局/default.ctp 中

    解析 url 并拉取路径,将其设置在您的标题之后或根据您的喜好设置为您的标题

    sn-p 下面:

    <?php
    
    $url = $_SERVER['REQUEST_URI'];
    $url_array = parse_url($url);
    preg_match('@/(?<path>[^/]+)@', $url_array['path'], $m);
    $url_folder = $m['path'];
    
    $cakeDescription = 'Prospector : '.$url_folder;
    ?>
    <!DOCTYPE html>
    
    <html>
    <head>
        <?php echo $this->Html->charset(); ?>
        <title>
            <?php echo $cakeDescription ?>:
        </title>
    

    $url_folder 包含我假设您要查找的路径,因此如果您查看的是 example.com/companies/index,例如 $url_folder 包含“companies”

    所以使用上面的代码,标题将设置在 Prospector : Companies in this instance.

    您当然可以根据需要等使用大写,根据您的偏好放弃 Prospector。

    下面的完整页面 - 请注意这是来自干净的 2.9.5 安装:

    <?php
    
    $url = $_SERVER['REQUEST_URI'];
    $url_array = parse_url($url);
    preg_match('@/(?<path>[^/]+)@', $url_array['path'], $m);
    $url_folder = $m['path'];
    
    $cakeDescription = 'Prospector : '.$url_folder;
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <?php echo $this->Html->charset(); ?>
        <title>
            <?php echo $cakeDescription ?>:
        </title>
        <?php
            echo $this->Html->meta('icon');
    
            echo $this->Html->css('cake.generic');
    
            echo $this->fetch('meta');
            echo $this->fetch('css');
            echo $this->fetch('script');
        ?>
    </head>
    <body>
        <div id="container">
            <div id="header">
                <h1><?php echo $this->Html->link($cakeDescription, 'http://cakephp.org'); ?></h1>
            </div>
            <div id="content">
    
                <?php echo $this->Flash->render(); ?>
    
                <?php echo $this->fetch('content'); ?>
            </div>
            <div id="footer">
                <?php echo $this->Html->link(
                        $this->Html->image('cake.power.gif', array('alt' => $cakeDescription, 'border' => '0')),
                        'http://www.cakephp.org/',
                        array('target' => '_blank', 'escape' => false, 'id' => 'cake-powered')
                    );
                ?>
                <p>
    
                </p>
            </div>
        </div>
        <?php echo $this->element('sql_dump'); ?>
    </body>
    </html>
    

    当然,这仅适用于您希望标题与模型相同的情况。

    如果您不想要模型名称,但可以使用模型名称进行测试,那么您可以使用 $url_folder 在 switch 中进行测试。

    【讨论】:

      【解决方案3】:

      在你的控制器中

      $title = 'Title for your page';
      $this->set(compact('title'));
      

      那么在你看来只是

      $this->assign('title',$title); 
      

      【讨论】:

      • 没有。你试过吗?问题不在于将标题从控制器传递到视图。这与$this-&gt;assign() 在视图中不起作用的事实有关。标题是使用变量设置,还是按照我的原始帖子硬编码为字符串,都没有区别。请在发布之前实际运行您的代码并确认它可以正常工作。
      • 在当前使用的 2.x 蛋糕 crm 系统中运行良好。
      • 我已经发布了正确答案。我很想知道您的 CRM 上的 default.ctp 中有什么,但我猜它已被修改,以至于 $cakeDescription 不会在 &lt;title&gt; 标记内呈现?
      猜你喜欢
      • 2011-01-11
      • 2018-05-31
      • 2020-04-04
      • 2017-10-31
      • 2018-04-14
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多