【问题标题】:CodeIgniter or PHP Equivalent of Rails Partials and TemplatesRails 部分和模板的 CodeIgniter 或 PHP 等效项
【发布时间】:2010-10-20 10:23:37
【问题描述】:

在 CodeIgniter 或核心 PHP 中;是否有相当于 Rails 的视图部分和模板?

partial 可以让我在我的视图中渲染另一个视图片段。我可以有一个共同的navbar.php 视图,我可以指向我的homepage.php 视图内部。模板将在一个地方定义 HTML 页面的整体外壳,并让每个视图只填充正文。

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

我一直在 stackoverflow 上寻找一种 PHP 方法来实现这一点。我找到了this page,它谈到了用ob_start 模拟部分。这是 CodeIgniter 中推荐的方法吗?

【问题讨论】:

标签: php codeigniter partials


【解决方案1】:

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

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

然后标题可以以相同的方式包含 NavBar,等等。

【讨论】:

  • 这是不需要自己数据的部分的方法。但在需要数据的部分视图(“小部件”)的情况下,像第 3 方“Modular Extensions HMVC”这样的东西是一个不错的选择。
  • 我认为这是渲染局部最简单的方法。确保将 $this-&gt;load-&gt;view() 函数放在 视图文件 而不是控制器中(通过 $data 数组键),因为它只会回显它。
【解决方案2】:

这基本上就是我使用的:

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

这是一些神奇的事情,虽然它可以帮助您更好地了解正在发生的事情。完整文件:view.class.php

【讨论】:

  • jeej i tkRenderPartial() 我自己很多;) +1
【解决方案3】:

在 PHP 中你会使用 include

【讨论】:

  • 我不知道这是否正是 OP 所要求的。我相信在评估时会运行包含的文件; OP 要求使用 Rails 样式的包含(首先评估包含的文件,IIRC,然后再合成)。这在根据页面/部分/视图内容中发生的情况决定页面模板 内容等操作时会产生很大的不同。
【解决方案4】:

我发现自己也从 Rails 迁移到 CI,而我对 partials 所做的基本上是将视图中的 partials 渲染为变量并从控制器设置它。

所以在视图中你会有类似 (_partial.php):

<h2>Here Comes The Partials</h2>
<?= $some_partials ?>

你可以像这样从控制器设置它:

$this->load->view('the_view', 
   array('some_partials', 
         $this->load->view('_partial', array(), TRUE)
   )
);

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

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

【讨论】:

  • 我不相信您可以在控制器中使用ob_start(),因为CI_Loader 在加载视图时会使用它。所以你会得到一个错误。最好使用$this-&gt;load-&gt;view('view_name', $data, true); 方法将渲染的视图作为字符串返回。
【解决方案5】:

我最近发布的Template library就是这样工作的。

该模板库还可以很好地与我的Dwoo implementation 配合使用,这将使您的视图更有力量。

【讨论】:

    【解决方案6】:

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

    也许 CodeIgniter 中有类似的东西?

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

    【讨论】:

      【解决方案7】:

      CodeIgniter 和 Smarty 配合得很好。

      【讨论】:

        【解决方案8】:

        这是一篇描述如何use smarty with codeigniter 的博客文章。类似asp.net的masterpage也实现了。

        【讨论】:

          【解决方案9】:

          试用 Ocular - http://codeigniter.com/wiki/Ocular_Layout_Library/ - 它是一个受 Rails 启发的模板库。

          【讨论】:

            【解决方案10】:

            你可以检查它,部分和模板

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

            【讨论】:

              【解决方案11】:

              Symfony 使用他们的 partial/component 设置来做到这一点。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-09-16
                • 2019-08-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多