Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

DataObjectManager Module

Discuss the DataObjectManager module, and the related ImageGallery module.

Moderators: martimiz, UncleCheese, Sean, biapar, Willr, Ingo, swaiba, simon_w

[SOLVED] write a xml file - OnAfterWrite


Reply

19 Posts   4508 Views

Avatar
borriej

18 March 2011 at 2:26am (Last edited: 18 March 2011 2:27am), Community Member, 267 Posts

@Banal, i will check your method in a sec..

for now it is solved. I didnt used the template because it was not working. and when viewing online (with the public function) <img> tags were closed by a slash <img height="567" />
this was illegal for the xml, so another reason to NOT use a template for xml.

example can be found here (temporary):
http://www.robvaneckdesign.nl/pageflip/

for the people who wan to know how i did it:

<?php
class Flyer extends Page {
   static $has_many = array (
      'FlyerPaginas' => 'FlyerPagina'
   );
   
   public function getCMSFields() {
$fields = parent::getCMSFields();
$manager = new FileDataObjectManager(
$this,
'FlyerPaginas', // relation name
'FlyerPagina', // class name of the DataObject
'Image', // name of the file relation in the DataObject
array(
          'Title' => 'Title',
         // 'Comment' => 'Comment',
       ), // headings
'getCMSFields_forPopup' // name of the function for the popup fields

);
   $fields->removeFieldFromTab('Root.Content.Main','Content');
   $fields->addFieldToTab('Root.Content.Images', $manager);
return $fields;
}

   public function onAfterWrite(){
      parent::onAfterWrite();
      $dom = new DomDocument('1.0');
      
      $implementation = new DOMImplementation();
      
      $dtd = $implementation->createDocumentType('xml',
            'DOCTYPE book SYSTEM',
            'http://www.megazine3.de/megazine2.dtd');
      
      $dom = $implementation->createDocument('', '', $dtd);
      
      $book = $dom->appendChild($dom->createElement('book'));
      
      $plugins = $book->appendChild($dom->createAttribute('plugins'));
      $plugins2 = $plugins->appendChild($dom->createTextNode('zoom, keyboardnavigation, navigationbar, swfaddress'));
      
      $pagewidth = $book->appendChild($dom->createAttribute('pagewidth'));
      $pagewidth2 = $pagewidth->appendChild($dom->createTextNode('567'));
      
      $pageheight = $book->appendChild($dom->createAttribute('pageheight'));
      $pageheight2 = $pageheight->appendChild($dom->createTextNode('567'));
      
      $lang = $book->appendChild($dom->createAttribute('lang'));
      $lang2 = $lang->appendChild($dom->createTextNode('en'));
      
      $zoomminscale = $book->appendChild($dom->createAttribute('zoomminscale'));
      $zoomminscale2 = $zoomminscale->appendChild($dom->createTextNode('0.5'));
      
      $zoommaxscale = $book->appendChild($dom->createAttribute('zoommaxscale'));
      $zoommaxscale2 = $zoommaxscale->appendChild($dom->createTextNode('2.0'));
      
      $zoomsnap = $book->appendChild($dom->createAttribute('zoomsnap'));
      $zoomsnap2 = $zoomsnap->appendChild($dom->createTextNode('0.5, 1.0, 1.5, 2.0'));
      
      $zoomsteps = $book->appendChild($dom->createAttribute('zoomsteps'));
      $zoomsteps2 = $zoomsteps->appendChild($dom->createTextNode('0.5'));
      
      $dragrange = $book->appendChild($dom->createAttribute('dragrange'));
      $dragrange2 = $dragrange->appendChild($dom->createTextNode('20'));
      
      $qualitycontrol = $book->appendChild($dom->createAttribute('qualitycontrol'));
      $qualitycontrol2 = $qualitycontrol->appendChild($dom->createTextNode('true'));
      
      $thumbscale = $book->appendChild($dom->createAttribute('thumbscale'));
      $thumbscale2 = $thumbscale->appendChild($dom->createTextNode('0.35'));
      
      $cornerhint = $book->appendChild($dom->createAttribute('cornerhint'));
      $cornerhint2 = $cornerhint->appendChild($dom->createTextNode('true'));
      
      $pagethickness = $book->appendChild($dom->createAttribute('pagethickness'));
      $pagethickness2 = $pagethickness->appendChild($dom->createTextNode('0.1'));
      
      $shadows        = $book->appendChild($dom->createAttribute('shadows'));
      $shadows2        = $shadows->appendChild($dom->createTextNode('0.3'));
      
      $startpage     = $book->appendChild($dom->createAttribute('startpage'));
      $startpage2     = $startpage->appendChild($dom->createTextNode('1'));
      
      $centercovers     = $book->appendChild($dom->createAttribute('centercovers'));
      $centercovers2    = $centercovers->appendChild($dom->createTextNode('false'));
      
      $pageoffset     = $book->appendChild($dom->createAttribute('pageoffset'));
      $pageoffset2    = $pageoffset->appendChild($dom->createTextNode('0'));

      $chapter = $book->appendChild($dom->createElement('chapter'));
      
      foreach($this->FlyerPaginas() as $FlyerPagina) {
         $page = $chapter->appendChild($dom->createElement('page'));
         $img = $page->appendChild($dom->createElement('img'));
         $width = $img->appendChild($dom->createAttribute('width'));
         $width2 = $width->appendChild($dom->createTextNode('567'));
         $height = $img->appendChild($dom->createAttribute('height'));
         $height2 = $height->appendChild($dom->createTextNode('567'));
         
         //Zoom level 0,5
         $src1 = $img->appendChild($dom->createElement('src'));
         $scaleA = $src1->appendChild($dom->createAttribute('scale'));
         $scaleB = $scaleA->appendChild($dom->createTextNode('0.5'));
         
         $src1 ->appendChild(
            $dom->createTextNode($FlyerPagina->Image()->SetWidth(284)->URL)
         );
         //Zoom level 0,75
         $src5 = $img->appendChild($dom->createElement('src'));
         $scaleX = $src5->appendChild($dom->createAttribute('scale'));
         $scaleY = $scaleX->appendChild($dom->createTextNode('0.75'));
         
         $src5 ->appendChild(
            $dom->createTextNode($FlyerPagina->Image()->SetWidth(433)->URL)
         );
         //Zoom level 1,0
         $src2 = $img->appendChild($dom->createElement('src'));
         $scaleC = $src2->appendChild($dom->createAttribute('scale'));
         $scaleD = $scaleC->appendChild($dom->createTextNode('1.0'));
         
         $src2 ->appendChild(
            $dom->createTextNode($FlyerPagina->Image()->SetWidth(567)->URL)
         );
         //Zoom level 1,5
         $src3 = $img->appendChild($dom->createElement('src'));
         $scaleE = $src3->appendChild($dom->createAttribute('scale'));
         $scaleF = $scaleE->appendChild($dom->createTextNode('1.5'));
         
         $src3 ->appendChild(
            $dom->createTextNode($FlyerPagina->Image()->SetWidth(850)->URL)
         );
         
         //Zoom level 2,0
         $src4 = $img->appendChild($dom->createElement('src'));
         $scaleG = $src4->appendChild($dom->createAttribute('scale'));
         $scaleH = $scaleG->appendChild($dom->createTextNode('2.0'));
         
         $src4 ->appendChild(
            $dom->createTextNode($FlyerPagina->Image()->SetWidth(1134)->URL)
         );

      }
      //generate xml
      $dom->formatOutput = true; // set the formatOutput attribute of
                        // domDocument to true
      // save XML as string or file
      $test1 = $dom->saveXML(); // put string in test1
      $dom->save('megazine.mz3'); // save as file - add absolute path
      
   }
}

