Zend Framework将Doctrine查询结果导出到XML文件

时间:2011-06-11 17:07:39

标签: zend-framework

我需要将某些查询导出到xml文件。我有这个工作,创建文件并导出数据,但是我在屏幕上收到以下错误,因为文件正在导出而不显示。

This page contains the following errors:

error on line 3 at column 1: Extra content at the end of the document

我承认我是新手,因为大多数人都知道但有一种方法可以导出,只是向用户显示一条确认消息,报告已保存,或者我是否会这样做错误的方式完全?

我的代码在

下面

我的控制器

public function init()
{
  // allow certain reports to be exported to xml
  // initialize context switch helper
  $contextSwitch = $this->_helper->getHelper('contextSwitch');
  $contextSwitch->addActionContext('newsletterexport', 'xml')
              ->initContext();    

}

public function newsletterexportAction()

{
 $q = Doctrine_Query::create()
   ->select('c.firstname,c.lastname,c.address1,c.address2,c.address3,t.county')
  ->from('PetManager_Model_Clients c')
  ->leftJoin('c.PetManager_Model_Counties t')
  ->where('c.consentToNews=1');
  $result = $q->fetchArray();
         if (count($result) >= 1) {
    $this -> view -> records = $result; 
    }
 }

修改

好的我尝试按照建议将代码从xml.phtml移动到我的控制器中并尝试使用save保存文档,但现在我得到了xml文档的开头,如下所示,但没有记录保存到文档中。

<?xml version="1.0" encoding="utf-8"?>
<petmanager:document xmlns:petmanager="http://petmanager"><petmanager:records/></petmanager:document>

此编辑时的控制器代码

 public function newsletterexportAction()
 {
  $q = Doctrine_Query::create()

  ->select('c.firstname,c.lastname,c.address1,c.address2,c.address3,t.county')
  ->from('PetManager_Model_Clients c')
  ->leftJoin('c.PetManager_Model_Counties t')
  ->where('c.consentToNews=1');
    $result = $q->fetchArray();
         if (count($result) >= 1) {
          //$this -> view -> records = $result; 

          $docpref="newsletterexport";
           $docDate=date('y-m-d');
           $ext=".xml";
           $docname=$docpref.$docDate.$ext;

           // create XML document
           $dom = new DOMDocument('1.0', 'utf-8');

           // create root element
             $root = $dom->createElementNS('http://petmanager','petmanager:document');    
             $dom->appendChild($root);

              // convert to SimpleXML 
            $xml = simplexml_import_dom($dom);

            // add resultset elements
            $records = $xml->addChild('records');
            foreach($this->$result as $r){
            $record = $records->addChild('record');
            $record->addChild('firstName',$this->escape($r['firstName']));
            $record->addChild('lastName',$this->escape($r['lastName']));
            $record->addChild('address1',$this->escape($r['address1']));
            $record->addChild('address2',$this->escape($r['address2']));
            $record->addChild('address3',$this->escape($r['address3']));
            $record->addChild('county',$this->escape($r['PetManager_Model_Counties']['county']));
     }//end of foreach
      // saave document
      $xml->saveXML();
      $dom->save('D:/reports/exports/'.$docname.'');

    }

1 个答案:

答案 0 :(得分:0)

DomDocument::saveXML()没有文件路径 - 它将XML文档作为文本返回。如果您想直接将其保存为文件,请使用DomDocument::save()

你的phtml中的所有逻辑都应该在你的控制器中。您还将上下文设置为xml,因此视图将XML输出到浏览器,而不是HTML ...所以id不显示确认消息,除非它以XML编码,否则您需要使用默认上下文(HTML)。因此,如果您想将文件保存到网络服务器并显示确认信息,请执行以下操作:

public function exportXmlAction(){
  // remove the context switch from init
  // do your doctrine stuff
  // build the xml DOM as $xml
  $xml->save('path/to/file');
  $this->message = 'File was exported successfully!';
}

// in your phtml
<?php echo $this->message; ?>

如果要在屏幕上显示xml:

public function exportXmlAction(){
  // do your doctrine stuff
  // build the xml DOM as $xml
  $this->xmlDom = $xml;
}

// in your phtml
<?php echo $this->xmlDom->saveXml(); ?>

我遇到的问题是,用户是否希望将xml导出到服务器。当您调用DomDocument::save()时,您将该文件保存到服务器上的路径,而不是用户的计算机,那么将xml导出到用户无法访问它的服务器是什么意思?