ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
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  public function addMissingStyleCharacteristics($a_id = "")
122  {
123  global $ilDB;
124 
125  $add_str = "";
126  if ($a_id != "") {
127  $add_str = " AND style_id = " . $ilDB->quote($a_id, "integer");
128  }
129 
130  $set = $ilDB->query($q = "SELECT DISTINCT style_id, tag, class FROM style_parameter WHERE " .
131  $ilDB->equals("type", "", "text", true) . " " . $add_str);
132 
133  while ($rec = $ilDB->fetchAssoc($set)) {
134  // derive types from tag
135  $types = array();
136  switch ($rec["tag"]) {
137  case "div":
138  case "p":
139  if (in_array($rec["class"], array("Headline3", "Headline1",
140  "Headline2", "TableContent", "List", "Standard", "Remark",
141  "Additional", "Mnemonic", "Citation", "Example"))) {
142  $types[] = "text_block";
143  }
144  if (in_array($rec["class"], array("Block", "Remark",
145  "Additional", "Mnemonic", "Example", "Excursus", "Special"))) {
146  $types[] = "section";
147  }
148  if (in_array($rec["class"], array("Page", "Footnote", "PageTitle", "LMNavigation"))) {
149  $types[] = "page";
150  }
151  break;
152 
153  case "td":
154  $types[] = "table_cell";
155  break;
156 
157  case "a":
158  if (in_array($rec["class"], array("ExtLink", "IntLink", "FootnoteLink"))) {
159  $types[] = "link";
160  }
161  break;
162 
163  case "span":
164  $types[] = "text_inline";
165  break;
166 
167  case "table":
168  $types[] = "table";
169  break;
170 
171  default:
172  $types[] = array();
173  break;
174  }
175 
176  // check if style_char set exists
177  foreach ($types as $t) {
178  // check if second type already exists
179  $set4 = $ilDB->queryF(
180  "SELECT * FROM style_char " .
181  " WHERE style_id = %s AND type = %s AND characteristic = %s",
182  array("integer", "text", "text"),
183  array($rec["style_id"], $t, $rec["class"])
184  );
185  if ($rec4 = $ilDB->fetchAssoc($set4)) {
186  // ok
187  } else {
188  //echo "<br>1-".$rec["style_id"]."-".$t."-".$rec["class"]."-";
189  $ilDB->manipulateF(
190  "INSERT INTO style_char " .
191  " (style_id, type, characteristic) VALUES " .
192  " (%s,%s,%s) ",
193  array("integer", "text", "text"),
194  array($rec["style_id"], $t, $rec["class"])
195  );
196  }
197  }
198 
199  // update types
200  if ($rec["type"] == "") {
201  if (count($types) > 0) {
202  $ilDB->manipulateF(
203  "UPDATE style_parameter SET type = %s " .
204  " WHERE style_id = %s AND class = %s AND " . $ilDB->equals("type", "", "text", true),
205  array("text", "integer", "text"),
206  array($types[0], $rec["style_id"], $rec["class"])
207  );
208 
209  // links extra handling
210  if ($types[0] == "link") {
211  $ilDB->manipulateF(
212  "UPDATE style_parameter SET type = %s " .
213  " WHERE style_id = %s AND (class = %s OR class = %s) AND " . $ilDB->equals("type", "", "text", true),
214  array("text", "integer", "text", "text"),
215  array($types[0], $rec["style_id"], $rec["class"] . ":visited",
216  $rec["class"] . ":hover")
217  );
218  //echo "<br>4-".$types[0]."-".$rec["style_id"]."-".$rec["class"].":visited"."-".
219 // $rec["class"].":hover";
220  }
221  }
222 
223  if (count($types) == 2) {
224  // select all records of first type and add second type
225  // records if necessary.
226  $set2 = $ilDB->queryF(
227  "SELECT * FROM style_parameter " .
228  " WHERE style_id = %s AND class = %s AND type = %s",
229  array("integer", "text", "text"),
230  array($rec["style_id"], $rec["class"], $types[0])
231  );
232  while ($rec2 = $ilDB->fetchAssoc($set2)) {
233  // check if second type already exists
234  $set3 = $ilDB->queryF(
235  "SELECT * FROM style_parameter " .
236  " WHERE style_id = %s AND tag = %s AND class = %s AND type = %s AND parameter = %s",
237  array("integer", "text", "text", "text", "text"),
238  array($rec["style_id"], $rec["tag"], $rec["class"], $types[1], $rec["parameter"])
239  );
240  if ($rec3 = $ilDB->fetchAssoc($set3)) {
241  // ok
242  } else {
243  $ilDB->manipulateF(
244  "INSERT INTO style_parameter " .
245  " (style_id, tag, class, parameter, value, type) VALUES " .
246  " (%s,%s,%s,%s,%s,%s) ",
247  array("integer", "text", "text", "text", "text", "text"),
248  array($rec2["style_id"], $rec2["tag"], $rec2["class"],
249  $rec2["parameter"], $rec2["value"], $types[1])
250  );
251  }
252  }
253  }
254  }
255  }
256  }
257 
261  public static function _getCoreStyles()
262  {
263  $c_styles = array();
264  foreach (self::$core_styles as $cstyle) {
265  $c_styles[$cstyle["type"] . "." . ilStyleMigration::_determineTag($cstyle["type"]) . "." . $cstyle["class"]]
266  = array("type" => $cstyle["type"],
267  "tag" => ilStyleMigration::_determineTag($cstyle["type"]),
268  "class" => $cstyle["class"]);
269  }
270  return $c_styles;
271  }
272 
273  public static function _determineTag($a_type)
274  {
275  return self::$assigned_tags[$a_type];
276  }
277 
281  public static function _getBasicStyleDom()
282  {
283  global $ilBench;
284 
285  if (!is_object(self::$basic_style_dom)) {
286  self::$basic_style_dom = new DOMDocument();
287  self::$basic_style_dom->load(self::$basic_style_file);
288  }
289 
290  return self::$basic_style_dom;
291  }
292 
297  public static function _createImagesDirectory($a_style_id)
298  {
299  global $ilErr;
300 
301  $sty_data_dir = CLIENT_WEB_DIR . "/sty";
302  ilUtil::makeDir($sty_data_dir);
303  if (!is_writable($sty_data_dir)) {
304  $ilErr->raiseError("Style data directory (" . $sty_data_dir
305  . ") not writeable.", $ilErr->FATAL);
306  }
307 
308  $style_dir = $sty_data_dir . "/sty_" . $a_style_id;
309  ilUtil::makeDir($style_dir);
310  if (!@is_dir($style_dir)) {
311  $ilErr->raiseError("Creation of style directory failed (" .
312  $style_dir . ").", $ilErr->FATAL);
313  }
314 
315  // create images subdirectory
316  $im_dir = $style_dir . "/images";
317  ilUtil::makeDir($im_dir);
318  if (!@is_dir($im_dir)) {
319  $ilErr->raiseError("Creation of Import Directory failed (" .
320  $im_dir . ").", $ilErr->FATAL);
321  }
322 
323  // create thumbnails directory
324  $thumb_dir = $style_dir . "/images/thumbnails";
325  ilUtil::makeDir($thumb_dir);
326  if (!@is_dir($thumb_dir)) {
327  $ilErr->raiseError("Creation of Import Directory failed (" .
328  $thumb_dir . ").", $ilErr->FATAL);
329  }
330  }
331 
335  public static function _getImagesDirectory($a_style_id)
336  {
337  return CLIENT_WEB_DIR . "/sty/sty_" . $a_style_id .
338  "/images";
339  }
340 
344  public static function _addMissingStyleClassesToAllStyles()
345  {
346  global $ilDB;
347 
350 
351  // get all core image files
352  $core_images = array();
353  $core_dir = self::$basic_style_image_dir;
354  if (is_dir($core_dir)) {
355  $dir = opendir($core_dir);
356  while ($file = readdir($dir)) {
357  if (substr($file, 0, 1) != "." && is_file($core_dir . "/" . $file)) {
358  $core_images[] = $file;
359  }
360  }
361  }
362 
363  // check, whether core style class exists
364  $sets = $ilDB->query("SELECT * FROM object_data WHERE type = 'sty'");
365 
366  while ($recs = $ilDB->fetchAssoc($sets)) {
367  $id = $recs["obj_id"];
368 
369  foreach ($core_styles as $cs) {
370  // check, whether core style class exists
371  $set = $ilDB->queryF(
372  "SELECT * FROM style_char WHERE style_id = %s " .
373  "AND type = %s AND characteristic = %s",
374  array("integer", "text", "text"),
375  array($id, $cs["type"], $cs["class"])
376  );
377 
378  // if not, add core style class
379  if (!($rec = $ilDB->fetchAssoc($set))) {
380  $ilDB->manipulateF(
381  "INSERT INTO style_char (style_id, type, characteristic) " .
382  " VALUES (%s,%s,%s) ",
383  array("integer", "text", "text"),
384  array($id, $cs["type"], $cs["class"])
385  );
386 
387  $xpath = new DOMXPath($bdom);
388  $par_nodes = $xpath->query("/StyleSheet/Style[@Tag = '" . $cs["tag"] . "' and @Type='" .
389  $cs["type"] . "' and @Class='" . $cs["class"] . "']/StyleParameter");
390  foreach ($par_nodes as $par_node) {
391  // check whether style parameter exists
392  $set = $ilDB->queryF(
393  "SELECT * FROM style_parameter WHERE style_id = %s " .
394  "AND type = %s AND class = %s AND tag = %s AND parameter = %s",
395  array("integer", "text", "text", "text", "text"),
396  array($id, $cs["type"], $cs["class"],
397  $cs["tag"], $par_node->getAttribute("Name"))
398  );
399 
400  // if not, create style parameter
401  if (!($rec = $ilDB->fetchAssoc($set))) {
402  $ilDB->manipulateF(
403  "INSERT INTO style_parameter (style_id, type, class, tag, parameter, value) " .
404  " VALUES (%s,%s,%s,%s,%s,%s)",
405  array("integer", "text", "text", "text", "text", "text"),
406  array($id, $cs["type"], $cs["class"], $cs["tag"],
407  $par_node->getAttribute("Name"), $par_node->getAttribute("Value"))
408  );
409  }
410  }
411  }
412  }
413 
414  // now check, whether some core image files are missing
417  reset($core_images);
418  foreach ($core_images as $cim) {
419  if (!is_file($imdir . "/" . $cim)) {
420  copy($core_dir . "/" . $cim, $imdir . "/" . $cim);
421  }
422  }
423  }
424  }
425 }
global $ilErr
Definition: raiseError.php:16
static _determineTag($a_type)
static _getCoreStyles()
Get core styles.
if(!array_key_exists('StateId', $_REQUEST)) $id
addMissingStyleCharacteristics($a_id="")
Add missing style characteristics to styles.
$a_type
Definition: workflow.php:92
static _addMissingStyleClassesToAllStyles()
Add missing style classes to all styles.
static _getBasicStyleDom()
Get basic style dom.
Style Migration Class (->3.11)
static _getImagesDirectory($a_style_id)
Get images directory.
static _createImagesDirectory($a_style_id)
Create images directory <data_dir>/sty/sty_<id>/images.
Create styles array
The data for the language used.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
$sets
Definition: fetch.php:11
global $ilBench
Definition: ilias.php:18
global $ilDB
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file