ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilObjPortfolioBase.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 require_once "Services/Object/classes/class.ilObject2.php";
5 
14 abstract class ilObjPortfolioBase extends ilObject2
15 {
16 
20  public function __construct($a_id = 0, $a_reference = true)
21  {
22  global $DIC;
23  parent::__construct($a_id, $a_reference);
24 
25  $this->db = $DIC->database();
26  }
27 
28  protected $online; // [bool]
29  protected $comments; // [bool]
30  protected $bg_color; // [string]
31  protected $font_color; // [string]
32  protected $img; // [string]
33  protected $ppic; // [string]
34  protected $style; // [bool]
35 
36 
37  //
38  // PROPERTIES
39  //
40 
46  public function setOnline($a_value)
47  {
48  $this->online = (bool) $a_value;
49  }
50 
56  public function isOnline()
57  {
58  return $this->online;
59  }
60 
66  public static function lookupOnline($a_id)
67  {
68  global $DIC;
69 
70  $ilDB = $DIC->database();
71 
72  $set = $ilDB->query("SELECT is_online" .
73  " FROM usr_portfolio" .
74  " WHERE id = " . $ilDB->quote($a_id, "integer"));
75  $row = $ilDB->fetchAssoc($set);
76  return (bool) $row["is_online"];
77  }
78 
84  public function setPublicComments($a_value)
85  {
86  $this->comments = (bool) $a_value;
87  }
88 
94  public function hasPublicComments()
95  {
96  return $this->comments;
97  }
98 
104  public function hasProfilePicture()
105  {
106  return $this->ppic;
107  }
108 
114  public function setProfilePicture($a_status)
115  {
116  $this->ppic = (bool) $a_status;
117  }
118 
124  public function getBackgroundColor()
125  {
126  if (!$this->bg_color) {
127  $this->bg_color = "ffffff";
128  }
129  return $this->bg_color;
130  }
131 
137  public function setBackgroundColor($a_value)
138  {
139  $this->bg_color = (string) $a_value;
140  }
141 
147  public function getFontColor()
148  {
149  if (!$this->font_color) {
150  $this->font_color = "505050";
151  }
152  return $this->font_color;
153  }
154 
160  public function setFontColor($a_value)
161  {
162  $this->font_color = (string) $a_value;
163  }
164 
170  public function getImage()
171  {
172  return $this->img;
173  }
174 
180  public function setImage($a_value)
181  {
182  $this->img = (string) $a_value;
183  }
184 
190  public function getStyleSheetId()
191  {
192  return (int) $this->style;
193  }
194 
200  public function setStyleSheetId($a_style)
201  {
202  $this->style = (int) $a_style;
203  }
204 
205 
206  //
207  // CRUD
208  //
209 
210  protected function doRead()
211  {
212  $ilDB = $this->db;
213 
214  $set = $ilDB->query("SELECT * FROM usr_portfolio" .
215  " WHERE id = " . $ilDB->quote($this->id, "integer"));
216  $row = $ilDB->fetchAssoc($set);
217 
218  $this->setOnline((bool) $row["is_online"]);
219  $this->setProfilePicture((bool) $row["ppic"]);
220  $this->setBackgroundColor($row["bg_color"]);
221  $this->setFontColor($row["font_color"]);
222  $this->setImage($row["img"]);
223 
224  // #14661
225  include_once("./Services/Notes/classes/class.ilNote.php");
226  $this->setPublicComments(ilNote::commentsActivated($this->id, 0, $this->getType()));
227 
228  include_once("./Services/Style/Content/classes/class.ilObjStyleSheet.php");
230 
231  $this->doReadCustom($row);
232  }
233 
234  protected function doReadCustom(array $a_row)
235  {
236  }
237 
238  protected function doCreate()
239  {
240  $ilDB = $this->db;
241 
242  $ilDB->manipulate("INSERT INTO usr_portfolio (id,is_online)" .
243  " VALUES (" . $ilDB->quote($this->id, "integer") . "," .
244  $ilDB->quote(0, "integer") . ")");
245  }
246 
247  protected function doUpdate()
248  {
249  $ilDB = $this->db;
250 
251  $fields = array(
252  "is_online" => array("integer", $this->isOnline()),
253  "ppic" => array("integer", $this->hasProfilePicture()),
254  "bg_color" => array("text", $this->getBackgroundColor()),
255  "font_color" => array("text", $this->getFontcolor()),
256  "img" => array("text", $this->getImage())
257  );
258  $this->doUpdateCustom($fields);
259 
260  // #14661
261  include_once("./Services/Notes/classes/class.ilNote.php");
262  ilNote::activateComments($this->id, 0, $this->getType(), $this->hasPublicComments());
263 
264  include_once("./Services/Style/Content/classes/class.ilObjStyleSheet.php");
266 
267  $ilDB->update(
268  "usr_portfolio",
269  $fields,
270  array("id" => array("integer", $this->id))
271  );
272  }
273 
274  protected function doUpdateCustom(array &$a_fields)
275  {
276  }
277 
278  protected function doDelete()
279  {
280  $ilDB = $this->db;
281 
282  $this->deleteAllPages();
283  $this->deleteImage();
284 
285  $ilDB->manipulate("DELETE FROM usr_portfolio" .
286  " WHERE id = " . $ilDB->quote($this->id, "integer"));
287  }
288 
289  abstract protected function deleteAllPages();
290 
291 
292  //
293  // IMAGES
294  //
295 
301  public function getImageFullPath($a_as_thumb = false)
302  {
303  if ($this->img) {
304  $path = $this->initStorage($this->id);
305  if (!$a_as_thumb) {
306  return $path . $this->img;
307  } else {
308  return $path . "thb_" . $this->img;
309  }
310  }
311  }
312 
316  public function deleteImage()
317  {
318  if ($this->id) {
319  include_once "Modules/Portfolio/classes/class.ilFSStoragePortfolio.php";
320  $storage = new ilFSStoragePortfolio($this->id);
321  $storage->delete();
322 
323  $this->setImage(null);
324  }
325  }
326 
334  public static function initStorage($a_id, $a_subdir = null)
335  {
336  include_once "Modules/Portfolio/classes/class.ilFSStoragePortfolio.php";
337  $storage = new ilFSStoragePortfolio($a_id);
338  $storage->create();
339 
340  $path = $storage->getAbsolutePath() . "/";
341 
342  if ($a_subdir) {
343  $path .= $a_subdir . "/";
344 
345  if (!is_dir($path)) {
346  mkdir($path);
347  }
348  }
349 
350  return $path;
351  }
352 
359  public function uploadImage(array $a_upload)
360  {
361  if (!$this->id) {
362  return false;
363  }
364 
365  $this->deleteImage();
366 
367  // #10074
368  $clean_name = preg_replace("/[^a-zA-Z0-9\_\.\-]/", "", $a_upload["name"]);
369 
370  $path = $this->initStorage($this->id);
371  $original = "org_" . $this->id . "_" . $clean_name;
372  $thumb = "thb_" . $this->id . "_" . $clean_name;
373  $processed = $this->id . "_" . $clean_name;
374 
375  if (ilUtil::moveUploadedFile($a_upload["tmp_name"], $original, $path . $original)) {
376  chmod($path . $original, 0770);
377 
378  $prfa_set = new ilSetting("prfa");
379  /* as banner height should overflow, we only handle width
380  $dimensions = $prfa_set->get("banner_width")."x".
381  $prfa_set->get("banner_height");
382  */
383  $dimensions = $prfa_set->get("banner_width");
384 
385  // take quality 100 to avoid jpeg artefacts when uploading jpeg files
386  // taking only frame [0] to avoid problems with animated gifs
387  $original_file = ilUtil::escapeShellArg($path . $original);
388  $thumb_file = ilUtil::escapeShellArg($path . $thumb);
389  $processed_file = ilUtil::escapeShellArg($path . $processed);
390  ilUtil::execConvert($original_file . "[0] -geometry 100x100 -quality 100 JPEG:" . $thumb_file);
391  ilUtil::execConvert($original_file . "[0] -geometry " . $dimensions . " -quality 100 JPEG:" . $processed_file);
392 
393  $this->setImage($processed);
394 
395  return true;
396  }
397  return false;
398  }
399 
400 
401  //
402  // TRANSMOGRIFIER
403  //
404 
411  protected static function cloneBasics(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target)
412  {
413  // copy portfolio properties
414  $a_target->setPublicComments($a_source->hasPublicComments());
415  $a_target->setProfilePicture($a_source->hasProfilePicture());
416  $a_target->setFontColor($a_source->getFontColor());
417  $a_target->setBackgroundColor($a_source->getBackgroundColor());
418  $a_target->setImage($a_source->getImage());
419  $a_target->update();
420 
421  // banner/images
422  $source_dir = $a_source->initStorage($a_source->getId());
423  $target_dir = $a_target->initStorage($a_target->getId());
424  ilFSStoragePortfolio::_copyDirectory($source_dir, $target_dir);
425 
426  // set/copy stylesheet
427  include_once("./Services/Style/Content/classes/class.ilObjStyleSheet.php");
428  $style_id = $a_source->getStyleSheetId();
429  if ($style_id > 0 && !ilObjStyleSheet::_lookupStandard($style_id)) {
430  $style_obj = ilObjectFactory::getInstanceByObjId($style_id);
431  $new_id = $style_obj->ilClone();
432  $a_target->setStyleSheetId($new_id);
433  $a_target->update();
434  }
435  }
436 
444  public static function clonePagesAndSettings(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target, array $a_recipe = null, $copy_all = false)
445  {
446  global $DIC;
447 
448  $lng = $DIC->language();
449  $ilUser = $DIC->user();
450 
451  $source_id = $a_source->getId();
452  $target_id = $a_target->getId();
453 
454  if ($a_source instanceof ilObjPortfolioTemplate &&
455  $a_target instanceof ilObjPortfolio) {
456  $direction = "t2p";
457  } elseif ($a_source instanceof ilObjPortfolio &&
458  $a_target instanceof ilObjPortfolioTemplate) {
459  $direction = "p2t";
460  } else {
461  return;
462  }
463 
464  self::cloneBasics($a_source, $a_target);
465 
466  // personal skills
467  include_once "Services/Skill/classes/class.ilPersonalSkill.php";
468  $pskills = array_keys(ilPersonalSkill::getSelectedUserSkills($ilUser->getId()));
469 
470  // copy pages
471  $blog_count = 0;
472  include_once "Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
473  $page_map = array();
474  foreach (ilPortfolioPage::getAllPortfolioPages($source_id) as $page) {
475  $page_id = $page["id"];
476 
477  if ($direction == "t2p") {
478  $source_page = new ilPortfolioTemplatePage($page_id);
479  $target_page = new ilPortfolioPage();
480  } else {
481  $source_page = new ilPortfolioPage($page_id);
482  $target_page = new ilPortfolioTemplatePage();
483  }
484  $source_page->setPortfolioId($source_id);
485  $target_page->setPortfolioId($target_id);
486 
487  $page_type = $source_page->getType();
488  $page_title = $source_page->getTitle();
489 
490 
491 
492 
493  $page_recipe = null;
494  if (is_array($a_recipe)) {
495  $page_recipe = $a_recipe[$page_id];
496  }
497 
498  $valid = false;
499  switch ($page_type) {
500  // blog => blog template
502  if ($direction == "p2t") {
504  $page_title = $lng->txt("obj_blog") . " " . (++$blog_count);
505  $valid = true;
506  }
507  break;
508 
509  // blog template => blog (needs recipe)
511  if ($direction == "t2p" && (is_array($page_recipe) || $copy_all)) {
512  $page_type = ilPortfolioPage::TYPE_BLOG;
513  if ($copy_all) {
514  $page_title = self::createBlogInPersonalWorkspace($page_title);
515  $valid = true;
516  } else {
517  if ($page_recipe[0] == "blog") {
518  switch ($page_recipe[1]) {
519  case "create":
520  $page_title = self::createBlogInPersonalWorkspace($page_recipe[2]);
521  $valid = true;
522  break;
523 
524  case "reuse":
525  $page_title = $page_recipe[2];
526  $valid = true;
527  break;
528 
529  case "ignore":
530  // do nothing
531  break;
532  }
533  }
534  }
535  }
536  break;
537 
538  // page editor
539  default:
540  $target_page->setXMLContent($source_page->copyXmlContent(true)); // copy mobs
541  $target_page->buildDom(true);
542 
543 
544  // parse content / blocks
545 
546  if ($direction == "t2p") {
547  $dom = $target_page->getDom();
548  if ($dom instanceof php4DOMDocument) {
549  $dom = $dom->myDOMDocument;
550  }
551 
552  // update profile/consultation hours user id
553  self::updateDomNodes($dom, "//PageContent/Profile", "User", $ilUser->getId());
554  self::updateDomNodes($dom, "//PageContent/ConsultationHours", "User", $ilUser->getId());
555  self::updateDomNodes($dom, "//PageContent/MyCourses", "User", $ilUser->getId());
556 
557  // skills
558  $xpath = new DOMXPath($dom);
559  $nodes = $xpath->query("//PageContent/Skills");
560  foreach ($nodes as $node) {
561  $skill_id = $node->getAttribute("Id");
562 
563  // existing personal skills
564  if (in_array($skill_id, $pskills)) {
565  $node->setAttribute("User", $ilUser->getId());
566  }
567  // new skill
568  elseif ($copy_all || in_array($skill_id, $a_recipe["skills"])) {
569  include_once "Services/Skill/classes/class.ilPersonalSkill.php";
570  ilPersonalSkill::addPersonalSkill($ilUser->getId(), $skill_id);
571 
572  $node->setAttribute("User", $ilUser->getId());
573  }
574  // remove skill
575  else {
576  $page_element = $node->parentNode;
577  $page_element->parentNode->removeChild($page_element);
578  }
579  }
580  }
581 
582  $valid = true;
583  break;
584  }
585 
586  if ($valid) {
587  // #12038 - update xml from dom
588  $target_page->setXMLContent($target_page->getXMLFromDom());
589 
590  $target_page->setType($page_type);
591  $target_page->setTitle($page_title);
592  $target_page->create();
593 
594  if ($page_type == ilPortfolioPage::TYPE_PAGE) {
595  $target_page->update(); // handle mob usages!
596  }
597  $page_map[$source_page->getId()] = $target_page->getId();
598  }
599  }
600 
601  ilPortfolioPage::updateInternalLinks($page_map, $a_target);
602  }
603 
604  protected static function updateDomNodes($a_dom, $a_xpath, $a_attr_id, $a_attr_value)
605  {
606  $xpath_temp = new DOMXPath($a_dom);
607  $nodes = $xpath_temp->query($a_xpath);
608  foreach ($nodes as $node) {
609  $node->setAttribute($a_attr_id, $a_attr_value);
610  }
611  }
612 
613  protected static function createBlogInPersonalWorkspace($a_title)
614  {
615  global $DIC;
616 
617  $ilUser = $DIC->user();
618 
619  static $ws_access = null;
620 
621  include_once "Modules/Blog/classes/class.ilObjBlog.php";
622  $blog = new ilObjBlog();
623  $blog->setType("blog");
624  $blog->setTitle($a_title);
625  $blog->create();
626 
627  if (!$ws_access) {
628  include_once "Services/PersonalWorkspace/classes/class.ilWorkspaceTree.php";
629  include_once "Services/PersonalWorkspace/classes/class.ilWorkspaceAccessHandler.php";
630  $tree = new ilWorkspaceTree($ilUser->getId());
631 
632  // #13235
633  if (!$tree->getRootId()) {
634  $tree->createTreeForUser($ilUser->getId());
635  }
636 
637  $ws_access = new ilWorkspaceAccessHandler($tree);
638  }
639 
640  $tree = $ws_access->getTree();
641  $node_id = $tree->insertObject($tree->getRootId(), $blog->getId());
642  $ws_access->setPermissions($tree->getRootId(), $node_id);
643 
644  return $blog->getId();
645  }
646 
652  public function fixLinksOnTitleChange($a_title_changes)
653  {
654  foreach (ilPortfolioPage::getAllPortfolioPages($this->getId()) as $port_page) {
655  if ($this->getType() == "prtt") {
656  $page = new ilPortfolioTemplatePage($port_page["id"]);
657  } else {
658  $page = new ilPortfolioPage($port_page["id"]);
659  }
660  if ($page->renameLinksOnTitleChange($a_title_changes)) {
661  $page->update(true, true);
662  }
663  }
664  }
665 }
static getAllPortfolioPages($a_portfolio_id)
Get pages of portfolio.
static updateDomNodes($a_dom, $a_xpath, $a_attr_id, $a_attr_value)
$path
Definition: aliased.php:25
static commentsActivated($a_rep_obj_id, $a_obj_id, $a_obj_type, $a_news_id=0)
Are comments activated for object?
getStyleSheetId()
Get style sheet id.
setPublicComments($a_value)
Set public comments status.
global $DIC
Definition: saml.php:7
getImageFullPath($a_as_thumb=false)
Get banner image incl.
deleteImage()
remove existing file
$valid
static initStorage($a_id, $a_subdir=null)
Init file system storage.
setFontColor($a_value)
Set font color.
"color:#CC0000 style
Definition: example_001.php:92
Access handler for personal workspace.
$target_id
Definition: goto.php:49
static createBlogInPersonalWorkspace($a_title)
static getSelectedUserSkills($a_user_id)
Get personal selected user skills.
hasProfilePicture()
Get profile picture status.
static clonePagesAndSettings(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target, array $a_recipe=null, $copy_all=false)
Build template from portfolio and vice versa.
getBackgroundColor()
Get background color.
__construct($a_id=0, $a_reference=true)
Constructor.
getFontColor()
Get font color.
static lookupObjectStyle($a_obj_id)
Lookup object style.
Tree handler for personal workspace.
static updateInternalLinks($a_copied_nodes, ilObjPortfolioBase $a_target_obj)
Update internal links, after multiple pages have been copied.
setOnline($a_value)
Set online status.
static cloneBasics(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target)
Clone basic settings.
static _lookupStandard($a_id)
Lookup standard flag.
static _copyDirectory($a_source, $a_target)
Copy directory and all contents.
static writeStyleUsage($a_obj_id, $a_style_id)
Write style usage.
uploadImage(array $a_upload)
Upload new image file.
static lookupOnline($a_id)
Is online?
static execConvert($args)
execute convert command
Class ilObjBlog.
static addPersonalSkill($a_user_id, $a_skill_node_id)
Add personal skill.
$ilUser
Definition: imgupload.php:18
Page for user portfolio.
Page for portfolio template.
hasPublicComments()
Active public comments?
static getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
$row
getImage()
Get banner image.
setStyleSheetId($a_style)
Set style sheet id.
static activateComments($a_rep_obj_id, $a_obj_id, $a_obj_type, $a_activate=true)
Activate notes feature.
static escapeShellArg($a_arg)
global $ilDB
setBackgroundColor($a_value)
Set background color.
doUpdateCustom(array &$a_fields)
fixLinksOnTitleChange($a_title_changes)
Fix internal portfolio links.
setImage($a_value)
Set banner image.
setProfilePicture($a_status)
Toggle profile picture status.