在codeigniter中为视图加载代码片段

时间:2011-06-20 19:09:43

标签: php codeigniter module

所以我决定给codeigniter一个机会并将我现有的站点转换为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>

然后在我的每个页面中包含的主要php文件中,我运行一个查询,该查询抓取分配给index.php页面上面每个部分的所有“模块”。所以给我所有为index.php分配给{$ SECTION1},{$ SECTION2}和{$ SECTION3}的模块。我原始系统中的一个模块只是一个执行特定工作的php文件,所以我可能有一个名为latest_story.php的模块,在脚本中它从数据库中获取最后10个故事并显示结果。

latest_story.php

include('class/story/story_class.php');

$story = new Story($databaseconn);
$latest_story = $story->findLatestStory(10);

//If results back from $latest_story loop through it
//and display it however I want

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

这可以在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中添加模块,然后将其分配到左侧列,中间列或右侧列中的页面。我试图做同样的事情。

3 个答案:

答案 0 :(得分:2)

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

$posts = $this->post_model->fetch_all();
$top_data = $this->more_data_model->fetch_more_data();
$data = array('posts'=>$posts,'top_data'=>$top_data);
$this->load->view('main_view',$data);

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

$data = array('data_name'=>$top_data);
$this->load->view('top_view',$data);

然后在子视图中,您只需使用您想要的数据。可能有一种更有效的方法可以做到这一点,但我相信这会成功。 :)

答案 1 :(得分:2)

我这样做:

<强>控制器

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 ?>
...

通过这种方式,您可以拥有一个干净的文件系统,单独的标题,甚至可以根据需要添加更多标题,并可以将控制器中的所有数据分配给视图。

**从控制器分配的变量,也可以转到“主视图”加载的视图。

我在一个重要的约会网站上使用它,它就像一个魅力。

答案 2 :(得分:2)

基本上,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 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>

如果您想要第二页,但内容不同但布局相同,您可以将其添加到控制器中:

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 );
}

并添加新模型等。