Вопрос по json, zend-framework2, php, zend-framework-mvc – Как отобразить представление ZF2 в ответе JSON?

20

До сих пор я выяснил, как вернуть типичный ответ JSON в Zend Framework 2. Сначала я добавилViewJsonStrategy кstrategies разделview_manager конфигурации. Затем вместо того, чтобы вернутьViewModel Экземпляр из действия контроллера, я возвращаюJsonModel экземпляр со всеми моими установленными переменными.

Теперь, когда я разобрался с этой частью, мне нужно понять, как визуализировать представление и вернуть его в ответ JSON. В ZF1 я смог использовать$this->view->render($scriptName), который возвратил HTML как строку. В ZF2Zend\View\View::render(...) метод возвращаетvoid.

Итак ... как я могу визуализировать скрипт представления HTML и вернуть его в ответе JSON в одном запросе?

Это то, что я имею сейчас:

    if ($this->getRequest()->isXmlHttpRequest()) {
        $jsonModel = new JsonModel(...);

        /* @todo Render HTML script into `$html` variable, and add to `JsonModel` */
        return $jsonModel;
    } else {
        return new ViewModel(...);
    }
Мне нужно сделать частичное представление внутри ответа JSON. Пример:{"html":"<tr><td>I'm an HTML response</td></tr>"}. webjawns.com
Эй, я просто возвращаюсь к нему, так как я тоже к этому. В чем именно ваша проблема, хотя? Когда вы возвращаете jsonModel (массив ($ data)), тогда ответом является json. Вы не хотите делать какие-либо представления или что-либо еще при возврате JSON OO Sam

Ваш Ответ

4   ответа
7

для вашего ответа JSON.

public function indexAction() {
    $partial = $this->getServiceLocator()->get('viewhelpermanager')->get('partial');
    $data = array(
            'html' => $partial('MyModule/MyPartView.phtml', array("key" => "value")),
            'jsonVar1' => 'jsonVal2',
            'jsonArray' => array(1, 2, 3, 4, 5, 6));
    $isAjax = $this->getRequest()->isXmlHttpRequest());
    return isAjax?new JsonModel($data):new ViewModel($data);
}

Обратите внимание, что перед использованием класса JsonModel необходимо настроить View Manager вmodule.config.php файл вашего модуля.

'view_manager' => array(
        .................
        'strategies' => array(
            'ViewJsonStrategy',
        ),
        .................
    ),

это работа для меня и надеюсь, что это поможет вам.

47

я думаю, что наконец понял, что ты делаешь. Я нашел решение, которое, по моему мнению, соответствует вашим критериям. Хотя я уверен, что есть место для улучшений, так как надо сделать какую-то грязную ручную работу ...

public function indexAction()
{
  if (!$this->getRequest()->isXmlHttpRequest()) {
    return array();
  }

  $htmlViewPart = new ViewModel();
  $htmlViewPart->setTerminal(true)
               ->setTemplate('module/controller/action')
               ->setVariables(array(
                  'key' => 'value'
               ));

  $htmlOutput = $this->getServiceLocator()
                     ->get('viewrenderer')
                     ->render($htmlViewPart);

  $jsonModel = new JsonModel();
  $jsonModel->setVariables(array(
    'html' => $htmlOutput,
    'jsonVar1' => 'jsonVal2',
    'jsonArray' => array(1,2,3,4,5,6)
  ));

  return $jsonModel;
}

As you can see, the templateMap i create is ... nasty ... it's annoying and i'm sure it can be improved by quite a bit. It's a working solution but just not a clean one. Maybe somehow one would be able to grab the, probably already instantiated, default PhpRenderer from the ServiceLocator with it's template- and path-mapping and then it should be cleaner.

Благодаря комментарию @DrBeza работа, которую нужно было сделать, могла быть сокращена на значительную сумму. Теперь, как я изначально хотел, мы возьмем viewrenderer со всем отображением шаблона без изменений и просто визуализируем ViewModel напрямую. Единственным важным фактором является то, что вам нужно указать полностью определенный шаблон для рендеринга (например: & quot; $ module / $ controller / $ action & quot;)

Я надеюсь, что это поможет вам начать;)

PS: Ответ выглядит так:

Object:
    html: "<h1>Hello World</h1>"
    jsonArray: Array[6]
    jsonVar1: "jsonVal2"
@Sam Вы можете сократить все это с помощью: $ htmlOutput = $ this- & gt; getServiceLocator () - & gt; get (& quot; viewrenderer & apos;) - & gt; render (& reg;
Если вы используете Twig, заменитеget('viewrenderer') сget('ZfcTwigRenderer')
Я ценю ответ, но чувствую себя побитым. Это полезно, но не отвечает на мой вопрос. Мне нужно вернуть HTML в ответ JSON, который будет включать в себя другие переменные - потенциально несколько представлений. webjawns.com
@ webjawns.com Я отредактировал свой ответ, надеюсь, это поможет вам начать работу.
@DrBeza Спасибо за разъяснения, я думал, что это можно было бы сделать, но просто не знал, как :) Я постараюсь изменить ответ :)
-2

разработчик фреймворка связывается с AJAX, следуя правилу, почему просто, если может быть сложно. Вот простое решение. в скрипте контроллера

public function checkloginAction()
{
   // some hosts need to this some not 
   //header ("Content-type: application/json");  // this work
   // prepare json aray ....
   $arr = $array("some" => .....);
   echo json_encode($arr); // this works
   exit;
}

Это работает в ZF1 и ZF2, а также Нет необходимости просматривать Scrpt на всех

Если вы используете совет от создателя ZF2

use Zend\View\Model\JsonModel;
....


 $result = new JsonModel($arr);
 return $result;

AJAX получил нулевой ответ как минимум в zf 2.0.0

Как это:{&qu,ot;html":"<strong>I'm an HTML response</strong>"}. webjawns.com
яneed визуализировать скрипт представления в ответе Ajax. webjawns.com
1

MyControllerFactory.php

public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
    $renderer = $container->get('ViewRenderer');

    return new MyController(
        $renderer
    );
}

MyController.php

private $renderer;

public function __construct($renderer) {
    $this->renderer = $renderer;
}

public function indexAction() {

    $htmlViewPart = new ViewModel();
    $htmlViewPart
            ->setTerminal(true)
            ->setTemplate('module/controller/action')
            ->setVariables(array('key' => 'value'));

    $htmlOutput = $this->renderer->render($htmlViewPart);

    $json = \Zend\Json\Json::encode(
        array(
            'html' => $htmlOutput,
            'jsonVar1' => 'jsonVal2',
            'jsonArray' => array(1, 2, 3, 4, 5, 6)
        )
    );

    $response = $this->getResponse();
    $response->setContent($json);

    $response->getHeaders()->addHeaders(array(
        'Content-Type' => 'application/json',
    ));
    return $this->response;
}

Похожие вопросы