2009-10-09 14 views
13

Mam problemy z zwracaniem XML w mojej aplikacji ZF. Mój kod:Jak zwrócić XML w aplikacji Zend Framework

class ProjectsController extends Gid_Controller_Action 
{ 
    public function xmlAction() 
    { 
     $content = "<?xml version='1.0'><foo>bar</foo>"; 
     header('Content-Type: text/xml'); 
     echo $content; 
    } 
} 

Ja również próbowałem następujące:

class ProjectsController extends Gid_Controller_Action 
{ 
    public function xmlAction() 
    { 
     $content = "<?xml version='1.0'><foo>bar</foo>"; 
     $this->getResponse()->clearHeaders(); 
     $this->getResponse()->setheader('Content-Type', 'text/xml'); 
     $this->getResponse()->setBody($content); 
     $this->getResponse()->sendResponse(); 
    } 
} 

Może ktoś mi punkt w dobrym kierunku, jak to osiągnąć?

Odpowiedz

9

Brakuje końcowy znak zapytania na znaczniku xml:

<?xml version='1.0'> 

Powinno być

<?xml version='1.0'?> 

Dodatkowo, prawdopodobnie będzie trzeba wyłączyć układ tak drukuje tylko xml . Umieścić tę linię w xmlAction metoda()

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

Można rozważyć contextSwitch action helper

Ponadto, można użyć DomDocument zamiast wpisywania xml bezpośrednio

+0

jak zrobić to samo w Zend Framework 3? –

25

UPDATE

Wygląda na to, że Zend Framework zapewnia lepszą metodę dla tego po wyjęciu z pudełka. Proszę sprawdzić dokumentację ContextSwitch action helper.

Jedyną rzeczą, którą warto zmienić, jest wymuszenie kontekstu XML w metodzie init() kontrolera.

<?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 odpowiedź.

To nie działa, ponieważ ZF renderuje układ i szablon po kodzie.

Zgadzam się z Mark, układ powinien być wyłączony, chociaż dodatkowo należy również wyłączyć renderer widoku. A zdecydowanie DOMDocument jest o wiele bardziej preferowany, gdy masz do czynienia z XML.

Oto przykładowy kontroler, który powinien robić to, co chcesz:

<?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); 
    } 
} 
+0

Dzięki za pomoc! :) –

+0

Nie ma za co :) –

+0

gdzie umieścić taki plik w strukturze folderów projektu Zend Framework? nie pasuje do paradygmatu wiadra MVC –