【问题标题】:Best way to implement dynamic menus/headers/footer using codeigniter使用 codeigniter 实现动态菜单/页眉/页脚的最佳方法
【发布时间】:2024-04-25 17:25:02
【问题描述】:

我只是想知道使用 codeigniter 实现具有更改内容(例如通知)的菜单、页眉和页脚的最佳方法/实践。

例如,假设我在标题菜单中有一个链接回数据库中的数据的警报,我需要在每次加载页面时检查更改。最初我以为我可以每次都使用 $this->load->view('header') 调用标题,但这意味着我需要一个全局函数来计算警报的任何更改,然后将其传递给标题视图,每次都不好!

我想我需要一种全局方式来调用从任何控制器加载网站标题(菜单)的函数,该控制器计算内容并相应地显示视图。

【问题讨论】:

    标签: php codeigniter model-view-controller


    【解决方案1】:

    例如一个显示博客页面的控制器。
    在您的控制器构造函数中 - 定义您的博客视图文件所在的文件夹和模板名称

    // the folder your content files are in 
    $this->templatefolder = 'blog' ;
    // the template name
    $this->view_template = 'blog_template' ; 
    

    在你准备好调用某些视图的方法中

    $data['content01'] = 'search_articles';
    $data['content02'] = 'main_article';
    $data['content03'] = 'suggested_articles';
    $this->load->view( $this->view_template, $data ); 
    

    模板本身 意见/blog_template.php

    // opening html etc that is generic to website
    $this->load->view('tmpl_open');
    
    // so if the header has to be dynamic
    // get the header from a model (or library etc) 
    // and either pass the header content or just echo it out directly 
    $this->load->model('header');
    
    if( ! $newHeader = $this->header->returnNewHeader() )
    {
    
      // fallback if the header doesn't come back from the model 
      $this->load->view('default_header');
    
    } 
    else
    {   echo $newHeader ;     } 
    
    // this is optional but IF the template folder is not set 
    // we have a default folder called 'pages' to look in for the content views 
    
    // but in this example the folder is set to be 'blog' 
    // so the blog view files will be in application/views/blog/search_articles.php etc etc
    if( isset($this->templatefolder)){
    
    $templatefolder = $this->templatefolder . '/' ;  }
    
    else { $templatefolder = 'pages/'; }
    
    // header that is specific for the content 
    $this->load->view($templatefolder . 'header');
    
    // so in this specific example its going to load 3 view files, but this part is completely flexible 
    if(isset($content01))
    $this->load->view($templatefolder.$content01);
    
    if(isset($content02))
    $this->load->view($templatefolder.$content02);
    
    if(isset($content03))
    $this->load->view($templatefolder.$content03);
    
    if(isset($content04))
    $this->load->view($templatefolder.$content04);
    
    if(isset($content05))
    $this->load->view($templatefolder.$content05);
    
    if(isset($content06))
    $this->load->view($templatefolder.$content06);
    
    if(isset($content07))
    $this->load->view($templatefolder.$content07);
    
    if(isset($content08))
    $this->load->view($templatefolder.$content08);
    
    // example of an optional file that you can uncomment for testing 
    // $this->load->view('objecttesting');
    
    // bottom nav bar generic to website
    $this->load->view('tmpl_footer');
    
    // closing html etc generic to website
    $this->load->view('tmpl_close'); 
    

    【讨论】:

    • 很好,我喜欢有一个可以处理所有事情的通知模型的想法:)
    • 谢谢 - 是的,我认为永远不要直接从视图文件调用模型很重要,所以这是一个不错的折衷方案。当然你也不必使用 $this->view_template -- 你可以直接通过它的名字来调用模板: $this->load->view( 'blog_template', $data );我只是喜欢在控制器顶部定义模板。
    • AFAIK $this->load->model('header'); 不能在 view 中调用,您需要在 controller 中调用它,然后在 view 将能够使用$this->header。无论如何,你的一个是一个很好的例子/答案。