Joomla - задача кантролера, які вяртае дадзеныя ў фармаце JSON

У мяне ёсць задача Выканаць ў маім кантролеры. Я хачу, каб вярнуць дадзеныя ў фармаце JSON. Як яна стаіць, я атрымліваю мае дадзеныя ў фармаце JSON, абгорнутыя ўнутры шаблону HTML. Як сказаць Joomla, каб проста вярнуць дадзеныя ў фармаце JSON з кантролера? Гэта функцыя ў мяне ёсць:

public function run  ( ) {

    JFactory::getDocument()->setMimeEncoding( 'application/json' );

    JResponse::setHeader('Content-Disposition','attachment;filename="progress-report-results.json"');

    JRequest::setVar('tmpl','component');

    $data = array(
        'foo' => 'bar'
    );

    echo json_encode( $data );

}

І гэта вяртае:


...
</head>
<body class="contentpane">

<div id="system-message-container">
</div>
    {"foo":"bar"}
</body>
</html>

I would like to get:

{"foo":"bar"}
8

6 адказы

Вам не трэба пабудаваць спецыяльны выгляд JSON ( view.json.php , або кантролер progressreports.json.php ) для дасягнення гэтай мэты. Адзінае, што вам трэба зрабіць, гэта паўтарыць радок JSON і закрыць прыкладанне.

public function run( )
{
    JFactory::getDocument()->setMimeEncoding( 'application/json' );
    JResponse::setHeader('Content-Disposition','attachment;filename="progress-report-results.json"');

    $data = array(
        'foo' => 'bar'
    );
    echo json_encode( $data );
    JFactory::getApplication()->close();//or jexit();
}

Вам трэба ўсяго толькі асобны выгляд (або кантролер), калі вы хочаце, каб забяспечыць <�жа эм /> функцыі як з HTML і вываду JSON (абранага абанентам).

16
дададзена

Вы павінны выкарыстоўваць jexit() для вяртання дадзеных у фармаце JSON без высновы Joomla.

public function run  ( ) {

    $data = array(
        'foo' => 'bar'
    );

    echo json_encode( $data );
    jexit();

}
2
дададзена

Атрымаў адказ.

Мне трэба было зрабіць новы кантролер. У маім выпадку арыгінальны кантролер быў названы, progressreports.php - я зрабіў новы кантролер пад назвай progressreports.raw.php.

Тады пры выкліку URL, дадайце фармат = сырой. гэта значыць

index.php?option=com_foo&task=progressreports.run&format=raw
2
дададзена
Там некалькі спосабаў, каб зрабіць гэта. Тое, што вы зрабілі, гэта адзін са спосабаў і Nagarjun адзначыў тое, што вы павінны пераканацца, што вы робіце для JSON запытаў. Вы таксама можаце выкарыстоўваць кантролер progressreports.json.php і змяніць свой запыт на фарматаванне = JSON. У рэшце рэшт, так доўга, як гэта працуе для вас, то вы добра ісці.
дададзена аўтар Michael, крыніца

Я праверыў прыняты адказ, ён не працуе з Joomla 3.4.3. Калі ў каго-то такая ж праблема, вось рашэнне для ніжэйшых версій Joomla:

$data = array(
    'foo' => 'bar'
);
header('content-type: application/json; charset=utf-8');
echo json_encode($data);
JFactory::getApplication()->close();

Загаловак кантэнту дыспазіцыі неабходны толькі калі вы хочаце, каб прапанаваць файл для загрузкі.

ад: Я проста хачу, каб скончыць гэты праект і піць somethink забыцца. Нават пачынаючы з нуля і пісаць новы CMS будзе менш балючым. : S

1
дададзена

У залежнасці ад таго, што вы робіце, вы можаце зрабіць JSon дакумент, whatever.json.php замест whatever.html.php.

1
дададзена

Я не люблю шмат JResponseJson, а таксама мне падабаецца ставіць паведамленні для наступнага запыту, так што я зрабіў наступны метад на галоўным кантролеры майго кампаненты:

public function returnJson($data)
{
    $app = Factory::getApplication();

   //Persist messages if they exist. (Same as CMSApplication->redirect)
    $session = \JFactory::getSession();
    $session->set('application.queue', $app->getMessageQueue());

   //Send json mime type.
    $app->mimeType = 'application/json';
    $app->setHeader('Content-Type', $app->mimeType . '; charset=' . $app->charSet);
    $app->sendHeaders();

    echo json_encode($data);

    $app->close();
}

У любой задачы кантролера або на поўдзень ад кантролера вы маглі зараз зрабіць наступнае:

public function sampleTask()
{
    $app = Factory::getApplication();
    $app->enqueueMessage("Done (for the next user's request)", 'success');
    $this->returnJson("json data");
}
0
дададзена