Jump to:

7940 Posts in 1543 Topics by 946 members

DataObjectManager Module

SilverStripe Forums » DataObjectManager Module » [SOLVED] write a xml file - OnAfterWrite

Discuss the DataObjectManager module, and the related ImageGallery module.

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

Page: 1 2 3
Go to End
Author Topic: 4461 Views
  • borriej
    Community Member
    267 Posts

    Re: [SOLVED] write a xml file - OnAfterWrite Link to this post

    @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):

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

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

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

       public function onAfterWrite(){
          $dom = new DomDocument('1.0');
          $implementation = new DOMImplementation();
          $dtd = $implementation->createDocumentType('xml',
                'DOCTYPE book SYSTEM',
          $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(
             //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(
             //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(
             //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(
             //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(

          //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;

  • banal
    Community Member
    901 Posts

    Re: [SOLVED] write a xml file - OnAfterWrite Link to this post

    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/

  • jprivor
    Community Member
    1 Post

    Re: [SOLVED] write a xml file - OnAfterWrite Link to this 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?

Page: 1 2 3
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.