2012-07-07 86 views
2

我笨网站的控制器设置是这样的:设置页面标题

$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>标签的内容。理想情况下,它将与页面内容(第三个加载的视图)相关,但是如何将这些内容加载到已在第一个视图中加载的<title>标记中?

我读过,JavaScript设置标题不好,因为它不会与搜索引擎漫游器兼容。

我也看到了一个建议该说有一个大的视图文件的所有PAG

+0

我真的不明白你想要做什么,但是你不能只将'data ['title']'发送到你的头部视图吗? – Abdulaziz 2012-07-07 19:18:51

+0

是的,我可以。但是控制器从哪里获得价值呢? – Chro 2012-07-07 20:30:22

回答

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

0

Logicaly您<title>标签应在<head>标签,它将使意义有它在你的“头”视图。所以你传递给头部视图的$ data数组应该包含一个标签元素。从你的脚本,我明白你所有4个视图传递相同的$ data数组?不是很好的做法,因为你可能最终会在一个视图中使用元素,但不会在其他四个视图中使用。我会建议为每个视图形成不同的阵列。

+0

感谢您的提示,但是这并不能解决我的问题。请参阅我对Greg的回复以了解更多详情。谢谢! – Chro 2012-07-07 18:31:56

1

我不是很追随你为什么要在第三个视图中加载标记,而不是在编译的HTML文档的头部(第一个视图)。为什么不能有这样的东西:

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

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

但是,$ data ['title']的值会来自或存储在哪里?如果我通过控制器的索引功能加载了大部分页面,请转至www.mysite.com/somepage控制器如何知道某个页面的标题?这是问题,我不知道在哪里存储数据。 – Chro 2012-07-07 18:29:30

+3

我想我不是真正的问题,你有什么样的动态设置,你的控制器不知道它正在加载什么内容?在你的例子中,你使用“$ this-> uri-> segment(1)”这是主要的“视图”和标题应该链接的。为什么不存储一个关联配置数组,如: $ config ['titles'] = array('customer'=>'customer page');然后在你的控制器中做$ data ['title'] = $ this-> config-> item($ this-> uri-> segment(1)); 把它传递给你的第一个视图(“head”部分),让codeigniter视图加载器完成剩下的工作。 – Greg 2012-07-08 08:52:43

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

+0

对不起,我对PHP的理解依然太新。那么我会在哪里存储标题? – Chro 2012-07-08 00:17:26

+0

它们将被存储在CodeIgniter的对象中。 – 2012-07-08 00:21:11

+0

对不起@StevenLu你定义的函数有小错误我会编辑这个。 – ImBS 2017-01-12 05:20:27

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> 

我认为这解决了目的。

0

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

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

在模板页面:

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

在任何页面,你喜欢在行动改变这种配置:

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

你每次改变标题容易。