ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilCourseObjectiveMaterials.php
Go to the documentation of this file.
1 <?php
2 /*
3  +-----------------------------------------------------------------------------+
4  | ILIAS open source |
5  +-----------------------------------------------------------------------------+
6  | Copyright (c) 1998-2001 ILIAS open source, University of Cologne |
7  | |
8  | This program is free software; you can redistribute it and/or |
9  | modify it under the terms of the GNU General Public License |
10  | as published by the Free Software Foundation; either version 2 |
11  | of the License, or (at your option) any later version. |
12  | |
13  | This program is distributed in the hope that it will be useful, |
14  | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16  | GNU General Public License for more details. |
17  | |
18  | You should have received a copy of the GNU General Public License |
19  | along with this program; if not, write to the Free Software |
20  | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21  +-----------------------------------------------------------------------------+
22 */
23 
24 
34 {
35  public $db = null;
36 
37  public $objective_id = null;
38  public $lms;
39 
40  public function __construct($a_objective_id)
41  {
42  global $DIC;
43 
44  $ilDB = $DIC['ilDB'];
45 
46  $this->db = &$ilDB;
47 
48  $this->objective_id = $a_objective_id;
49 
50  $this->__read();
51  }
52 
62  public function cloneDependencies($a_new_objective, $a_copy_id)
63  {
64  global $DIC;
65 
66  $ilObjDataCache = $DIC['ilObjDataCache'];
67  $ilLog = $DIC['ilLog'];
68 
69  include_once('Services/CopyWizard/classes/class.ilCopyWizardOptions.php');
70  $cwo = ilCopyWizardOptions::_getInstance($a_copy_id);
71  $mappings = $cwo->getMappings();
72  #$ilLog->write(__METHOD__.': 1');
73  foreach ($this->getMaterials() as $material) {
74  #$ilLog->write(__METHOD__.': 2');
75  // Copy action omit ?
76  if (!isset($mappings[$material['ref_id']]) or !$mappings[$material['ref_id']]) {
77  continue;
78  }
79  #$ilLog->write(__METHOD__.': 3');
80  $material_ref_id = $material['ref_id'];
81  $material_rbac_obj_id = $ilObjDataCache->lookupObjId($material_ref_id);
82  $material_obj_id = $material['obj_id'];
83  $new_ref_id = $mappings[$material_ref_id];
84  $new_rbac_obj_id = $ilObjDataCache->lookupObjId($new_ref_id);
85  #$ilLog->write(__METHOD__.': 4');
86 
87  // Link
88  if ($new_rbac_obj_id == $material_rbac_obj_id) {
89  #$ilLog->write(__METHOD__.': 5');
90  $ilLog->write(__METHOD__ . ': Material has been linked. Keeping object id.');
91  $new_obj_id = $material_obj_id;
92  } elseif ($material['type'] == 'st' or $material['type'] == 'pg') {
93 
94  #$GLOBALS['DIC']['ilLog']->write(__METHOD__.': '.print_r($material,TRUE));
95  #$GLOBALS['DIC']['ilLog']->write(__METHOD__.': '.print_r($mappings,TRUE));
96 
97  #$ilLog->write(__METHOD__.': 6');
98  // Chapter assignment
99  $new_material_info = isset($mappings[$material_ref_id . '_' . $material_obj_id]) ?
100  $mappings[$material_ref_id . '_' . $material_obj_id] :
101  '';
102  $new_material_arr = explode('_', $new_material_info);
103  if (!isset($new_material_arr[1]) or !$new_material_arr[1]) {
104  $ilLog->write(__METHOD__ . ': No mapping found for chapter: ' . $material_obj_id);
105  continue;
106  }
107  $new_obj_id = $new_material_arr[1];
108  $ilLog->write(__METHOD__ . ': New material id is: ' . $new_obj_id);
109  } else {
110  #$ilLog->write(__METHOD__.': 7');
111  // Any type
112  $new_obj_id = $ilObjDataCache->lookupObjId($mappings[$material_ref_id]);
113  }
114 
115  #$ilLog->write(__METHOD__.': 8');
116  $new_material = new ilCourseObjectiveMaterials($a_new_objective);
117  #$ilLog->write(__METHOD__.': 8.1');
118  $new_material->setLMRefId($new_ref_id);
119  #$ilLog->write(__METHOD__.': 8.2');
120  $new_material->setLMObjId($new_obj_id);
121  #$ilLog->write(__METHOD__.': 8.3');
122  $new_material->setType($material['type']);
123  #$ilLog->write(__METHOD__.': 8.4');
124  $new_material->add();
125  #$ilLog->write(__METHOD__.': 9');
126  }
127  }
128 
137  public static function _getAssignedMaterials($a_objective_id)
138  {
139  global $DIC;
140 
141  $ilDB = $DIC['ilDB'];
142 
143  $query = "SELECT DISTINCT(ref_id) ref_id FROM crs_objective_lm " .
144  "WHERE objective_id = " . $ilDB->quote($a_objective_id, 'integer');
145  $res = $ilDB->query($query);
146  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
147  $ref_ids[] = $row->ref_id;
148  }
149  return $ref_ids ? $ref_ids : array();
150  }
151 
152 
153 
164  public static function _getAssignableMaterials($a_container_id)
165  {
166  global $DIC;
167 
168  $tree = $DIC['tree'];
169  $ilDB = $DIC['ilDB'];
170 
171  $container_obj_id = ilObject::_lookupObjId($a_container_id);
172 
173  $all_materials = $tree->getSubTree($tree->getNodeData($a_container_id), true);
174  $all_materials = ilUtil::sortArray($all_materials, 'title', 'asc');
175 
176  // Filter
177  foreach ($all_materials as $material) {
178  switch ($material['type']) {
179  case 'tst':
180 
181  include_once './Modules/Course/classes/class.ilCourseObjectiveMaterials.php';
182  $type = ilLOTestAssignments::getInstance($container_obj_id)->getTypeByTest($material['child']);
184  break;
185  } else {
186  $assignable[] = $material;
187  }
188  break;
189 
190  case 'crs':
191  case 'rolf':
192  case 'itgr':
193  break;
194 
195  default:
196  $assignable[] = $material;
197  break;
198  }
199  }
200  return $assignable ? $assignable : array();
201  }
202 
211  public static function _getAllAssignedMaterials($a_container_id)
212  {
213  global $DIC;
214 
215  $ilDB = $DIC['ilDB'];
216 
217  $query = "SELECT DISTINCT(com.ref_id) ref_id FROM crs_objectives co " .
218  "JOIN crs_objective_lm com ON co.objective_id = com.objective_id " .
219  "JOIN object_reference obr ON com.ref_id = obr.ref_id " .
220  "JOIN object_data obd ON obr.obj_id = obd.obj_id " .
221  "WHERE co.crs_id = " . $ilDB->quote($a_container_id, 'integer') . " " .
222  "ORDER BY obd.title ";
223 
224  $res = $ilDB->query($query);
225  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
226  $ref_ids[] = $row->ref_id;
227  }
228  return $ref_ids ? $ref_ids : array();
229  }
230 
231  public function getMaterials()
232  {
233  return $this->lms ? $this->lms : array();
234  }
235 
236  public function getChapters()
237  {
238  foreach ($this->lms as $lm_data) {
239  if ($lm_data['type'] == 'st') {
240  $chapters[] = $lm_data;
241  }
242  if ($lm_data['type'] == 'pg') {
243  $chapters[] = $lm_data;
244  }
245  }
246  return $chapters ? $chapters : array();
247  }
248 
249  public function getLM($lm_id)
250  {
251  return $this->lms[$lm_id] ? $this->lms[$lm_id] : array();
252  }
253 
254  public function getObjectiveId()
255  {
256  return $this->objective_id;
257  }
258 
259  public function setLMRefId($a_ref_id)
260  {
261  $this->lm_ref_id = $a_ref_id;
262  }
263  public function getLMRefId()
264  {
265  return $this->lm_ref_id ? $this->lm_ref_id : 0;
266  }
267  public function setLMObjId($a_obj_id)
268  {
269  $this->lm_obj_id = $a_obj_id;
270  }
271  public function getLMObjId()
272  {
273  return $this->lm_obj_id ? $this->lm_obj_id : 0;
274  }
275  public function setType($a_type)
276  {
277  $this->type = $a_type;
278  }
279  public function getType()
280  {
281  return $this->type;
282  }
283 
292  public function isAssigned($a_ref_id, $a_get_id = false)
293  {
294  global $DIC;
295 
296  $ilDB = $DIC['ilDB'];
297 
298  $query = "SELECT * FROM crs_objective_lm " .
299  "WHERE ref_id = " . $this->db->quote($a_ref_id, 'integer') . " " .
300  "AND objective_id = " . $this->db->quote($this->getObjectiveId(), 'integer') . " " .
301  "AND type != 'st' AND type != 'pg' ";
302  $res = $this->db->query($query);
303 
304  // begin-patch lok
305  if (!$a_get_id) {
306  return $res->numRows() ? true : false;
307  } else {
308  $row = $this->db->fetchAssoc($res);
309  return $row["lm_ass_id"];
310  }
311  // end-patch lok
312  }
313 
322  public function isChapterAssigned($a_ref_id, $a_obj_id)
323  {
324  global $DIC;
325 
326  $ilDB = $DIC['ilDB'];
327 
328  $query = "SELECT * FROM crs_objective_lm " .
329  "WHERE ref_id = " . $this->db->quote($a_ref_id, 'integer') . " " .
330  "AND obj_id = " . $this->db->quote($a_obj_id, 'integer') . " " .
331  "AND objective_id = " . $this->db->quote($this->getObjectiveId(), 'integer') . " " .
332  "AND (type = 'st' OR type = 'pg')";
333  $res = $this->db->query($query);
334  return $res->numRows() ? true : false;
335  }
336  public function checkExists()
337  {
338  global $DIC;
339 
340  $ilDB = $DIC['ilDB'];
341 
342  if ($this->getLMObjId()) {
343  $query = "SELECT * FROM crs_objective_lm " .
344  "WHERE objective_id = " . $ilDB->quote($this->getObjectiveId(), 'integer') . " " .
345  "AND ref_id = " . $ilDB->quote($this->getLMRefId(), 'integer') . " " .
346  "AND obj_id = " . $ilDB->quote($this->getLMObjId(), 'integer') . " ";
347  } else {
348  $query = "SELECT * FROM crs_objective_lm " .
349  "WHERE objective_id = " . $ilDB->quote($this->getObjectiveId(), 'integer') . " " .
350  "AND ref_id = " . $ilDB->quote($this->getLMRefId(), 'integer') . " ";
351  }
352 
353  $res = $this->db->query($query);
354 
355  return $res->numRows() ? true : false;
356  }
357 
358  public function add()
359  {
360  global $DIC;
361 
362  $ilDB = $DIC['ilDB'];
363 
364  $next_id = $ilDB->nextId('crs_objective_lm');
365  $query = "INSERT INTO crs_objective_lm (lm_ass_id,objective_id,ref_id,obj_id,type) " .
366  "VALUES( " .
367  $ilDB->quote($next_id, 'integer') . ", " .
368  $ilDB->quote($this->getObjectiveId(), 'integer') . ", " .
369  $ilDB->quote($this->getLMRefId(), 'integer') . ", " .
370  $ilDB->quote($this->getLMObjId(), 'integer') . ", " .
371  $ilDB->quote($this->getType(), 'text') .
372  ")";
373  $res = $ilDB->manipulate($query);
374 
375  return (int) $next_id;
376  }
377  public function delete($lm_id)
378  {
379  global $DIC;
380 
381  $ilDB = $DIC['ilDB'];
382 
383  if (!$lm_id) {
384  return false;
385  }
386 
387  $query = "DELETE FROM crs_objective_lm " .
388  "WHERE lm_ass_id = " . $ilDB->quote($lm_id, 'integer') . " ";
389  $res = $ilDB->manipulate($query);
390 
391  return true;
392  }
393 
394  public function deleteAll()
395  {
396  global $DIC;
397 
398  $ilDB = $DIC['ilDB'];
399 
400  $query = "DELETE FROM crs_objective_lm " .
401  "WHERE objective_id = " . $ilDB->quote($this->getObjectiveId(), 'integer') . " ";
402  $res = $ilDB->manipulate($query);
403  return true;
404  }
405 
406  // begin-patch lok
407 
415  public function writePosition($a_ass_id, $a_position)
416  {
417  global $DIC;
418 
419  $ilDB = $DIC['ilDB'];
420 
421  $query = "UPDATE crs_objective_lm " .
422  "SET position = " . $this->db->quote((string) $a_position, 'integer') . " " .
423  "WHERE objective_id = " . $this->db->quote($this->getObjectiveId(), 'integer') . " " .
424  "AND lm_ass_id = " . $ilDB->quote($a_ass_id, "integer");
425  $res = $ilDB->manipulate($query);
426  }
427 
428  // end-patch lok
429 
430  // PRIVATE
431  public function __read()
432  {
433  global $DIC;
434 
435  $tree = $DIC['tree'];
436  $ilDB = $DIC['ilDB'];
437 
438  include_once('Modules/Course/classes/class.ilCourseObjective.php');
439  $container_ref_ids = ilObject::_getAllReferences(ilCourseObjective::_lookupContainerIdByObjectiveId($this->objective_id));
440  $container_ref_id = current($container_ref_ids);
441 
442  // begin-patch lok
443 
444  $this->lms = array();
445  $query = "SELECT position,lm_ass_id,lm.ref_id,lm.obj_id,lm.type FROM crs_objective_lm lm " .
446  "JOIN object_reference obr ON lm.ref_id = obr.ref_id " .
447  "JOIN object_data obd ON obr.obj_id = obd.obj_id " .
448  "LEFT JOIN lm_data lmd ON lmd.obj_id = lm.obj_id " .
449  "WHERE objective_id = " . $ilDB->quote($this->getObjectiveId(), 'integer') . " " .
450  "ORDER BY position,obd.title,lmd.title";
451 
452  $res = $this->db->query($query);
453  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
454  if (!$tree->isInTree($row->ref_id) or !$tree->isGrandChild($container_ref_id, $row->ref_id)) {
455  $this->delete($row->lm_ass_id);
456  continue;
457  }
458  $lm['ref_id'] = $row->ref_id;
459  $lm['obj_id'] = $row->obj_id;
460  $lm['type'] = $row->type;
461  $lm['lm_ass_id'] = $row->lm_ass_id;
462  $lm['position'] = $row->position;
463 
464  $this->lms[$row->lm_ass_id] = $lm;
465  }
466 
467  // end-patch lok
468 
469  return true;
470  }
471 
472  // begin-patch optes_lok_export
473 
478  public function toXml(ilXmlWriter $writer)
479  {
480  foreach ($this->getMaterials() as $material) {
481  $writer->xmlElement(
482  'Material',
483  array(
484  'refId' => $material['ref_id'],
485  'objId' => $material['obj_id'],
486  'type' => $material['type'],
487  'position' => $material['position']
488  )
489  );
490  }
491  return true;
492  }
493 }
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static getInstance($a_container_id)
Get instance by container id.
static _lookupContainerIdByObjectiveId($a_objective_id)
Get container of object.
writePosition($a_ass_id, $a_position)
write position
$type
global $DIC
Definition: saml.php:7
XML writer class.
isAssigned($a_ref_id, $a_get_id=false)
Check if material is assigned.
static _getAllReferences($a_id)
get all reference ids of object
$a_type
Definition: workflow.php:92
class ilCourseObjectiveMaterials
static _getInstance($a_copy_id)
Get instance of copy wizard options.
foreach($_POST as $key=> $value) $res
static _getAllAssignedMaterials($a_container_id)
Get all assigned materials.
static _lookupObjId($a_id)
$query
isChapterAssigned($a_ref_id, $a_obj_id)
Check if chapter is assigned.
static _getAssignedMaterials($a_objective_id)
get assigned materials
$row
xmlElement($tag, $attrs=null, $data=null, $encode=true, $escape=true)
Writes a basic element (no children, just textual content)
cloneDependencies($a_new_objective, $a_copy_id)
clone objective materials
static _getAssignableMaterials($a_container_id)
Get an array of course material ids that can be assigned to learning objectives No tst...
global $ilDB