ILIAS  release_7 Revision v7.30-3-g800a261c036
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
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();
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}
An exception for terminatinating execution or to throw for unit testing.
Style Migration Class (->3.11)
static _getBasicStyleDom()
Get basic style dom.
static _createImagesDirectory($a_style_id)
Create images directory <data_dir>/sty/sty_<id>/images.
static _determineTag($a_type)
static _getCoreStyles()
Get core styles.
static _getImagesDirectory($a_style_id)
Get images directory.
addMissingStyleCharacteristics($a_id="")
Add missing style characteristics to styles.
static _addMissingStyleClassesToAllStyles()
Add missing style classes to all styles.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
const CLIENT_WEB_DIR
Definition: constants.php:45
global $ilBench
Definition: ilias.php:21
$ilErr
Definition: raiseError.php:18
global $ilDB