XmlResponseFormatter

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
wxectrbhj
Сообщения: 4
Зарегистрирован: 2014.10.28, 19:16

XmlResponseFormatter

Сообщение wxectrbhj »

Здравствуйте.
Не подскажите, каким образом можно задать content Type и root Tag ?
Аватара пользователя
asset
Сообщения: 245
Зарегистрирован: 2012.12.04, 20:50
Откуда: Казахстан

Re: XmlResponseFormatter

Сообщение asset »

wxectrbhj
Сообщения: 4
Зарегистрирован: 2014.10.28, 19:16

Re: XmlResponseFormatter

Сообщение wxectrbhj »

Я умею пользоваться документацией, просто не могу понять как их вызвать.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: XmlResponseFormatter

Сообщение zelenin »

wxectrbhj писал(а):Я умею пользоваться документацией, просто не могу понять как их вызвать.
так задаем свой класс:

Код: Выделить всё

        'response' => [
            'formatters' => [
                Response::FORMAT_JSON => 'common\components\JsonResponseFormatter'
            ]
        ] 
так задаем настройки:

Код: Выделить всё

        'response' => [
            'formatters' => [
                Response::FORMAT_JSON => [
                    'class' => 'common\components\JsonResponseFormatter',
                    // тут настройки
                    ]
            ]
        ] 
zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

Re: XmlResponseFormatter

Сообщение zxczxc12 »

Столкнулся с такой же проблемой , но ни документация , ни предыдущий совет , к сожалению , не внес ясности

Вот пример :

Код: Выделить всё

$export_rates=ExchangeDirection::getRatesArray();

if ($export_type == 'xml') {
            \Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
}elseif($export_type == 'json'){
            \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
}
return export_rates;

Все работает , но rootTag мне нужно сменить ( по умолчанию он = 'reponse' )

В документации есть :
Class yii\web\XmlResponseFormatter
и
$rootTag

Но как в моем примере задать это свойств - ну без малейшего понятия и в нете нигде такой пример не рассматривается :-((((


Есть еще вариант на основе официальной документации. Реализуется с помощью поведения :
https://github.com/samdark/yii2-cookboo ... formats.md
И вроде бы красивый вариант , но опять же непонятно как/куда сюда воткнуть этот $rootTag :-(

Код: Выделить всё

public function behaviors()
{
    return [
        // ...
        'contentNegotiator' => [
            'class' => \yii\filters\ContentNegotiator::className(),
            'only' => ['index', 'view'],
            'formatParam' => '_format',
            'formats' => [
                'application/json' => \yii\web\Response::FORMAT_JSON,
                'application/xml' => \yii\web\Response::FORMAT_XML,
            ],
        ],
    ];
}

Спасибо !
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: XmlResponseFormatter

Сообщение zelenin »

комментом выше есть слова "тут настройки" - эти слова написаны для понимания того, где писать настройки форматтера.
zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

Re: XmlResponseFormatter

Сообщение zxczxc12 »

"тут настройки" - это я прочитал , с русским проблем нет

Но вот это "тут" никак не вяжется с тем что у меня в первом вариант

Даже примеров не могу написать что бы передать насколько не вяжется :-)

Попробую

Вариант для первого случая:

Код: Выделить всё

$export_rates=ExchangeDirection::getRatesArray();

if ($export_type == 'xml') {
            \Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
            // Как примедрить сюда "ТУ" настройку ?
            \Yii::$app->response->rootTag='test'; \\ Не работает
}elseif($export_type == 'json'){
            \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
}
return export_rates; 

Вариант второго случая:

Код: Выделить всё

public function behaviors()
{
    return [
        // ...
        'contentNegotiator' => [
            'class' => \yii\filters\ContentNegotiator::className(),
            'only' => ['index', 'view'],
            'formatParam' => '_format',
            'formats' => [
                'application/json' => \yii\web\Response::FORMAT_JSON,
                'application/xml' => \yii\web\Response::FORMAT_XML,
                 //    Куда/как тут "ТУ" настройку пихнуть ?
                 'rootTag' => 'test'  // Не работает
            ],
        ],
    ];
} 
Если вы давали пример используя ваш код в конфигурационном файле , то вопросов становится ещё больше ибо непонятно , все страницы будут выводиться XML ? и тп
Последний раз редактировалось zxczxc12 2016.05.24, 17:15, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: XmlResponseFormatter

Сообщение zelenin »

1) а вы попробовали? все в xml выводится?
zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

Re: XmlResponseFormatter

Сообщение zxczxc12 »

zelenin писал(а):1) а вы попробовали? все в xml выводится?

Вроде начинает доходить до меня :-)

Но тогда другой вопрос

Код: Выделить всё

'response' => [
            'formatters' => [
                Response::FORMAT_JSON => 'common\components\JsonResponseFormatter'
            ]
        ] 
common\components\JsonResponseFormatter - это что ??
Какое оно должно быть ?

Спасибо :-)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: XmlResponseFormatter

Сообщение zelenin »

так мы задаем класс своего форматтера для json (в приведенном вами примере). Если не задавать, то будет использоваться дефолтный. Вам осталось задать настройки для дефолтного форматтера xml.
zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

Re: XmlResponseFormatter

Сообщение zxczxc12 »

zelenin писал(а):так мы задаем класс своего форматтера для json (в приведенном вами примере). Если не задавать, то будет использоваться дефолтный. Вам осталось задать настройки для дефолтного форматтера xml.

Спасибо огромное за желание помочь но
Вам осталось задать настройки для дефолтного форматтера xml.
никак не решает вопроса :-(((
zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

Re: XmlResponseFormatter

Сообщение zxczxc12 »

Отвечу сам на этот вопрос популярно и на пальцах

Вот решение без вмешательство в конфигурационные файлы:

Код: Выделить всё

if ($export_type == 'xml') {
            Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
            Yii::$app->response->formatters = ['xml' => \common\components\XmlCustomRootTagFormatter::className() ];
}

return $export_rates;
Файл XmlCustomRootTagFormatter.php

Код: Выделить всё

class XmlCustomRootTagFormatter extends \yii\web\XmlResponseFormatter
{
    public function __construct()
    {
        $this->rootTag='rates';

        parent::__construct();
    }
}

Алилуя !
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: XmlResponseFormatter

Сообщение zelenin »

zxczxc12 писал(а):Отвечу сам на этот вопрос популярно и на пальцах

Вот решение без вмешательство в конфигурационные файлы:

Код: Выделить всё

if ($export_type == 'xml') {
            Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
            Yii::$app->response->formatters = ['xml' => \common\components\XmlCustomRootTagFormatter::className() ];
}

return $export_rates;
 
Файл XmlCustomRootTagFormatter.php

Код: Выделить всё

class XmlCustomRootTagFormatter extends \yii\web\XmlResponseFormatter
{
    public function __construct()
    {
        $this->rootTag='rates';

        parent::__construct();
    }
} 

Алилуя !
тоже самое можно было прописать в конфиге.
Ответить