public function onBeforeWrite()
 {
     parent::onBeforeWrite();
     if ($new_pages = $this->owner->PageStructure) {
         $new_pages = explode("\n", $new_pages);
         $curr_level_page = array();
         $level_sequence = array(1 => 0, 2 => 0, 3 => 0, 4 => 0);
         foreach ($new_pages as $page) {
             $page_class = false;
             if (strpos($page, "|") !== false) {
                 list($page_name, $page_class) = explode("|", trim($page));
             } else {
                 $page_name = trim($page);
             }
             $level = 1;
             while (preg_match("/^\\~/", $page_name)) {
                 $page_name = substr($page_name, 1);
                 $level++;
             }
             $level_sequence[$level] += 10;
             $parentID = 0;
             if ($level > 1 && $curr_level_page[$level - 1]) {
                 $parent = $curr_level_page[$level - 1];
                 $parentID = $parent->ID;
             }
             // see if the page exists
             if (!($new_page = DataObject::get_one('SiteTree', "Title = '" . Convert::raw2sql($page_name) . "' AND ParentID = " . $parentID))) {
                 if ($page_class && $page_class != "Page" && class_exists($page_class)) {
                     $new_page = new $page_class();
                 } else {
                     $new_page = new Page();
                 }
                 $new_page->Title = $page_name;
                 $new_page->Content = '<p>Donec tristique sagittis volutpat. Donec vitae fringilla enim. Vivamus ut velit consectetur, suscipit enim eu, vestibulum ipsum. Morbi tincidunt arcu et nunc consequat dictum. Donec venenatis dolor ac dolor malesuada, non fringilla diam tristique. Duis sit amet semper velit. Vivamus porttitor lectus sed erat interdum, at facilisis urna accumsan. Nunc sit amet sapien et nibh pharetra suscipit at ac urna. Praesent semper eros a mi adipiscing vehicula. Donec pharetra aliquet porta.</p>';
                 $new_page->Status = 'Published';
                 $new_page->Sort = $level_sequence[$level];
                 if ($parentID) {
                     $new_page->ParentID = $parentID;
                 }
                 $new_page->write();
                 $new_page->writeToStage('Stage');
                 $new_page->doPublish();
                 $new_page->flushCache();
             } else {
                 // update the position if the page already exists
                 if (class_exists($page_class) && $new_page->ClassName != $page_class) {
                     $new_page->ClassName = $page_class;
                 }
                 $new_page->Sort = $level_sequence[$level];
                 $new_page->write();
                 $new_page->writeToStage('Stage');
                 $new_page->doPublish();
                 $new_page->flushCache();
             }
             $curr_level_page[$level] = $new_page;
         }
         // update sequence on error pages
         foreach (DataObject::get('ErrorPage') as $error_page) {
             $error_page->Sort = 9999;
             $error_page->write();
             $error_page->writeToStage('Stage');
             $error_page->doPublish();
             $error_page->flushCache();
         }
     }
     $this->owner->PageStructure = "";
 }
 /**
  * This test ensures published Subsites Virtual Pages immediately reflect updates
  * to their published target pages. Note - this has to happen when the virtual page
  * is in a different subsite to the page you are editing and republishing,
  * otherwise the test will pass falsely due to current subsite ID being the same.
  */
 function testPublishedSubsiteVirtualPagesUpdateIfTargetPageUpdates()
 {
     // create page
     $p = new Page();
     $p->Content = 'Content';
     $p->Title = 'Title';
     $p->writeToStage('Stage');
     $p->publish('Stage', 'Live');
     $this->assertTrue($p->ExistsOnLive);
     // change to subsite
     $subsite = $this->objFromFixture('Subsite', 'subsite2');
     Subsite::changeSubsite($subsite->ID);
     Subsite::$disable_subsite_filter = false;
     // create svp in subsite
     $svp = new SubsitesVirtualPage();
     $svp->CopyContentFromID = $p->ID;
     $svp->write();
     $svp->writeToStage('Stage');
     $svp->publish('Stage', 'Live');
     $this->assertEquals($svp->SubsiteID, $subsite->ID);
     $this->assertTrue($svp->ExistsOnLive);
     // change back to original subsite ("Main site")
     Subsite::changeSubsite(0);
     // update original page
     $p->Title = 'New Title';
     // "save & publish"
     $p->writeToStage('Stage');
     $p->publish('Stage', 'Live');
     $this->assertNotEquals($p->SubsiteID, $subsite->ID);
     // reload SVP from database
     // can't use DO::get by id because caches.
     $svpdb = $svp->get()->byID($svp->ID);
     // ensure title changed
     $this->assertEquals($svpdb->Title, $p->Title);
 }