锂中的部分视图

6

通常我使用Zend框架,在Lithium中我想念的是部分视图。在视图中有一个渲染方法,您可以使用“元素”来代替部分视图,这是我找到的最接近的方法。

<?php $this->_render('element', 'form); ?>

这确实可行,但需要将form.html.php文件放在/views/elements文件夹中。是否可以让它搜索另一个路径?比如/views/users/,这样它就可以获取/views/users/form.html.php文件。
我尝试了以下方法,因为我发现render方法接受options参数,您可以在其中指定路径。所以我创建了一个Helper来解决这个问题。
namespace app\extensions\helper;
use lithium\template\TemplateException;

class Partial extends \lithium\template\Helper
{
public function render($name, $folder = 'elements', $data = array())
{
    $path = LITHIUM_APP_PATH . '/views/' . $folder;     
    $options['paths']['element'] = '{:library}/views/' . $folder . '/{:template}.{:type}.php';

    return $this->_context->view()->render(
        array('element' => $name),
        $data,
        $options
    );
}
}

然而,它仍然只在/view/elements文件夹中搜索,而不是我指定的路径。我做错了什么吗?
3个回答

11
为什么使用插件,当Lithium有望完成此任务? :-)
我不了解Zend,但是这里有一个示例,可以配置元素默认路径以不同方式加载它们,而不是从共享路径加载。
还要添加一件事:我们希望通过将文件名附加下划线来区分元素/局部视图和普通视图(模仿Rails局部视图)。
首先,在引导过程中重新配置Media(config/bootstrap/media.php)。
Media::type('default', null, array(
    'view' => 'lithium\template\View',
    'paths' => array(
        'layout' => '{:library}/views/layouts/{:layout}.{:type}.php',
        'template' => '{:library}/views/{:controller}/{:template}.{:type}.php',
        'element'  => array(
            '{:library}/views/{:controller}/_{:template}.{:type}.php',
            '{:library}/views/elements/{:template}.{:type}.php'
        )
    )
));

然后,使用它

假设有一个控制器Documents。调用一个视图:

<?= $this->_render('element', 'foo', $data, array('controller' => 'documents')); ?>

这将查找 views/documents/_foo.html.php 文件,如果不存在,则回退到 /views/elements/foo.html.php

这种对框架默认设置的简单重新配置,可以在Lithium中针对许多内容进行(例如:默认控制器路径以创建命名空间、视图路径、库等)。

另一个示例是重新映射模板路径,这样您就可以拥有像 pages/users_{username}.php 这样的东西,而不是Lithium默认的方式: https://gist.github.com/1854561


通常解决方案比想象中更简单、更容易,而且不会产生太多干扰。 :) - Oerd
锂媒体类是其主要功能之一。它确实非常强大。 - Eric C

2

问题已解决,现在运行良好。Lithium中的部分功能类似于Zend。

<?php

namespace app\extensions\helper;

use lithium\template\View;

class Partial extends \lithium\template\Helper
{

    public function render($name, $folder = 'elements', array $data = array())
    {

        $view = new View(array(
            'paths' => array(
                'template' => '{:library}/views/' . $folder . '/' . $name . '.{:type}.php'
            )
        ));

        return $view->render('all', $data);

    }

}

可以在模板中使用,例如:

<?php echo $this->partial->render('filename', 'foldername', compact('foo', 'bar')); ?>

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接