ILIAS  eassessment Revision 61809
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilStyleMigration.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
13 {
14  // tag that are used by style types
15  public static $assigned_tags = array (
16  "text_block" => "div",
17  "text_inline" => "span",
18  "section" => "div",
19  "link" => "a",
20  "table" => "table",
21  "table_cell" => "td",
22  "media_cont" => "table",
23  "media_caption" => "div",
24  "sco_title" => "div",
25  "sco_keyw" => "div",
26  "sco_desc" => "div",
27  "sco_obj" => "div",
28  "list_o" => "ol",
29  "list_u" => "ul",
30  "list_item" => "li",
31  "flist_cont" => "div",
32  "flist_head" => "div",
33  "flist" => "ul",
34  "flist_li" => "li",
35  "question" => "div",
36  "qtitle" => "div",
37  "qanswer" => "div",
38  "qinput" => "input",
39  "qsubmit" => "input",
40  "qfeedr" => "div",
41  "qfeedw" => "div",
42  "page_frame" => "table",
43  "page_cont" => "table",
44  "page_fn" => "div",
45  "page_tnav" => "div",
46  "page_bnav" => "div",
47  "page_lnav" => "div",
48  "page_rnav" => "div",
49  "page_lnavlink" => "a",
50  "page_rnavlink" => "a",
51  "page_lnavimage" => "img",
52  "page_rnavimage" => "img",
53  "page_title" => "div"
54  );
55 
56  // core styles these styles MUST exists
57  public static $core_styles = array(
58  array("type" => "text_block", "class" => "Standard"),
59  array("type" => "text_block", "class" => "List"),
60  array("type" => "text_block", "class" => "TableContent"),
61  array("type" => "text_block", "class" => "Headline1"),
62  array("type" => "text_block", "class" => "Headline2"),
63  array("type" => "text_block", "class" => "Headline3"),
64  array("type" => "text_inline", "class" => "Comment"),
65  array("type" => "text_inline", "class" => "Emph"),
66  array("type" => "text_inline", "class" => "Quotation"),
67  array("type" => "text_inline", "class" => "Strong"),
68  array("type" => "link", "class" => "IntLink"),
69  array("type" => "link", "class" => "ExtLink"),
70  array("type" => "link", "class" => "FootnoteLink"),
71  array("type" => "media_cont", "class" => "MediaContainer"),
72  array("type" => "table", "class" => "StandardTable"),
73  array("type" => "media_caption", "class" => "MediaCaption"),
74  array("type" => "page_frame", "class" => "PageFrame"),
75  array("type" => "page_cont", "class" => "PageContainer"),
76  array("type" => "page_tnav", "class" => "TopNavigation"),
77  array("type" => "page_bnav", "class" => "BottomNavigation"),
78  array("type" => "page_lnav", "class" => "LeftNavigation"),
79  array("type" => "page_rnav", "class" => "RightNavigation"),
80  array("type" => "page_lnavlink", "class" => "LeftNavigationLink"),
81  array("type" => "page_rnavlink", "class" => "RightNavigationLink"),
82  array("type" => "page_lnavimage", "class" => "LeftNavigationImage"),
83  array("type" => "page_rnavimage", "class" => "RightNavigationImage"),
84  array("type" => "page_fn", "class" => "Footnote"),
85  array("type" => "page_title", "class" => "PageTitle"),
86  array("type" => "sco_title", "class" => "Title"),
87  array("type" => "sco_desc", "class" => "Description"),
88  array("type" => "sco_keyw", "class" => "Keywords"),
89  array("type" => "sco_obj", "class" => "Objective"),
90  array("type" => "list_o", "class" => "NumberedList"),
91  array("type" => "list_u", "class" => "BulletedList"),
92  array("type" => "list_item", "class" => "StandardListItem"),
93  array("type" => "question", "class" => "Standard"),
94  array("type" => "question", "class" => "SingleChoice"),
95  array("type" => "question", "class" => "MultipleChoice"),
96  array("type" => "question", "class" => "TextQuestion"),
97  array("type" => "question", "class" => "OrderingQuestion"),
98  array("type" => "question", "class" => "MatchingQuestion"),
99  array("type" => "question", "class" => "ImagemapQuestion"),
100  array("type" => "question", "class" => "ClozeTest"),
101  array("type" => "qtitle", "class" => "Title"),
102  array("type" => "qanswer", "class" => "Answer"),
103  array("type" => "qinput", "class" => "Input"),
104  array("type" => "qsubmit", "class" => "Submit"),
105  array("type" => "qfeedr", "class" => "FeedbackRight"),
106  array("type" => "qfeedw", "class" => "FeedbackWrong"),
107  array("type" => "flist_cont", "class" => "FileListContainer"),
108  array("type" => "flist_head", "class" => "FileListHeading"),
109  array("type" => "flist", "class" => "FileList"),
110  array("type" => "flist_li", "class" => "FileListItem")
111  );
112 
113  // basic style xml file, image directory and dom
114  protected static $basic_style_file = "./Services/Migration/DBUpdate_1385/basic_style/style.xml";
115  protected static $basic_style_image_dir = "./Services/Migration/DBUpdate_1385/basic_style/images";
116  protected static $basic_style_dom;
117 
121  function addMissingStyleCharacteristics($a_id = "")
122  {
123  global $ilDB;
124 
125  $add_str = "";
126  if ($a_id != "")
127  {
128  $add_str = " AND style_id = ".$ilDB->quote($a_id, "integer");
129  }
130 
131  $set = $ilDB->query($q = "SELECT DISTINCT style_id, tag, class FROM style_parameter WHERE ".
132  $ilDB->equals("type", "", "text", true)." ".$add_str);
133 
134  while ($rec = $ilDB->fetchAssoc($set))
135  {
136  // derive types from tag
137  $types = array();
138  switch ($rec["tag"])
139  {
140  case "div":
141  case "p":
142  if (in_array($rec["class"], array("Headline3", "Headline1",
143  "Headline2", "TableContent", "List", "Standard", "Remark",
144  "Additional", "Mnemonic", "Citation", "Example")))
145  {
146  $types[] = "text_block";
147  }
148  if (in_array($rec["class"], array("Block", "Remark",
149  "Additional", "Mnemonic", "Example", "Excursus", "Special")))
150  {
151  $types[] = "section";
152  }
153  if (in_array($rec["class"], array("Page", "Footnote", "PageTitle", "LMNavigation")))
154  {
155  $types[] = "page";
156  }
157  break;
158 
159  case "td":
160  $types[] = "table_cell";
161  break;
162 
163  case "a":
164  if (in_array($rec["class"], array("ExtLink", "IntLink", "FootnoteLink")))
165  {
166  $types[] = "link";
167  }
168  break;
169 
170  case "span":
171  $types[] = "text_inline";
172  break;
173 
174  case "table":
175  $types[] = "table";
176  break;
177 
178  default:
179  $types[] = array();
180  break;
181  }
182 
183  // check if style_char set exists
184  foreach ($types as $t)
185  {
186  // check if second type already exists
187  $set4 = $ilDB->queryF("SELECT * FROM style_char ".
188  " WHERE style_id = %s AND type = %s AND characteristic = %s",
189  array("integer", "text", "text"),
190  array($rec["style_id"], $t, $rec["class"]));
191  if ($rec4 = $ilDB->fetchAssoc($set4))
192  {
193  // ok
194  }
195  else
196  {
197 //echo "<br>1-".$rec["style_id"]."-".$t."-".$rec["class"]."-";
198  $ilDB->manipulateF("INSERT INTO style_char ".
199  " (style_id, type, characteristic) VALUES ".
200  " (%s,%s,%s) ",
201  array("integer", "text", "text"),
202  array($rec["style_id"], $t, $rec["class"]));
203  }
204  }
205 
206  // update types
207  if ($rec["type"] == "")
208  {
209  if (count($types) > 0)
210  {
211  $ilDB->manipulateF("UPDATE style_parameter SET type = %s ".
212  " WHERE style_id = %s AND class = %s AND ".$ilDB->equals("type", "", "text", true),
213  array("text", "integer", "text"),
214  array($types[0], $rec["style_id"], $rec["class"]));
215 
216  // links extra handling
217  if ($types[0] == "link")
218  {
219  $ilDB->manipulateF("UPDATE style_parameter SET type = %s ".
220  " WHERE style_id = %s AND (class = %s OR class = %s) AND ".$ilDB->equals("type", "", "text", true),
221  array("text", "integer", "text", "text"),
222  array($types[0], $rec["style_id"], $rec["class"].":visited",
223  $rec["class"].":hover"));
224 //echo "<br>4-".$types[0]."-".$rec["style_id"]."-".$rec["class"].":visited"."-".
225 // $rec["class"].":hover";
226  }
227  }
228 
229  if (count($types) == 2)
230  {
231  // select all records of first type and add second type
232  // records if necessary.
233  $set2 = $ilDB->queryF("SELECT * FROM style_parameter ".
234  " WHERE style_id = %s AND class = %s AND type = %s",
235  array("integer", "text", "text"),
236  array($rec["style_id"], $rec["class"], $types[0]));
237  while ($rec2 = $ilDB->fetchAssoc($set2))
238  {
239  // check if second type already exists
240  $set3 = $ilDB->queryF("SELECT * FROM style_parameter ".
241  " WHERE style_id = %s AND tag = %s AND class = %s AND type = %s AND parameter = %s",
242  array("integer", "text", "text", "text", "text"),
243  array($rec["style_id"], $rec["tag"], $rec["class"], $types[1], $rec["parameter"]));
244  if ($rec3 = $ilDB->fetchAssoc($set3))
245  {
246  // ok
247  }
248  else
249  {
250  $ilDB->manipulateF("INSERT INTO style_parameter ".
251  " (style_id, tag, class, parameter, value, type) VALUES ".
252  " (%s,%s,%s,%s,%s,%s) ",
253  array("integer", "text", "text", "text", "text", "text"),
254  array($rec2["style_id"], $rec2["tag"], $rec2["class"],
255  $rec2["parameter"], $rec2["value"], $types[1]));
256  }
257  }
258  }
259  }
260  }
261  }
262 
266  static function _getCoreStyles()
267  {
268  $c_styles = array();
269  foreach (self::$core_styles as $cstyle)
270  {
271  $c_styles[$cstyle["type"].".".ilStyleMigration::_determineTag($cstyle["type"]).".".$cstyle["class"]]
272  = array("type" => $cstyle["type"],
273  "tag" => ilStyleMigration::_determineTag($cstyle["type"]),
274  "class" => $cstyle["class"]);
275  }
276  return $c_styles;
277  }
278 
279  static function _determineTag($a_type)
280  {
281  return self::$assigned_tags[$a_type];
282  }
283 
287  static function _getBasicStyleDom()
288  {
289  global $ilBench;
290 
291  if (!is_object(self::$basic_style_dom))
292  {
293  self::$basic_style_dom = new DOMDocument();
294  self::$basic_style_dom->load(self::$basic_style_file);
295  }
296 
297  return self::$basic_style_dom;
298  }
299 
304  static function _createImagesDirectory($a_style_id)
305  {
306  global $ilErr;
307 
308  $sty_data_dir = CLIENT_WEB_DIR."/sty";
309  ilUtil::makeDir($sty_data_dir);
310  if(!is_writable($sty_data_dir))
311  {
312  $ilErr->raiseError("Style data directory (".$sty_data_dir
313  .") not writeable.", $ilErr->FATAL);
314  }
315 
316  $style_dir = $sty_data_dir."/sty_".$a_style_id;
317  ilUtil::makeDir($style_dir);
318  if(!@is_dir($style_dir))
319  {
320  $ilErr->raiseError("Creation of style directory failed (".
321  $style_dir.").",$ilErr->FATAL);
322  }
323 
324  // create images subdirectory
325  $im_dir = $style_dir."/images";
326  ilUtil::makeDir($im_dir);
327  if(!@is_dir($im_dir))
328  {
329  $ilErr->raiseError("Creation of Import Directory failed (".
330  $im_dir.").", $ilErr->FATAL);
331  }
332 
333  // create thumbnails directory
334  $thumb_dir = $style_dir."/images/thumbnails";
335  ilUtil::makeDir($thumb_dir);
336  if(!@is_dir($thumb_dir))
337  {
338  $ilErr->raiseError("Creation of Import Directory failed (".
339  $thumb_dir.").", $ilErr->FATAL);
340  }
341  }
342 
346  static function _getImagesDirectory($a_style_id)
347  {
348  return CLIENT_WEB_DIR."/sty/sty_".$a_style_id.
349  "/images";
350  }
351 
356  {
357  global $ilDB;
358 
361 
362  // get all core image files
363  $core_images = array();
364  $core_dir = self::$basic_style_image_dir;
365  if (is_dir($core_dir))
366  {
367  $dir = opendir($core_dir);
368  while($file = readdir($dir))
369  {
370  if (substr($file, 0, 1) != "." && is_file($core_dir."/".$file))
371  {
372  $core_images[] = $file;
373  }
374  }
375  }
376 
377  // check, whether core style class exists
378  $sets = $ilDB->query("SELECT * FROM object_data WHERE type = 'sty'");
379 
380  while ($recs = $ilDB->fetchAssoc($sets))
381  {
382  $id = $recs["obj_id"];
383 
384  foreach($core_styles as $cs)
385  {
386  // check, whether core style class exists
387  $set = $ilDB->queryF("SELECT * FROM style_char WHERE style_id = %s ".
388  "AND type = %s AND characteristic = %s",
389  array("integer", "text", "text"),
390  array($id, $cs["type"], $cs["class"]));
391 
392  // if not, add core style class
393  if (!($rec = $ilDB->fetchAssoc($set)))
394  {
395  $ilDB->manipulateF("INSERT INTO style_char (style_id, type, characteristic) ".
396  " VALUES (%s,%s,%s) ",
397  array("integer", "text", "text"),
398  array($id, $cs["type"], $cs["class"]));
399 
400  $xpath = new DOMXPath($bdom);
401  $par_nodes = $xpath->query("/StyleSheet/Style[@Tag = '".$cs["tag"]."' and @Type='".
402  $cs["type"]."' and @Class='".$cs["class"]."']/StyleParameter");
403  foreach ($par_nodes as $par_node)
404  {
405  // check whether style parameter exists
406  $set = $ilDB->queryF("SELECT * FROM style_parameter WHERE style_id = %s ".
407  "AND type = %s AND class = %s AND tag = %s AND parameter = %s",
408  array("integer", "text", "text", "text", "text"),
409  array($id, $cs["type"], $cs["class"],
410  $cs["tag"], $par_node->getAttribute("Name")));
411 
412  // if not, create style parameter
413  if (!($rec = $ilDB->fetchAssoc($set)))
414  {
415  $ilDB->manipulateF("INSERT INTO style_parameter (style_id, type, class, tag, parameter, value) ".
416  " VALUES (%s,%s,%s,%s,%s,%s)",
417  array("integer", "text", "text", "text", "text", "text"),
418  array($id, $cs["type"], $cs["class"], $cs["tag"],
419  $par_node->getAttribute("Name"), $par_node->getAttribute("Value")));
420  }
421  }
422  }
423  }
424 
425  // now check, whether some core image files are missing
428  reset($core_images);
429  foreach($core_images as $cim)
430  {
431  if (!is_file($imdir."/".$cim))
432  {
433  copy($core_dir."/".$cim, $imdir."/".$cim);
434  }
435  }
436  }
437  }
438 
439 }
440 ?>