在 CodeIgniter 中处理动态内容(最佳实践)

     2023-05-08     119

关键词:

【中文标题】在 CodeIgniter 中处理动态内容(最佳实践)【英文标题】:Handling Dynamic Content in CodeIgniter (Best Practice) 【发布时间】:2012-09-10 14:39:03 【问题描述】:

我正在使用 CodeIgniter 创建一个网站,并且有一个关于最佳实践的问题。

我通常将我的网页分成模块化的块。页眉、内容、页脚(以及其他一些根据需要散布在中间的东西。

“页眉”和“页脚”块通常是静态的,而中间的内容可能会根据一些变量(例如实际页面 - 主页、关于、联系方式等)而改变

下面是页面的控制器。 header_view、navigation_view 和 footer_view(很可能)永远不会改变。 home_main_view 会。

public function index()

    $this->load->view('header_view');
    $this->load->view('navigation_view');
    $this->load->view('home_main_view');
    $this->load->view('footer_view');


例如,如果用户导航到 about 页面,则视图可能如下所示:

public function index()

    $this->load->view('header_view');
    $this->load->view('navigation_view');
    $this->load->view('about_view');
    $this->load->view('footer_view');


我将如何处理 CI 中的这种变化?最好将 home_main_view 设为变量并将其传递给 index() 函数吗?我以前做过这个(用户单击一个链接,该链接触发控制器中的一个函数,该函数设置 $var 调用 index($var) 调用 view($var)。

【问题讨论】:

【参考方案1】:

我最喜欢的方法是使用我用来加载其他组件的布局(它只是一个视图)。显然,您拥有的每种页面类型都需要一个布局,但使用布局可以让以后的更改变得容易。

我更进一步,在我的自定义控制器MY_Controller 中创建了一个用于加载布局的方法:

<?php
class MY_Controller extends CI_Controller
    /**
     * Global $data variable holder
     * @var stdClass
     */
    protected $data;
    /**
     * The templates path, used by the 'render' method to determine the template to load
     * This is the 'root' of the templates folder for a specific section
     * Must NOT contain a trailing slash!
     * @var string
     */
    protected $templates_path = 'site';
    /**
     * The layout used by the 'render' method to load the specified view
     * @var string
     */
    protected $layout = 'default';
    /**
     * Class initialisation
     */
    function __construct() 
        parent::__construct();
        /*init the $data variable*/
        $this->data = new stdClass();
        /*the base url shortcut - to be used where needed*/
        $this->data->base_url = $this->config->item('base_url');
        /*page encoding header*/
        $this->output->set_header('Content-Type: text/html; charset=utf-8');
    
    /**
     * Helper method that will load a view using the layout configured
     * @param type $view
     */
    protected function render($view = FALSE)
        $this->data->page_template = $this->templates_path.'/'.$view;
        $this->data->templates_path = $this->templates_path;
        $this->load->view($this->templates_path.'/layouts/'.$this->layout, $this->data);
    

然后,在我的布局中,我将$page_template 变量中指示的视图加载到适当的位置

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?>
<!DOCTYPE html>
<html>
    <head>
        <?$this->load->view($templates_path.'/sections/head')?>
    </head>
    <body class="<?=$page_class?>">
        <?$this->load->view($templates_path.'/sections/header')?>
        <?if(isset($hpslider) && $hpslider)
            $this->load->view($templates_path.'/sections/hp_slider')?>
        <div class="pcontent">
            <div class="page">
                <?=$this->load->view($page_template);?>
            </div>
        </div>
        <?$this->load->view($templates_path.'/sections/footer')?>
    </body>
</html>

希望对你有所帮助。

【讨论】:

有趣。我将不得不把它分开一点,但这是有道理的。但是问题 - CI 的目的不是让您的控制器完成“工作”并让您的视图只显示传递给它的内容吗?是否从视图中调用单独的视图会“反对” CI 设计?还是我在那儿跑题了? 就我而言,控制器负责“逻辑”,模型负责“繁重的工作”(不仅限于数据库访问——还包括上传文件、发送电子邮件、复杂的计算等)。该视图用于显示控制器根据用户请求和模型提供的数据确定显示的内容,在我看来,这正是我提供的代码的作用。但欢迎大家提供更好的解决方案:) Silviu - 你所描述的听起来很像 Yii 的视图、控制器、组件关系(组件似乎与你在这里对模型的描述同义。)总的来说,我对框架和 MVC 还是很陌生- 仍在尝试找出最佳实践。我会拿走你提供的东西并运行它。感谢您的信息和详细信息! =) 很高兴能帮上忙。 TBH,'render' 的名字是从 Yii 框架中无耻地提升的 :) 但实际代码不是。早在我在几个项目中使用 Yii 之前,我就一直在 CI 中使用布局,但正是 Yii 决定我编写这个小方法,以便在 CI 中更轻松地使用布局。【参考方案2】:

