CodeIgniter或相当于PHP的Rails片段和模板

CodeIgniter或相当于PHP的Rails片段和模板,php,codeigniter,partials,Php,Codeigniter,Partials,在CodeIgniter或核心PHP中;是否有Rails的视图片段和模板的等价物 局部渲染可以让我在视图中渲染另一个视图片段。我可以有一个普通的navbar.php视图,可以指向homepage.php视图的内部。模板将在一个位置定义HTML页面的整体外壳,并让每个视图只填充主体 在CodeIgniter文档中,我能找到的最接近的东西是,在控制器中按顺序呈现多个视图。在控制器中口述我的页面的视觉外观似乎很奇怪。(即,要移动导航栏,设计师必须编辑控制器) 我一直在stackoverflow上搜索一

在CodeIgniter或核心PHP中;是否有Rails的视图片段和模板的等价物

局部渲染可以让我在视图中渲染另一个视图片段。我可以有一个普通的
navbar.php
视图,可以指向
homepage.php
视图的内部。模板将在一个位置定义HTML页面的整体外壳,并让每个视图只填充主体

在CodeIgniter文档中,我能找到的最接近的东西是,在控制器中按顺序呈现多个视图。在控制器中口述我的页面的视觉外观似乎很奇怪。(即,要移动导航栏,设计师必须编辑控制器)


我一直在stackoverflow上搜索一种PHP方法来实现这一点。我已经找到了,它讨论了如何使用模拟partials。这是CodeIgniter内部的推荐方法吗?

Symfony通过他们的设置做到这一点。

不幸的是,这根本不是CodeIgniter特有的,但是我建议您查看一下模板系统。它允许您将模板呈现为字符串。然后你可以把它贴在任何你想要的地方

也许CodeIgniter中有类似的东西


我可以想出一种方法,在渲染视图时添加一个工具,渲染模板,然后是它包含的所有子模板。

在PHP中,您可以使用CodeIgniter和Smarty一起玩。

这基本上就是我使用的:

function render_partial($file, $data = false, $locals = array()) {
    $contents = '';

    foreach($locals AS $key => $value) {
        ${$key} = $value;
    }

    ${$name . '_counter'} = 0;
    foreach($data AS $object) {
        ${$name} = $object;

        ob_start();
        include $file;
        $contents .= ob_get_contents();
        ob_end_clean();

        ${$name . '_counter'}++;
    }

    return $contents;
}
这允许您调用以下内容:

render_partial('/path/to/person.phtml', array('dennis', 'dee', 'mac', 'charlie'), array('say_hello' => true));
并且在/path/to/person.phtml中有:

<?= if($say_hello) { "Hello, " } ?><?= $person ?> (<?= $person_counter ?>)
()

这是一个神奇的过程,虽然它可以帮助你更好地了解正在发生的事情。完整文件:

我可能违反了一些MVC规则,但我总是将我的“片段”放在单独的视图中,并从需要它们的其他视图中加载它们(CodeIgniter样式)。几乎所有视图都在顶部和底部分别加载页眉和页脚视图:

<? $this->load->view( "header" ); ?>
//Page content...
<? $this->load->view( "footer" ); ?>

//页面内容。。。

标题可以以同样的方式包含导航栏,等等。

我发现自己也在从Rails移动到CI,我对partials所做的基本上是将视图中的partials呈现为变量,并从控制器进行设置

因此,在视图中,您将看到类似(_partial.php)的内容:

就个人而言,我更喜欢使用CI的视图而不是ob_start,但这就是我=) PS:加载视图时,第一个参数是视图名称,第二个参数是要传递给视图的参数,第三个参数是“ECHO”标志,它基本上告诉CI是直接渲染还是返回视图的值,这基本上就是我在示例中所做的


虽然我不认为这是一个好的解决方案,但它对我很有效。有谁有更好的解决方案吗?

这里有一篇博客文章介绍了如何解决这个问题。还实现了类似asp.net的母版页。

我最近发布的母版页就是这样工作的


该模板库还可以很好地与my配合使用,这将为您的视图提供更强大的功能。

试试看——这是一个受rails启发的模板库。

您可以查看它,查看部分和模板

    http://code.google.com/p/ocular/wiki/Introduction

这是不需要自己的数据的分部的方法。但是对于需要数据的部分视图(“小部件”),类似于第三方的“模块化扩展HMVC”是一个不错的选择。我认为这是呈现部分的最简单方法。请确保将
$this->load->view()
函数放在视图文件中,而不是控制器中(通过
$data
数组键),因为它只会将其回显出来+1我不相信您能够在控制器中使用
ob\u start()
,因为
CI\u Loader
在加载视图时使用它。所以你会得到一个错误。最好使用
$this->load->view('view\u name',$data,true)$this->load->view('the_view', 
   array('some_partials', 
         $this->load->view('_partial', array(), TRUE)
   )
);
    http://code.google.com/p/ocular/wiki/Introduction