【问题标题】:Setting page title from content file in CodeIgniter (MVC)在 CodeIgniter (MVC) 中从内容文件设置页面标题
【发布时间】:2012-07-07 16:28:25
【问题描述】:

我的 CodeIgniter 网站的控制器是这样设置的:

$this->load->view('head', $data); // Contains <head> stuff
$this->load->view('header', $data); // Nav and sidebars
$this->load->view($this->uri->segment(1), $data); // Main page content
$this->load->view('footer', $data); // Footer

我的问题是关于在哪里存储&lt;title&gt; 标签的内容。理想情况下,它将与页面内容(第三个加载的视图)一起使用,但是如何将其放入已在第一个视图中加载的 &lt;title&gt; 标记中?

我听说让 JavaScript 设置标题很糟糕,因为它与搜索引擎机器人不兼容。

我还阅读了一个建议,说有一个包含所有页面的大视图文件

【问题讨论】:

  • 我不太明白您要做什么,但您不能将data['title'] 发送到您的头部视图吗?
  • 是的,我可以。但是控制器从哪里获得价值呢?

标签: php codeigniter templates


【解决方案1】:

对于更改页面标题,这是更好的方法。 在你的配置文件中添加这个参数:

$config['pageTitle'] = 'Book Store';

在模板页面中:

<title><?=$this->config->config["pageTitle"]?></title>

在您喜欢的任何页面中更改此配置:

$this->config->config["pageTitle"] = $detail[0]['Title'];

每次您都可以轻松更改标题。

【讨论】:

    【解决方案2】:

    我不太明白为什么要将标签放在加载的第三个视图中,而不是在编译的 HTML 文档的头部(加载的第一个视图)中。为什么没有类似的东西:

    $data['title'] = 'my page title';
    
    $this->load->view('head', $data);
    

    【讨论】:

    • 但是 $data['title'] 的值来自哪里或存储在哪里?如果我的大部分页面都通过控制器的索引功能加载并转到 www.mysite.com/somepage 控制器如何知道某个页面的标题?这就是问题所在,我不知道在哪里存储数据。
    • 我想我没有关注真正的问题,您是否有某种动态设置,您的控制器不知道它正在加载什么内容?在您的示例中,您使用的是“$this->uri->segment(1)”,它是主要的“视图”,标题应该与之链接。为什么不存储一个关联配置数组,例如: $config['titles'] = array('customer' => 'customer page');然后在你的控制器中做 $data['title'] = $this->config->item($this->uri->segment(1));将其传递给您的第一个视图(“head”部分),然后让 codeigniter 视图加载器完成剩下的工作。
    【解决方案3】:

    我想了一个办法来解决我的问题,我从http://joshhighland.com/blog/2008/11/09/how-i-do-layouts-and-views-in-codeigniter/ 那里得到了这个想法。如果您查看该页面,您会在第一个代码摘录的底部附近看到这样的一行:

    $layout_data['content_body'] = $this->load->view('home/homePage', $body_data, true);
    

    这会将视图作为字符串加载到该变量中。然后我将在该字符串上运行一个函数来提取我想要的标题(我会将其存储在 HTML 注释中)并将其放入 $layout_data['pageTitle']。然后,按照链接上的其余布局方法,我将能够解决我的问题。

    【讨论】:

      【解决方案4】:

      从逻辑上讲,您的&lt;title&gt; 标签应该在&lt;head&gt; 标签内,将它放在您的“头部”视图中会很有意义。因此,您传递给 head 视图的 $data 数组应该包含一个标签元素。从您的脚本中,我了解到您正在为所有 4 个视图传递相同的 $data 数组?不是很好的做法,因为您最终可能会传递在一个视图中使用的元素,但不会在其他四个视图中传递。我建议为每个视图形成一个不同的数组。

      【讨论】:

      • 感谢您的提示,但这并不能解决我的问题。有关详细信息,请参阅我对 Greg 的回复。谢谢!
      【解决方案5】:

      写一个辅助函数怎么样?

      帮手 helpers/header_helper.php

      function set_title($title) {
          $ci &= get_instance();
          $ci->header_title = $title;
      }
      
      function get_title() {
          $ci &= get_instance();
          return $ci->header_title;
      }
      

      您可能希望在config/autoload.php中将其设置为自动加载

      然后您可以在您的视图中调用函数get_title(),在您的控制器中您可以调用set_title()。

      【讨论】:

      • 对不起,我对 PHP 还太陌生,无法理解您的回答。那么我实际上将标题存储在哪里?
      • 它们会存储在 CodeIgniter 的对象中。
      • 对不起@StevenLu 你定义的函数有小错误我会编辑这个。
      【解决方案6】:

      我已经以我的方式解决了这个问题。也许它不是完美的,但它解决了我的最大目的。

      我创建了一个名为 getMyPageTitle() 的辅助函数。

      然后我写下了页面标题的逻辑。

      逻辑的基本部分是我在配置文件中假设了一个默认标题。

                  <?php
                  function getMyPageTitle(){
      
                      $title = '';
                      $ci = &get_instance();
      
                      $default_title = 'My Site';// you can load it from a config file,and that is better option
                      // get the view name
                      $view = $this->uri->segment(2);
                      // check if controller set a page tile
                      /* If you want to set a page title for a particular page then always 
                       * named that variable 'pageTitle' as $data['pageTitle'] = 'My page title | For this page'
                       */
      
                      global $pageTitle;
      
                      if($pageTitle){// the controller sets the page title
                          $title = $pageTitle;
                      }elseif($view !== ''){//you can include your view name in the page title,,and the view name is not blanks
                          $title = $default_title.' | '. $view;
                      }/**
                        * You can write several else if , before or after this or
                        * can change the total logic as you want
                        */
                       else{
                          $title = $default_title;
                      }
      
                      return $title;
                  }
                  ?>
      

      在视图中使用这个

      <title><?= getMyPageTitle()?></title>
      

      我认为这解决了目的。

      【讨论】:

        【解决方案7】:

        试试这个

        -> 在模板中设置 TITLE 标签

            <title>
                <?php if (!empty($page_title)) echo $page_title;?>
            </title>
        

        -> 设置 $data['page_title'] = 'title name'

        public function index()
            {
                $data['page_title'] = 'List'; 
                $this->load->view('head', $data); // Contains <head> stuff
                $this->load->view('header', $data); // Nav and sidebars
                $this->load->view($this->uri->segment(1), $data); // Main page content
                $this->load->view('footer', $data); // Footer
            }
        

        【讨论】:

          【解决方案8】:

          在 Codeignitor 控制器中

          public function index()
          {
              $data['title'] = 'Website &mdash; Welcome To Website';
              $this->load->view('header', $data);
              $this->load->view('index');
              $this->load->view('footer');
          }
          
          public function about()
          {
              $data['title'] = 'Coachify &mdash; About Us';
              $this->load->view('header', $data);
              $this->load->view('about');
              $this->load->view('footer');
          }
          

          在view/header.php

          <title><?= $title; ?></title>
          

          【讨论】:

            猜你喜欢
            • 2011-01-18
            • 1970-01-01
            • 1970-01-01
            • 2016-02-04
            • 2014-03-04
            • 1970-01-01
            • 1970-01-01
            • 2010-09-10
            • 2013-05-06
            相关资源
            最近更新 更多