Как вернуть XML в приложении Zend Framework

Короткий ответ:

Вы не сделали.

Длинный ответ:

Вы можете сделать это, только если вы набрали фиксированный макет и не имеете управляемых членов , Структуры фиксируются по умолчанию. Классы могут иметь фиксированный макет.

(Я не показываю, как это вам действительно не нужно. Это важно только при выполнении взаимодействия).

13
задан halfpastfour.am 8 December 2017 в 14:21
поделиться

2 ответа

Вам не хватает конечного вопросительного знака в теге xml:

<?xml version='1.0'>

Должно быть

<?xml version='1.0'?>

Кроме того, вам, вероятно, потребуется отключить макет, чтобы он печатал только xml. Поместите эту строку в свой метод xmlAction ()

$this->_helper->layout->disableLayout();

. Вы можете использовать помощник действия contextSwitch

Кроме того, вы можете использовать DomDocument вместо того, чтобы вводить xml напрямую

10
ответ дан 1 December 2019 в 19:31
поделиться

UPDATE

Apparently, Zend Framework provides a way better method for that out of the box. Please do check the ContextSwitch action helper documentation.

The only thing you might want to change is force XML context in controller's init() method.

<?php

class ProjectsController extends Gid_Controller_Action
{
    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('xml', 'xml')->initContext('xml');
    }

    public function xmlAction()
    {
    }
}


Old answer.

It doesn't work because ZF renders both layout and template after your code.

I agree with Mark, layout should be disabled, though in addition you should also disable view renderer. And definitely DOMDocument is much more preferable when you're going to deal with XML.

Here is a sample controller that should do what you want:

<?php

class ProjectsController extends Gid_Controller_Action
{
    public function xmlAction()
    {
        // XML-related routine
        $xml = new DOMDocument('1.0', 'utf-8');
        $xml->appendChild($xml->createElement('foo', 'bar'));
        $output = $xml->saveXML();

        // Both layout and view renderer should be disabled
        Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true);
        Zend_Layout::getMvcInstance()->disableLayout();

        // Set up headers and body
        $this->_response->setHeader('Content-Type', 'text/xml; charset=utf-8')
            ->setBody($output);
    }
}
25
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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