我不使用 CI,但您可以使用 $_post 、 $_get 或段来让操作知道您要加载哪个页面。

段示例:当你转到 example.com/index.php/controller/index/home 然后它将加载“主页”视图。

public function index()
$page=$this->uri->segment(3);
$this->load->view('header_view');
$this->load->view('navigation_view');
$this->load->view($page);
$this->load->view('footer_view');

http://codeigniter.com/user_guide/libraries/uri.html

【讨论】:

【参考方案3】:

请在标题为Header and footer in CodeIgniter 的 SO 线程中查看我的答案。这就是我处理所有观点的方式。这是一种相当模块化的方法 - 希望对您有所帮助!

cmets 后更新

例如,主页可能会这样加载:

class Home extends CI_Controller
    function index()
        $d['v'] = 'home';

        //do database interaction here and 
        //ultimately assign results to some key in $d too.

        $this->load->view('init', $d);
    

【讨论】:

您将如何处理可变视图?将它们作为变量传递给方法? 正如另一个线程中提到的,我将视图名称分配给$d['v'] = 'the_view';,然后在控制器中调用$this-&gt;load-&gt;view('init', $d);。视图的名称被转换为$v 并最终使用&lt;? $this-&gt;load-&gt;view($v); ?&gt; 加载到body.php那部分我明白了。你将如何填充 $d['v']?将变量传递给同一构造函数中包含 $d['v'] 的方法。新的构造函数?一个构造函数中每组视图的不同方法?还是厨师的选择? ;)。 对不起@DanB。 - 我不确定我是否理解你的问题。在我的方法中,您只需在控制器中为$d['v'] 分配一个字符串。我应该提到$d['v'] 很短,因为我知道我会经常输入它。 CodeIgniter 文档通常填充 $data 数组并将其交给视图。请参阅我更新的答案。 (我也在帖子之间不小心在initinitiator 之间摇摆不定。它们是一样的。)

CodeIgniter 中处理数据库错误的最佳实践

】CodeIgniter中处理数据库错误的最佳实践【英文标题】:BestPracticesforProcessingErrorsfromDatabaseinCodeIgniter【发布时间】:2010-10-1813:28:32【问题描述】:我的Web应用程序数据库中有一个带有唯一键(date+userid)的表。当我尝试使用现有的dat... 查看详情

在 CodeIgniter 中动态调整图像大小而不使用 CI 图像处理函数

】在CodeIgniter中动态调整图像大小而不使用CI图像处理函数【英文标题】:ResizinganimageontheflyinCodeIgniterwithoutusingCIimagemanipulationfunctions【发布时间】:2014-02-1914:51:48【问题描述】:我正在尝试调整从服务器上某个位置获取的图像的... 查看详情

在 CodeIgniter 中处理并发请求

】在CodeIgniter中处理并发请求【英文标题】:DealingwithconcurrentrequestsinCodeIgniter【发布时间】:2015-08-1623:56:30【问题描述】:假设我使用CodeIgniter/PHP和MySQL创建了一个在线银行系统,并且有以下内容可以从我的银行账户中提取资金... 查看详情

CodeIgniter MVC 数据操作最佳方法

】CodeIgniterMVC数据操作最佳方法【英文标题】:CodeIgniterMVCdatamanipulationbestapproach【发布时间】:2012-07-3020:18:59【问题描述】:我正在使用CodeIgniter开发一个网站。这是基本的,除了它有一些巨大的表单(150个字段)一些动态创建/... 查看详情

在 Codeigniter 中捕获 Doctrine 异常的最佳方法

】在Codeigniter中捕获Doctrine异常的最佳方法【英文标题】:BestwaytocatchDoctrineExceptionsinCodeigniter【发布时间】:2011-07-1813:34:42【问题描述】:您认为在codeigniter框架中捕获所有学说1.2ORM异常的最佳方法是什么,我不想用trycatch包装整... 查看详情

在 CodeIgniter 中防止 SQL 注入的最佳方法是啥 [重复]

】在CodeIgniter中防止SQL注入的最佳方法是啥[重复]【英文标题】:WhatarethebestwaystopreventSQLInjectioninCodeIgniter[duplicate]在CodeIgniter中防止SQL注入的最佳方法是什么[重复]【发布时间】:2015-08-0806:58:39【问题描述】:我是codeigniter框架的... 查看详情

