ILIAS  release_4-4 Revision
All Data Structures Namespaces Files Functions Variables Modules Pages
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  protected $online; // [bool]
17  protected $comments; // [bool]
18  protected $bg_color; // [string]
19  protected $font_color; // [string]
20  protected $img; // [string]
21  protected $ppic; // [string]
22  protected $style; // [bool]
23 
24 
25  //
26  // PROPERTIES
27  //
28 
34  function setOnline($a_value)
35  {
36  $this->online = (bool)$a_value;
37  }
38 
44  function isOnline()
45  {
46  return $this->online;
47  }
48 
54  public static function lookupOnline($a_id)
55  {
56  global $ilDB;
57 
58  $set = $ilDB->query("SELECT is_online".
59  " FROM usr_portfolio".
60  " WHERE id = ".$ilDB->quote($a_id, "integer"));
61  $row = $ilDB->fetchAssoc($set);
62  return (bool)$row["is_online"];
63  }
64 
70  function setPublicComments($a_value)
71  {
72  $this->comments = (bool)$a_value;
73  }
74 
80  function hasPublicComments()
81  {
82  return $this->comments;
83  }
84 
90  function hasProfilePicture()
91  {
92  return $this->ppic;
93  }
94 
100  function setProfilePicture($a_status)
101  {
102  $this->ppic = (bool)$a_status;
103  }
104 
111  {
112  if(!$this->bg_color)
113  {
114  $this->bg_color = "ffffff";
115  }
116  return $this->bg_color;
117  }
118 
124  function setBackgroundColor($a_value)
125  {
126  $this->bg_color = (string)$a_value;
127  }
128 
134  function getFontColor()
135  {
136  if(!$this->font_color)
137  {
138  $this->font_color = "505050";
139  }
140  return $this->font_color;
141  }
142 
148  function setFontColor($a_value)
149  {
150  $this->font_color = (string)$a_value;
151  }
152 
158  function getImage()
159  {
160  return $this->img;
161  }
162 
168  function setImage($a_value)
169  {
170  $this->img = (string)$a_value;
171  }
172 
178  function getStyleSheetId()
179  {
180  return (int)$this->style;
181  }
182 
188  function setStyleSheetId($a_style)
189  {
190  $this->style = (int)$a_style;
191  }
192 
193 
194  //
195  // CRUD
196  //
197 
198  protected function doRead()
199  {
200  global $ilDB;
201 
202  $set = $ilDB->query("SELECT * FROM usr_portfolio".
203  " WHERE id = ".$ilDB->quote($this->id, "integer"));
204  $row = $ilDB->fetchAssoc($set);
205 
206  $this->setOnline((bool)$row["is_online"]);
207  $this->setPublicComments((bool)$row["comments"]);
208  $this->setProfilePicture((bool)$row["ppic"]);
209  $this->setBackgroundColor($row["bg_color"]);
210  $this->setFontColor($row["font_color"]);
211  $this->setImage($row["img"]);
212 
213  include_once("./Services/Style/classes/class.ilObjStyleSheet.php");
215 
216  $this->doReadCustom($row);
217  }
218 
219  protected function doReadCustom(array $a_row)
220  {
221 
222  }
223 
224  protected function doCreate()
225  {
226  global $ilDB;
227 
228  $ilDB->manipulate("INSERT INTO usr_portfolio (id,is_online)".
229  " VALUES (".$ilDB->quote($this->id, "integer").",".
230  $ilDB->quote(0, "integer").")");
231  }
232 
233  protected function doUpdate()
234  {
235  global $ilDB;
236 
237  $fields = array(
238  "is_online" => array("integer", $this->isOnline()),
239  "comments" => array("integer", $this->hasPublicComments()),
240  "ppic" => array("integer", $this->hasProfilePicture()),
241  "bg_color" => array("text", $this->getBackgroundColor()),
242  "font_color" => array("text", $this->getFontcolor()),
243  "img" => array("text", $this->getImage())
244  );
245  $this->doUpdateCustom($fields);
246 
247  include_once("./Services/Style/classes/class.ilObjStyleSheet.php");
249 
250  $ilDB->update("usr_portfolio", $fields,
251  array("id"=>array("integer", $this->id)));
252  }
253 
254  protected function doUpdateCustom(array &$a_fields)
255  {
256 
257  }
258 
259  protected function doDelete()
260  {
261  global $ilDB;
262 
263  $this->deleteAllPages();
264  $this->deleteImage();
265 
266  $ilDB->manipulate("DELETE FROM usr_portfolio".
267  " WHERE id = ".$ilDB->quote($this->id, "integer"));
268  }
269 
270  abstract protected function deleteAllPages();
271 
272 
273  //
274  // IMAGES
275  //
276 
282  function getImageFullPath($a_as_thumb = false)
283  {
284  if($this->img)
285  {
286  $path = $this->initStorage($this->id);
287  if(!$a_as_thumb)
288  {
289  return $path.$this->img;
290  }
291  else
292  {
293  return $path."thb_".$this->img;
294  }
295  }
296  }
297 
301  public function deleteImage()
302  {
303  if($this->id)
304  {
305  include_once "Modules/Portfolio/classes/class.ilFSStoragePortfolio.php";
306  $storage = new ilFSStoragePortfolio($this->id);
307  $storage->delete();
308 
309  $this->setImage(null);
310  }
311  }
312 
320  public static function initStorage($a_id, $a_subdir = null)
321  {
322  include_once "Modules/Portfolio/classes/class.ilFSStoragePortfolio.php";
323  $storage = new ilFSStoragePortfolio($a_id);
324  $storage->create();
325 
326  $path = $storage->getAbsolutePath()."/";
327 
328  if($a_subdir)
329  {
330  $path .= $a_subdir."/";
331 
332  if(!is_dir($path))
333  {
334  mkdir($path);
335  }
336  }
337 
338  return $path;
339  }
340 
347  function uploadImage(array $a_upload)
348  {
349  if(!$this->id)
350  {
351  return false;
352  }
353 
354  $this->deleteImage();
355 
356  // #10074
357  $clean_name = preg_replace("/[^a-zA-Z0-9\_\.\-]/", "", $a_upload["name"]);
358 
359  $path = $this->initStorage($this->id);
360  $original = "org_".$this->id."_".$clean_name;
361  $thumb = "thb_".$this->id."_".$clean_name;
362  $processed = $this->id."_".$clean_name;
363 
364  if(@move_uploaded_file($a_upload["tmp_name"], $path.$original))
365  {
366  chmod($path.$original, 0770);
367 
368  $prfa_set = new ilSetting("prfa");
369  $dimensions = $prfa_set->get("banner_width")."x".
370  $prfa_set->get("banner_height");
371 
372  // take quality 100 to avoid jpeg artefacts when uploading jpeg files
373  // taking only frame [0] to avoid problems with animated gifs
374  $original_file = ilUtil::escapeShellArg($path.$original);
375  $thumb_file = ilUtil::escapeShellArg($path.$thumb);
376  $processed_file = ilUtil::escapeShellArg($path.$processed);
377  ilUtil::execConvert($original_file."[0] -geometry 100x100 -quality 100 JPEG:".$thumb_file);
378  ilUtil::execConvert($original_file."[0] -geometry ".$dimensions."! -quality 100 JPEG:".$processed_file);
379 
380  $this->setImage($processed);
381 
382  return true;
383  }
384  return false;
385  }
386 
387 
388  //
389  // TRANSMOGRIFIER
390  //
391 
398  protected static function cloneBasics(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target)
399  {
400  // copy portfolio properties
401  $a_target->setPublicComments($a_source->hasPublicComments());
402  $a_target->setProfilePicture($a_source->hasProfilePicture());
403  $a_target->setFontColor($a_source->getFontColor());
404  $a_target->setBackgroundColor($a_source->getBackgroundColor());
405  $a_target->setImage($a_source->getImage());
406  $a_target->update();
407 
408  // banner/images
409  $source_dir = $a_source->initStorage($a_source->getId());
410  $target_dir = $a_target->initStorage($a_target->getId());
411  ilFSStoragePortfolio::_copyDirectory($source_dir, $target_dir);
412 
413  // set/copy stylesheet
414  include_once("./Services/Style/classes/class.ilObjStyleSheet.php");
415  $style_id = $a_source->getStyleSheetId();
416  if ($style_id > 0 && !ilObjStyleSheet::_lookupStandard($style_id))
417  {
418  $style_obj = ilObjectFactory::getInstanceByObjId($style_id);
419  $new_id = $style_obj->ilClone();
420  $a_target->setStyleSheetId($new_id);
421  $a_target->update();
422  }
423  }
424 
432  public static function clonePagesAndSettings(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target, array $a_recipe = null)
433  {
434  global $lng, $ilUser;
435 
436  $source_id = $a_source->getId();
437  $target_id = $a_target->getId();
438 
439  if($a_source instanceof ilObjPortfolioTemplate &&
440  $a_target instanceof ilObjPortfolio)
441  {
442  $direction = "t2p";
443  }
444  else if($a_source instanceof ilObjPortfolio &&
445  $a_target instanceof ilObjPortfolioTemplate)
446  {
447  $direction = "p2t";
448  }
449  else
450  {
451  return;
452  }
453 
454  self::cloneBasics($a_source, $a_target);
455 
456  // personal skills
457  include_once "Services/Skill/classes/class.ilPersonalSkill.php";
458  $pskills = array_keys(ilPersonalSkill::getSelectedUserSkills($ilUser->getId()));
459 
460  // copy pages
461  $blog_count = 0;
462  include_once "Modules/Portfolio/classes/class.ilPortfolioTemplatePage.php";
463  foreach(ilPortfolioPage::getAllPages($source_id) as $page)
464  {
465  $page_id = $page["id"];
466 
467  if($direction == "t2p")
468  {
469  $source_page = new ilPortfolioTemplatePage($page_id);
470  $target_page = new ilPortfolioPage();
471  }
472  else
473  {
474  $source_page = new ilPortfolioPage($page_id);
475  $target_page = new ilPortfolioTemplatePage();
476  }
477  $source_page->setPortfolioId($source_id);
478  $target_page->setPortfolioId($target_id);
479 
480  $page_type = $source_page->getType();
481  $page_title = $source_page->getTitle();
482 
483 
484 
485 
486  $page_recipe = null;
487  if(is_array($a_recipe))
488  {
489  $page_recipe = $a_recipe[$page_id];
490  }
491 
492  $valid = false;
493  switch($page_type)
494  {
495  // blog => blog template
497  if($direction == "p2t")
498  {
500  $page_title = $lng->txt("obj_blog")." ".(++$blog_count);
501  $valid = true;
502  }
503  break;
504 
505  // blog template => blog (needs recipe)
507  if($direction == "t2p" && is_array($page_recipe))
508  {
509  $page_type = ilPortfolioPage::TYPE_BLOG;
510  if($page_recipe[0] == "blog")
511  {
512  switch($page_recipe[1])
513  {
514  case "create":
515  $page_title = self::createBlogInPersonalWorkspace($page_recipe[2]);
516  $valid = true;
517  break;
518 
519  case "reuse":
520  $page_title = $page_recipe[2];
521  $valid = true;
522  break;
523 
524  case "ignore":
525  // do nothing
526  break;
527  }
528  }
529  }
530  break;
531 
532  // page editor
533  default:
534  $target_page->setXMLContent($source_page->copyXmlContent(true)); // copy mobs
535  $target_page->buildDom(true);
536 
537 
538  // parse content / blocks
539 
540  if($direction == "t2p")
541  {
542  $dom = $target_page->getDom();
543  if($dom instanceof php4DOMDocument)
544  {
545  $dom = $dom->myDOMDocument;
546  }
547 
548  // update profile/consultation hours user id
549  self::updateDomNodes($dom, "//PageContent/Profile", "User", $ilUser->getId());
550  self::updateDomNodes($dom, "//PageContent/ConsultationHours", "User", $ilUser->getId());
551 
552  // skills
553  $xpath = new DOMXPath($dom);
554  $nodes = $xpath->query("//PageContent/Skills");
555  foreach($nodes as $node)
556  {
557  $skill_id = $node->getAttribute("Id");
558 
559  // existing personal skills
560  if(in_array($skill_id, $pskills))
561  {
562  $node->setAttribute("User", $ilUser->getId());
563  }
564  // new skill
565  else if(in_array($skill_id, $a_recipe["skills"]))
566  {
567  include_once "Services/Skill/classes/class.ilPersonalSkill.php";
568  ilPersonalSkill::addPersonalSkill($ilUser->getId(), $skill_id);
569 
570  $node->setAttribute("User", $ilUser->getId());
571  }
572  // remove skill
573  else
574  {
575  $page_element = $node->parentNode;
576  $page_element->parentNode->removeChild($page_element);
577  }
578  }
579  }
580 
581  $valid = true;
582  break;
583  }
584 
585  if($valid)
586  {
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  {
596  $target_page->update(); // handle mob usages!
597  }
598  }
599  }
600  }
601 
602  protected static function updateDomNodes($a_dom, $a_xpath, $a_attr_id, $a_attr_value)
603  {
604  $xpath_temp = new DOMXPath($a_dom);
605  $nodes = $xpath_temp->query($a_xpath);
606  foreach ($nodes as $node)
607  {
608  $node->setAttribute($a_attr_id, $a_attr_value);
609  }
610  }
611 
612  protected static function createBlogInPersonalWorkspace($a_title)
613  {
614  global $ilUser;
615 
616  static $ws_access = null;
617 
618  include_once "Modules/Blog/classes/class.ilObjBlog.php";
619  $blog = new ilObjBlog();
620  $blog->setType("blog");
621  $blog->setTitle($a_title);
622  $blog->create();
623 
624  if(!$ws_access)
625  {
626  include_once "Services/PersonalWorkspace/classes/class.ilWorkspaceTree.php";
627  include_once "Services/PersonalWorkspace/classes/class.ilWorkspaceAccessHandler.php";
628  $tree = new ilWorkspaceTree($ilUser->getId());
629 
630  // #13235
631  if(!$tree->getRootId())
632  {
633  $tree->createTreeForUser($ilUser->getId());
634  }
635 
636  $ws_access = new ilWorkspaceAccessHandler($tree);
637  }
638 
639  $tree = $ws_access->getTree();
640  $node_id = $tree->insertObject($tree->getRootId(), $blog->getId());
641  $ws_access->setPermissions($tree->getRootId(), $node_id);
642 
643  return $blog->getId();
644  }
645 }
646 
647 ?>
ILIAS Setting Class.
static updateDomNodes($a_dom, $a_xpath, $a_attr_id, $a_attr_value)
getStyleSheetId()
Get style sheet id.
setPublicComments($a_value)
Set public comments status.
createTreeForUser($a_user_id)
Create personal workspace tree for user.
getImageFullPath($a_as_thumb=false)
Get banner image incl.
deleteImage()
remove existing file
_copyDirectory($a_source, $a_target)
Copy directory and all contents.
$valid
static initStorage($a_id, $a_subdir=null)
Init file system storage.
setFontColor($a_value)
Set font color.
static clonePagesAndSettings(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target, array $a_recipe=null)
Build template from portfolio and vice versa.
Access handler for personal workspace.
$target_id
Definition: goto.php:88
static createBlogInPersonalWorkspace($a_title)
static getSelectedUserSkills($a_user_id)
Get personal selected user skills.
hasProfilePicture()
Get profile picture status.
getBackgroundColor()
Get background color.
addPersonalSkill($a_user_id, $a_skill_node_id)
Add personal skill.
getFontColor()
Get font color.
static lookupObjectStyle($a_obj_id)
Lookup object style.
Tree handler for personal workspace.
setOnline($a_value)
Set online status.
static cloneBasics(ilObjPortfolioBase $a_source, ilObjPortfolioBase $a_target)
Clone basic settings.
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.
Page for user portfolio.
Page for portfolio template.
getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
hasPublicComments()
Active public comments?
getImage()
Get banner image.
static getAllPages($a_portfolio_id)
Get pages of portfolio.
_lookupStandard($a_id)
Lookup standard flag.
setStyleSheetId($a_style)
Set style sheet id.
global $ilUser
Definition: imgupload.php:15
static escapeShellArg($a_arg)
$path
Definition: index.php:22
setBackgroundColor($a_value)
Set background color.
Class ilObject2 This is an intermediate progress of ilObject class.
doUpdateCustom(array &$a_fields)
setImage($a_value)
Set banner image.
setProfilePicture($a_status)
Toggle profile picture status.