Php 在视图的codeigniter中加载代码片段

Php 在视图的codeigniter中加载代码片段,php,codeigniter,module,Php,Codeigniter,Module,所以我决定给codeigniter一个机会,并将我现有的全部定制php站点转换为codeigniter框架。但我试图找出如何在codeigniter中做到最好,这是我在最初的网站上做的。在原始站点中,用户将访问index.php等页面。在index.php代码中,它被分成如下几个部分(这只是一个非常简单的示例): index.php: <html> <head></head> <body> <div id="top">{$SECTIO

所以我决定给codeigniter一个机会,并将我现有的全部定制php站点转换为codeigniter框架。但我试图找出如何在codeigniter中做到最好,这是我在最初的网站上做的。在原始站点中,用户将访问index.php等页面。在index.php代码中,它被分成如下几个部分(这只是一个非常简单的示例):

index.php:

<html>
<head></head>
<body>

<div id="top">{$SECTION1}</div>
<div id="main">{$SECTION2}</div>
<div id="bottom">{$SECTION3}</div>

</body>
</html>
然后使用输出缓冲执行每个模块,然后从分配给每个部分的每个模块中获取输出信息,并用输出数据替换该部分

这可以在codeigniter中完成吗?如果是这样的话,有人能告诉我在codeigniter中这样做的正确方向吗

编辑

为了更清楚地了解我在原始系统中所做的事情,我在每个页面上运行一个查询,以确定该用户正在查看的当前页面要获取哪些“模块”,然后运行此代码

    foreach($page_modules AS $curr_module)
    {

        $module_section = intval($curr_module->section);
        $module_file = $global_function->cleanData($curr_module->modfile);
        $module_path = MODS .$module_file;

        if(is_file($module_path))
        {

            ob_start();
            include($module_path);
            ${'global_pagemod' .$module_section} .= ob_get_contents();
            ob_end_clean();

        }

    }
然后,我只需获取为每个节创建的每个变量,并在模板中用该变量替换{$section[n]}

附加编辑


我想做的是能够创建执行特定任务的“模块”,然后在后端能够在整个站点的不同部分动态放置这些模块。我想你可以说它像wordpress,但更简单一些。Wordpress您可以添加一个模块,然后在左栏、中栏或右栏将其分配给页面。我正在尝试做几乎相同的事情。

您可以将检索到的数据作为数组传递给主视图,然后在子视图上访问该数据。 例如: 主视图

然后在主视图上加载子视图:

$data = array('data_name'=>$top_data);
$this->load->view('top_view',$data);
然后在子视图上,您只需使用您想要的数据。也许有一种更有效的方法可以做到这一点,但我相信这会奏效

我是这样做的:

控制器

function about()
{

    $user_session = $this->model_user_lite->Session_Check();
    $data['auth'] = $user_session;
    $user_id = $this->model_user_lite->Session_UserID();
    $data['user_id'] = $user_id;


    $this->load->view( 'main_about.php', $data );

}
<? $this->load->view('header_base.php'); ?>

    <? $this->load->view('include_standart.php'); ?>

    <? $this->load->view('header_standart.php'); ?>




    <div class="box">
        <div class="box-top"></div>
        <div class="box-center">
            <div class="content">



                    <center>
                        <h2><?= lang('MAIN_ABOUT_CAPTION_TEAM'); ?></h2>
                        <div class="hr"></div>
...
查看

function about()
{

    $user_session = $this->model_user_lite->Session_Check();
    $data['auth'] = $user_session;
    $user_id = $this->model_user_lite->Session_UserID();
    $data['user_id'] = $user_id;


    $this->load->view( 'main_about.php', $data );

}
<? $this->load->view('header_base.php'); ?>

    <? $this->load->view('include_standart.php'); ?>

    <? $this->load->view('header_standart.php'); ?>




    <div class="box">
        <div class="box-top"></div>
        <div class="box-center">
            <div class="content">



                    <center>
                        <h2><?= lang('MAIN_ABOUT_CAPTION_TEAM'); ?></h2>
                        <div class="hr"></div>
...

...
标题底部

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="shortcut icon" href="<?= base_url(); ?>/favicon.ico" type="image/x-icon">
<link rel="icon" href="<?= base_url(); ?>/favicon_animated.ico" type="image/x-icon">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />



    <meta property="fb:admin_id" content="677920913" />
    <meta property="fb:app_id" content="<?= FACEBOOK_APPID; ?>" />
    <meta property="og:site_name" content="<?= SITE_NAME; ?>" />
<?php if ( empty( $og_title ) === FALSE ): ?>
    <meta property="og:title" content="<?= $og_title; ?>" />
<?php endif ?>
...


基本上,Codeigniter是一个MVC框架。要使用它,您确实希望接受它,而不是包含文件。您可以将代码重新调整为:

在控制器中:

function example()
{

  $this->load->model('story_model','story');
  $data['section1'] = $this->story->latest();
  $data['section2'] = $this->story->top_stories(5);
  $data['section3'] = $this->story->most_popular();
  $this->load->view('example', $data );
}
function second_page()
{

  $this->load->model('tags_model','tag');
  $this->load->model('authors_model','author');
  $data['section1'] = $this->tag->latest();
  $data['section2'] = $this->tag->top_tags(5);
  $data['section3'] = $this->author->most_popular();
  $this->load->view('example', $data );
}
在您的模型中:

function latest()
{
  return $this->db->limit(1)->get('stories');
}
etc.
在你看来:

<html>
....
<div id="latest">
<h2><?php echo $section1->title; ?></h2>
<?php echo $section1->body; ?>
</div>
<div id="top">
<?php foreach $section2 as $popular { ?>
<h2><?php echo $popular->title; ?></h2>
<?php echo $popular->body; ?>
<?php foreach} ?>
</div>
</html>

并添加新型号等。

我不知道这是否可行。基本上,我所要做的就是在每个部分的视图中动态地包含php文件。每个页面可能包含不同的php文件,例如index.php可能包含{$SECTION1}的最新的_story.php文件,但在main_page.php上,我想加载{$SECTION1}中的所有_stories.php以及{$SECTION1}中的所有_stories.php下的sub_stories.php。我更新了我的原始帖子。请阅读并让我知道这是否有助于更好地解释我试图做的事情。@John您始终可以使用带有赋值的bigass数组,以及在数组上赋值的just call,例如
。这是我读了编辑后唯一想到的事情。@Apemantus如果我将多个模块分配到一个部分,这个功能会起作用吗?这就是按节然后按视图顺序加载它们的方式。因此,对于第2节中的index.php,我希望首先显示最新的10个故事模块,然后在该模块下加载另一个模块。所有数据都是通过数据库动态分配的。因此,一个节可以在一个页面上容纳10-20个不同的模块。@在上面的示例中,Apemantus手动告诉控制器要传递给视图的信息,但我不知道每个控制器/页面要加载哪些模块,直到我查询数据库,找出为每个节分配给该页面的模块。确定。我不是百分之百的了解你网站的结构,但是你可能想看看模板库和部分等等。基本上,在控制器中,您可能希望从模型中获取每个“模块”的数据,并将其传递到将数据返回控制器的视图,然后将所有这些渲染视图传递到布局。可以说,使用HMVC/MVC三元组更为精确:但如果您刚刚开始使用Codeigniter,那么现在可能是OTT。大概听起来有点像杰克建的房子。。。首先:控制器不是自动加载的:它们(有效地)由用户的请求加载。默认/自动加载时,控制器可以访问模型(以及帮助程序和库)。听起来好像你在试图用一种方法/动作来创建一个单片控制器,这种方法/动作可以动态地接收所有内容。这听起来像是一种非常不灵活、不可伸缩的方式,需要大量的黑客攻击。我想说,退一步,看看数据库/模型中的数据、视图中的html、控制器中的访问等(与SO的评论限制相悖,但特别是“自动加载的控制器”,假设您的意思是:控制器或不同控制器本身的许多方法都可以使用操作/信息,选项是:扩展基本控制器(即MY_控制器);将代码添加到u构造中(对于MY_控制器或普通控制器);将其放入(自动加载)库中并从那里调用。)