4

我需要返回 json 对象,该对象具有带有渲染动作的属性“html”。是否可以在本地使用 Phalcon vew?

例子:

$posts = NewsPost::find(['limit' => 10]);
$view = new Phalcon\Mvc\View();
$view->setVar('posts', $posts);
$view->setMainView('news/posts'); // not sure if this is correct

// retrieve some data ...
$response = [
    'html' => $view->render(),
    'somedata' => 'somevalues',
    ....
];

PS关于phalcon php框架的问题:http: //docs.phalconphp.com/en/latest/api/Phalcon_Mvc_View.html

4

5 回答 5

7

需要先启动输出缓冲:

$view = new Phalcon\Mvc\View();

$view->setVar('posts', $posts);

$view->start();
$view->render(); //Pass a controller/action as parameters if required
$view->finish();

// retrieve some data ...
$response = [
    'html' => $view->getContent(),
    'somedata' => 'somevalues',
    ....
];
于 2012-12-16T19:51:31.527 回答
1

试试这个

$posts = NewsPost::find(['limit' => 10]);
$view = new \Phalcon\Mvc\View();
$view->setRenderLevel(\Phalcon\Mvc\View::LEVEL_LAYOUT);
$view->setVar('posts', $posts);
$viewData = $view->render('news', 'posts');

// retrieve some data ...
$response = [
    'html' => $viewData,
    'somedata' => 'somevalues',
    ....
];
于 2012-12-16T16:29:03.800 回答
0
$view = new Phalcon\Mvc\View();

$view->setVar('posts', $posts);

$view->start();
$view->render(); //Pass a controller/action as parameters if required
$view->finish();

// retrieve some data ...
$response = [
    'html' => $view->getContent(),
    'somedata' => 'somevalues',
    ....
];

不要忘记使用

$view->setViewsDir(APP_PATH . '/app/views/');

否则,您可能会返回一个空字符串。

于 2016-05-18T14:16:47.517 回答
0

我正在使用一个简单的解决方案(在我在模型中使用的应用程序的任何部分): 1. 从 DI 加载视图对象 2. 使用带参数的 getRender

        // Get the view from DI
        $theView = $this->getDi()->getShared('view');
        // Load the text into variable
        $emailText = $theView->getRender('emails', $emailTemplate, $emailData, function($theView) {
            $theView->setRenderLevel(\Phalcon\Mvc\View::LEVEL_ACTION_VIEW);
        });
于 2018-02-14T20:41:49.497 回答
0

这是一个基于 View 的类,呈现为 HTML 或 JSON(Api 调用)。

use \Phalcon\Mvc\View;

class ApiView extends View
{
    const OUTPUT_DEFAULT = 0;
    const OUTPUT_JSON = 1;
    public $output_type = self::OUTPUT_DEFAULT;

    public function setOutputJson()
    {
        $this->output_type = ApiView::OUTPUT_JSON;
    }

    public function setOutputDefault() {
        $this->output_type = ApiView::OUTPUT_DEFAULT;
    }

    public function render($controllerName, $actionName, $params = null)
    {
        if ($this->output_type === ApiView::OUTPUT_JSON)
        {
            echo json_encode($this->getParamsToView());
            $this->disable();
        }
        parent::render($controllerName, $actionName, $params);
        if ($this->output_type === GollgiView::OUTPUT_JSON) {
            header("Content-type: application/json, 'UTF-8')");
        }
    }

    public function getOutputType() {
        return $this->output_type;
    }
}

更改 config/service.php 以默认创建 ApiView

/**
 * Setting up the view component
 */
$di->setShared('view', function () use ($config) {
     $view = new ApiView();
     $view->setViewsDir($config->application->viewsDir);
     $view->registerEngines(['.phtml' => 'Phalcon\Mvc\View\Engine\Php']);
     return $view;
});

在控制器中,您可以决定您想要什么类型的输出

if ($this->request->has('api')) {
    $this->view->setOutputJson();
}
于 2019-02-27T09:15:02.600 回答