class Flyer_Controller extends Page_Controller {
}

class FlyerPagina extends DataObject {
   static $db = array (
      'Title' => 'Text',
   //   'Comment' => 'HTMLText',
   );
   static $has_one = array (
      'Image' => 'Image',
      'Flyer' => 'Flyer'
   );
   public function getCMSFields_forPopup() {
      $fields = new FieldSet();
      $fields->push(new TextField('Title'));
      //$fields->push(new SimpleTinyMCEField('Comment'));
      $fields->push(new FileUploadField('Image','Upload files'));
      return $fields;
   }
}

Avatar
banal

18 March 2011 at 2:59am Community Member, 901 Posts

I use templates to output XML code all the time. You can create valid image tags yourself and use $Image.Link to just get the src part..

Also writing to files never was an issue... here's a flash page that's driven by SilverStripe and uses exactly this (templates for xml generation and caching to files): http://www.missionfuture.ch/

Avatar
jprivor

9 July 2011 at 10:12pm Community Member, 1 Post

I managed to do something similar to what you wanted to do originally through onAfterWrite(). Since your onAfterWrite() is in the FlyerPagina DataObject, when $this->renderWith() is called, the FlyerPagina object is the the root object. This means that <% control FlyerPagina %> attempts to descend into the FlyerPagina object when it is already at that object level. Instead, <% control Me %> needs to be used in place of <% control FlyerPagina %> so the control stays at the top level. From there the FlyerPagina object variables are accessible using the $ prefix as with any other template. This fix also applies to DataObjectSets that call renderWith(), which is what I ended up using to save a file containing data from all the DataObjects with that class type.

What I find odd is that I needed to force a theme setting in the onAfterWrite() method in the DataObject I have using SSViewer::set_theme(). Without it, SilverStripe throws an "[User Warning] None of these templates can be found in theme" error, and calling SSViewer::current_theme() in onAfterWrite() returns null. Any ideas on this behavior?