protected function doCloneObject($new_obj, $a_target_id, $a_copy_id = null)
 {
     self::cloneBasics($this, $new_obj);
     // copy pages
     include_once "Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
     foreach (ilPortfolioPage::getAllPages($this->getId()) as $page) {
         // see ilObjWiki::cloneObject();
         $page = new ilPortfolioTemplatePage($page["id"]);
         $new_page = new ilPortfolioTemplatePage();
         $new_page->setPortfolioId($new_obj->getId());
         $new_page->setTitle($page->getTitle());
         $new_page->setType($page->getType());
         $new_page->setOrderNr($page->getOrderNr());
         $new_page->create();
         $page->copy($new_page->getId(), "", 0, true);
     }
 }
 /**
  * Build template from portfolio and vice versa
  * 
  * @param ilObjPortfolioBase $a_source
  * @param ilObjPortfolioBase $a_target
  * @param array $a_recipe
  */
 public static function clonePagesAndSettings(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target, array $a_recipe = null)
 {
     global $lng, $ilUser;
     $source_id = $a_source->getId();
     $target_id = $a_target->getId();
     if ($a_source instanceof ilObjPortfolioTemplate && $a_target instanceof ilObjPortfolio) {
         $direction = "t2p";
     } else {
         if ($a_source instanceof ilObjPortfolio && $a_target instanceof ilObjPortfolioTemplate) {
             $direction = "p2t";
         } else {
             return;
         }
     }
     // copy portfolio properties
     $a_target->setPublicComments($a_source->hasPublicComments());
     $a_target->setProfilePicture($a_source->hasProfilePicture());
     $a_target->setFontColor($a_source->getFontColor());
     $a_target->setBackgroundColor($a_source->getBackgroundColor());
     $a_target->setImage($a_source->getImage());
     $a_target->update();
     // banner/images
     $source_dir = $a_source->initStorage($source_id);
     $target_dir = $a_target->initStorage($target_id);
     ilFSStoragePortfolio::_copyDirectory($source_dir, $target_dir);
     // set/copy stylesheet
     include_once "./Services/Style/classes/class.ilObjStyleSheet.php";
     $style_id = $a_source->getStyleSheetId();
     if ($style_id > 0 && !ilObjStyleSheet::_lookupStandard($style_id)) {
         $style_obj = ilObjectFactory::getInstanceByObjId($style_id);
         $new_id = $style_obj->ilClone();
         $a_target->setStyleSheetId($new_id);
         $a_target->update();
     }
     // copy pages
     $blog_count = 0;
     include_once "Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
     foreach (ilPortfolioPage::getAllPages($source_id) as $page) {
         $page_id = $page["id"];
         if ($direction == "t2p") {
             $source_page = new ilPortfolioTemplatePage($page_id);
             $target_page = new ilPortfolioPage();
         } else {
             $source_page = new ilPortfolioPage($page_id);
             $target_page = new ilPortfolioTemplatePage();
         }
         $source_page->setPortfolioId($source_id);
         $target_page->setPortfolioId($target_id);
         $page_type = $source_page->getType();
         $page_title = $source_page->getTitle();
         $page_recipe = null;
         if (is_array($a_recipe)) {
             $page_recipe = $a_recipe[$page_id];
         }
         $valid = false;
         switch ($page_type) {
             // blog => blog template
             case ilPortfolioTemplatePage::TYPE_BLOG:
                 if ($direction == "p2t") {
                     $page_type = ilPortfolioTemplatePage::TYPE_BLOG_TEMPLATE;
                     $page_title = $lng->txt("obj_blog") . " " . ++$blog_count;
                     $valid = true;
                 }
                 break;
                 // blog template => blog (needs recipe)
             // blog template => blog (needs recipe)
             case ilPortfolioTemplatePage::TYPE_BLOG_TEMPLATE:
                 if ($direction == "t2p" && is_array($page_recipe)) {
                     $page_type = ilPortfolioPage::TYPE_BLOG;
                     if ($page_recipe[0] == "blog") {
                         switch ($page_recipe[1]) {
                             case "create":
                                 $page_title = self::createBlogInPersonalWorkspace($page_recipe[2]);
                                 $valid = true;
                                 break;
                             case "reuse":
                                 $page_title = $page_recipe[2];
                                 $valid = true;
                                 break;
                             case "ignore":
                                 // do nothing
                                 break;
                         }
                     }
                 }
                 break;
                 // page editor
             // page editor
             default:
                 $target_page->setXMLContent($source_page->copyXmlContent(true));
                 // copy mobs
                 $target_page->buildDom(true);
                 // parse content / blocks
                 $dom = $target_page->getDom();
                 if ($dom instanceof php4DOMDocument) {
                     $dom = $dom->myDOMDocument;
                 }
                 if ($direction == "t2p") {
                     // update profile/consultation hours user id
                     self::updateDomNodes($dom, "//PageContent/Profile", "User", $ilUser->getId());
                     self::updateDomNodes($dom, "//PageContent/ConsultationHours", "User", $ilUser->getId());
                 }
                 // :TODO: skills
                 $valid = true;
                 break;
         }
         if ($valid) {
             // #12038 - update xml from dom
             $target_page->setXMLContent($target_page->getXMLFromDom());
             $target_page->setType($page_type);
             $target_page->setTitle($page_title);
             $target_page->create();
             if ($page_type == ilPortfolioPage::TYPE_PAGE) {
                 $target_page->update();
                 // handle mob usages!
             }
         }
     }
 }
 /**
  * Import record
  *
  * @param
  * @return
  */
 function importRecord($a_entity, $a_types, $a_rec, $a_mapping, $a_schema_version)
 {
     switch ($a_entity) {
         case "prtt":
             include_once "./Modules/Portfolio/classes/class.ilObjPortfolioTemplate.php";
             // container copy
             if ($new_id = $a_mapping->getMapping("Services/Container", "objs", $a_rec["Id"])) {
                 $newObj = ilObjectFactory::getInstanceByObjId($new_id, false);
             } else {
                 $newObj = new ilObjPortfolioTemplate();
                 $newObj->create();
             }
             $newObj->setTitle($a_rec["Title"]);
             $newObj->setDescription($a_rec["Description"]);
             $newObj->setPublicComments($a_rec["Comments"]);
             $newObj->setBackgroundColor($a_rec["BgColor"]);
             $newObj->setFontColor($a_rec["FontColor"]);
             $newObj->setProfilePicture($a_rec["Ppic"]);
             $newObj->setImage($a_rec["Img"]);
             $newObj->update();
             // handle image(s)
             if ($a_rec["Img"]) {
                 $dir = str_replace("..", "", $a_rec["Dir"]);
                 if ($dir != "" && $this->getImportDirectory() != "") {
                     $source_dir = $this->getImportDirectory() . "/" . $dir;
                     $target_dir = ilObjPortfolioTemplate::initStorage($newObj->getId());
                     ilUtil::rCopy($source_dir, $target_dir);
                 }
             }
             $a_mapping->addMapping("Modules/Portfolio", "prtt", $a_rec["Id"], $newObj->getId());
             break;
         case "portfolio_page":
             $prtt_id = (int) $a_mapping->getMapping("Modules/Portfolio", "prtt", $a_rec["PortfolioId"]);
             if ($prtt_id) {
                 include_once "./Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
                 $newObj = new ilPortfolioTemplatePage();
                 $newObj->setPortfolioId($prtt_id);
                 $newObj->setTitle($a_rec["Title"]);
                 $newObj->setType($a_rec["Type"]);
                 $newObj->setOrderNr($a_rec["OrderNr"]);
                 $newObj->create(true);
                 $a_mapping->addMapping("Services/COPage", "pg", "prtt:" . $a_rec["Id"], "prtt:" . $newObj->getId());
             }
             break;
     }
 }
 /**
  * Build template from portfolio and vice versa
  * 
  * @param ilObjPortfolioBase $a_source
  * @param ilObjPortfolioBase $a_target
  * @param array $a_recipe
  */
 public static function clonePagesAndSettings(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target, array $a_recipe = null)
 {
     global $lng, $ilUser;
     $source_id = $a_source->getId();
     $target_id = $a_target->getId();
     if ($a_source instanceof ilObjPortfolioTemplate && $a_target instanceof ilObjPortfolio) {
         $direction = "t2p";
     } else {
         if ($a_source instanceof ilObjPortfolio && $a_target instanceof ilObjPortfolioTemplate) {
             $direction = "p2t";
         } else {
             return;
         }
     }
     self::cloneBasics($a_source, $a_target);
     // personal skills
     include_once "Services/Skill/classes/class.ilPersonalSkill.php";
     $pskills = array_keys(ilPersonalSkill::getSelectedUserSkills($ilUser->getId()));
     // copy pages
     $blog_count = 0;
     include_once "Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
     foreach (ilPortfolioPage::getAllPages($source_id) as $page) {
         $page_id = $page["id"];
         if ($direction == "t2p") {
             $source_page = new ilPortfolioTemplatePage($page_id);
             $target_page = new ilPortfolioPage();
         } else {
             $source_page = new ilPortfolioPage($page_id);
             $target_page = new ilPortfolioTemplatePage();
         }
         $source_page->setPortfolioId($source_id);
         $target_page->setPortfolioId($target_id);
         $page_type = $source_page->getType();
         $page_title = $source_page->getTitle();
         $page_recipe = null;
         if (is_array($a_recipe)) {
             $page_recipe = $a_recipe[$page_id];
         }
         $valid = false;
         switch ($page_type) {
             // blog => blog template
             case ilPortfolioTemplatePage::TYPE_BLOG:
                 if ($direction == "p2t") {
                     $page_type = ilPortfolioTemplatePage::TYPE_BLOG_TEMPLATE;
                     $page_title = $lng->txt("obj_blog") . " " . ++$blog_count;
                     $valid = true;
                 }
                 break;
                 // blog template => blog (needs recipe)
             // blog template => blog (needs recipe)
             case ilPortfolioTemplatePage::TYPE_BLOG_TEMPLATE:
                 if ($direction == "t2p" && is_array($page_recipe)) {
                     $page_type = ilPortfolioPage::TYPE_BLOG;
                     if ($page_recipe[0] == "blog") {
                         switch ($page_recipe[1]) {
                             case "create":
                                 $page_title = self::createBlogInPersonalWorkspace($page_recipe[2]);
                                 $valid = true;
                                 break;
                             case "reuse":
                                 $page_title = $page_recipe[2];
                                 $valid = true;
                                 break;
                             case "ignore":
                                 // do nothing
                                 break;
                         }
                     }
                 }
                 break;
                 // page editor
             // page editor
             default:
                 $target_page->setXMLContent($source_page->copyXmlContent(true));
                 // copy mobs
                 $target_page->buildDom(true);
                 // parse content / blocks
                 if ($direction == "t2p") {
                     $dom = $target_page->getDom();
                     if ($dom instanceof php4DOMDocument) {
                         $dom = $dom->myDOMDocument;
                     }
                     // update profile/consultation hours user id
                     self::updateDomNodes($dom, "//PageContent/Profile", "User", $ilUser->getId());
                     self::updateDomNodes($dom, "//PageContent/ConsultationHours", "User", $ilUser->getId());
                     self::updateDomNodes($dom, "//PageContent/MyCourses", "User", $ilUser->getId());
                     // skills
                     $xpath = new DOMXPath($dom);
                     $nodes = $xpath->query("//PageContent/Skills");
                     foreach ($nodes as $node) {
                         $skill_id = $node->getAttribute("Id");
                         // existing personal skills
                         if (in_array($skill_id, $pskills)) {
                             $node->setAttribute("User", $ilUser->getId());
                         } else {
                             if (in_array($skill_id, $a_recipe["skills"])) {
                                 include_once "Services/Skill/classes/class.ilPersonalSkill.php";
                                 ilPersonalSkill::addPersonalSkill($ilUser->getId(), $skill_id);
                                 $node->setAttribute("User", $ilUser->getId());
                             } else {
                                 $page_element = $node->parentNode;
                                 $page_element->parentNode->removeChild($page_element);
                             }
                         }
                     }
                 }
                 $valid = true;
                 break;
         }
         if ($valid) {
             // #12038 - update xml from dom
             $target_page->setXMLContent($target_page->getXMLFromDom());
             $target_page->setType($page_type);
             $target_page->setTitle($page_title);
             $target_page->create();
             if ($page_type == ilPortfolioPage::TYPE_PAGE) {
                 $target_page->update();
                 // handle mob usages!
             }
         }
     }
 }