6

通常我使用 Zend 框架,这是我在 Lithium 中错过的东西。部分。视图中有一个渲染方法,您可以在其中使用我得到的最接近的“元素”。

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

这确实有效,但是它要求 form.html.php 文件位于 /views/elements 文件夹中。是否可以让它在另一条路径中搜索?与 /views/users/ 一样,它获取文件 /views/users/form.html.php。

我尝试了以下方法,因为我发现渲染方法确实接受一个选项参数,您可以在其中指定一个路径。所以我做了一个助手来为我解决这个问题。

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 文件夹中搜索,而不是在我指定的路径中搜索。

有什么我做错了吗?

4

3 回答 3

11

当这些东西有望由 Lithium 完成时,为什么要使用插件 :-)

我不知道 Zend,但这里有一个示例,可以不同地配置元素默认路径,从相关的视图文件夹而不是共享路径加载它们。

让我们再添加一件事:我们想通过在文件名后面附加 un 下划线来区分元素/部分和普通视图(模仿 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锂默认值的东西: https ://gist.github.com/1854561

于 2012-05-15T09:23:05.373 回答
2

解决它。奇迹般有效。Zend like Partials in Lithium。

<?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')); ?>
于 2012-05-14T20:05:03.113 回答
1

有一个局部插件。 https://github.com/dmondark/li3_partials

于 2012-05-15T03:07:53.757 回答