在 CodeIgniter 中制作管理页面的最佳方法?

】在CodeIgniter中制作管理页面的最佳方法?【英文标题】:BestwaytomakeAdminpagesinCodeIgniter?【发布时间】:2010-12-1418:45:29【问题描述】:我正在使用CodeIgniter开发一个应用程序,我想为应用程序中的几个对象创建管理页面,我想知道... 查看详情

在 Codeigniter 中使用页眉和页脚的最佳方法

】在Codeigniter中使用页眉和页脚的最佳方法【英文标题】:BestwaytouseHeaderandFooterinCodeigniter【发布时间】:2013-05-1922:32:49【问题描述】:您好,谁能告诉我在codeigniter中使用页眉页脚的最佳方法是什么?下面的方式在每个函数中显... 查看详情

在这个例子中,让 jQuery/Ajax 与 CodeIgniter 一起工作的最佳方法是啥?

】在这个例子中,让jQuery/Ajax与CodeIgniter一起工作的最佳方法是啥?【英文标题】:WhatisthebestwaytogetjQuery/AjaxtoworkwithCodeIgniterinthisexample?在这个例子中,让jQuery/Ajax与CodeIgniter一起工作的最佳方法是什么?【发布时间】:2010-11-0608:16... 查看详情

如何使用动态内容

...00:55:08【问题描述】:我正在使用UITable视图,并试图找出处理动态显示内容的最佳方式。例如,我搜索的某些内容可能有标题和描述,但其他时候只有标题。在这样的例子中,我希望能够控制标签在我的UITableCell中的位置,我已... 查看详情

如何在 Orchard 内容处理程序中动态添加内容部分?

】如何在Orchard内容处理程序中动态添加内容部分?【英文标题】:HowtodynamicallyaddacontentpartinaOrchardcontenthandler?【发布时间】:2015-08-0412:08:33【问题描述】:我有一个调用的Orchard内容处理程序Filters.Add(newOrchard.ContentManagement.Handlers.... 查看详情

Codeigniter - 使用两个不同数据库的最佳方式

】Codeigniter-使用两个不同数据库的最佳方式【英文标题】:Codeigniter-bestwaytousetwodifferentdatabase【发布时间】:2012-09-2720:53:03【问题描述】:有人知道在我的应用程序中使用2个不同数据库的最佳做法吗?我需要将数据存储在两个不... 查看详情

如何在 Codeigniter 中插入动态数据?

】如何在Codeigniter中插入动态数据?【英文标题】:HowtoinsertdynamicdatainCodeigniter?【发布时间】:2018-12-2111:29:52【问题描述】:我只想将动态生成的输入字段数据插入数据库。我的数据库表有三个字段,id(AutoIncrement)、product_name和ra... 查看详情

在 Codeigniter 中填充动态下拉列表

】在Codeigniter中填充动态下拉列表【英文标题】:PopulateDynamicDropdownsListinCodeigniter【发布时间】:2016-10-1721:18:57【问题描述】:数据库包括艺术、科学和IT等组。通过选择一个组第二个动态下拉列表将显示与组相关的主题。这是我... 查看详情

如何在codeigniter中设置持久登录?

】如何在codeigniter中设置持久登录?【英文标题】:Howtosetuppersistentloginsincodeigniter?【发布时间】:2013-09-1614:36:56【问题描述】:我是codeigniter框架的新手,我很好奇如何设置流程来处理持久登录。我正在将现有网站迁移到codeignite... 查看详情

想要在 codeigniter 中创建动态子域?

】想要在codeigniter中创建动态子域?【英文标题】:Wanttocreatedynamicsubdomainincodeigniter?【发布时间】:2012-04-0123:09:27【问题描述】:在我的网站中,我想为用户添加一个功能,以便在域中使用他们的用户名。就像现在在codeigniter中... 查看详情

将动态内容推送到单独的 html 文件中的最佳方法是啥[关闭]

】将动态内容推送到单独的html文件中的最佳方法是啥[关闭]【英文标题】:Whatwouldbethebestwaytopushdynamiccontentintoseparatehtmlfiles[closed]将动态内容推送到单独的html文件中的最佳方法是什么[关闭]【发布时间】:2015-05-1611:43:01【问题描... 查看详情

在 codeigniter 中处理存储过程输出参数

】在codeigniter中处理存储过程输出参数【英文标题】:Handlestoredprocedureoutputparameterincodeigniter【发布时间】:2013-01-1118:47:47【问题描述】:我在mysql中有一个带有输出参数的存储过程,我需要将结果发送到我使用codeigniter的php中注... 查看详情