在CodeIgniter(MVC)中从内容文件设置页面标题

时间:2012-07-07 16:28:26

标签: php codeigniter templates

我的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

我的问题是关于存储<title>标记内容的位置。理想情况下,它将与页面内容(第3个加载的视图)相关,但是如何将其添加到第一个视图中加载的<title>标记中?

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

我还读过一条建议,据说有一个包含所有pag的大型视图文件

8 个答案:

答案 0 :(得分:1)

我并不完全理解为什么你想要加载第三个视图中的标记而不是你编译的HTML文档的头部(你加载的第一个视图)。为什么不能这样:

$data['title'] = 'my page title';

$this->load->view('head', $data);

答案 1 :(得分:1)

我想到了解决问题的方法,我从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']。然后,通过遵循链接上的其余布局方法,我将能够解决我的问题。

答案 2 :(得分:1)

更改页面标题这是更好的方法。 在配置文件中添加以下参数:

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

在模板页面中:

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

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

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

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

答案 3 :(得分:0)

您的<title>标记应该在<head>标记内,并且将它放在“头部”视图中是有意义的。因此,您传递到头视图的$ data数组应包含标记元素。从你的脚本我知道你为所有4个视图传递相同的$ data数组?不太好的做法,因为你最终可能会传递一个视图中使用的元素,但不会传递其他四个元素。我建议为每个视图形成一个不同的数组。

答案 4 :(得分:0)

编写辅助函数怎么样?

帮助 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()

答案 5 :(得分:0)

我已经用我的风格解决了这个问题。可能它并不完美,但它解决了我的最大限度。

我创建了一个名为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>

我认为这解决了目的。

答案 6 :(得分:0)

尝试

->在模板中设置TITLE标记

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

->设置$ data ['page_title'] ='标题名称'

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
    }

答案 7 :(得分:0)

在 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>