ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
class.ilObjStyleSheet.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4
5require_once "./Services/Object/classes/class.ilObject.php";
6
16{
17 public $style;
18
19 public static $num_unit = array("px", "em", "ex", "%", "pt", "pc", "in", "mm", "cm");
20 public static $num_unit_no_perc = array("px", "em", "ex", "pt", "pc", "in", "mm", "cm");
21
22 // css parameters and their attribute values, input type and group
23 public static $parameter = array(
24 "font-size" => array(
25 "values" => array("xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "smaller", "larger"),
26 "input" => "fontsize",
27 "group" => "text"),
28 "font-family" => array(
29 "values" => array(),
30 "input" => "text",
31 "group" => "text"),
32 "font-style" => array(
33 "values" => array("italic", "oblique", "normal"),
34 "input" => "select",
35 "group" => "text"),
36 "font-weight" => array(
37 "values" => array("bold", "normal", "bolder", "lighter"),
38 "input" => "select",
39 "group" => "text"),
40 "font-variant" => array(
41 "values" => array("small-caps", "normal"),
42 "input" => "select",
43 "group" => "text"),
44 "word-spacing" => array(
45 "values" => array(),
46 "input" => "numeric_no_perc",
47 "group" => "text"),
48 "letter-spacing" => array(
49 "values" => array(),
50 "input" => "numeric_no_perc",
51 "group" => "text"),
52 "text-decoration" => array(
53 "values" => array("underline", "overline", "line-through", "blink", "none"),
54 "input" => "select",
55 "group" => "text"),
56 "text-transform" => array(
57 "values" => array("capitalize", "uppercase", "lowercase", "none"),
58 "input" => "select",
59 "group" => "text"),
60 "color" => array(
61 "values" => array(),
62 "input" => "color",
63 "group" => "text"),
64 "text-indent" => array(
65 "values" => array(),
66 "input" => "numeric",
67 "group" => "text"),
68 "line-height" => array(
69 "values" => array(),
70 "input" => "numeric",
71 "group" => "text"),
72 "vertical-align" => array(
73 "values" => array("top", "middle", "bottom", "baseline", "sub", "super",
74 "text-top", "text-bottom"),
75 "input" => "select",
76 "group" => "text"),
77 "text-align" => array(
78 "values" => array("left", "center", "right", "justify"),
79 "input" => "select",
80 "group" => "text"),
81 "white-space" => array(
82 "values" => array("normal", "pre", "nowrap"),
83 "input" => "select",
84 "group" => "text"),
85 "margin" => array(
86 "values" => array(),
87 "input" => "trbl_numeric",
88 "subpar" => array("margin", "margin-top", "margin-right",
89 "margin-bottom", "margin-left"),
90 "group" => "margin_and_padding"),
91 "padding" => array(
92 "values" => array(),
93 "input" => "trbl_numeric",
94 "subpar" => array("padding", "padding-top", "padding-right",
95 "padding-bottom", "padding-left"),
96 "group" => "margin_and_padding"),
97 "border-width" => array(
98 "values" => array("thin", "medium", "thick"),
99 "input" => "border_width",
100 "subpar" => array("border-width", "border-top-width", "border-right-width",
101 "border-bottom-width", "border-left-width"),
102 "group" => "border"),
103 "border-color" => array(
104 "values" => array(),
105 "input" => "trbl_color",
106 "subpar" => array("border-color", "border-top-color", "border-right-color",
107 "border-bottom-color", "border-left-color"),
108 "group" => "border"),
109 "border-style" => array(
110 "values" => array("none", "hidden", "dotted", "dashed", "solid", "double",
111 "groove", "ridge", "inset", "outset"),
112 "input" => "border_style",
113 "subpar" => array("border-style", "border-top-style", "border-right-style",
114 "border-bottom-style", "border-left-style"),
115 "group" => "border"),
116
117 "background-color" => array(
118 "values" => array(),
119 "input" => "color",
120 "group" => "background"),
121 "background-image" => array(
122 "values" => array(),
123 "input" => "background_image",
124 "group" => "background"),
125 "background-repeat" => array(
126 "values" => array("repeat", "repeat-x", "repeat-y", "no-repeat"),
127 "input" => "select",
128 "group" => "background"),
129 "background-attachment" => array(
130 "values" => array("fixed", "scroll"),
131 "input" => "select",
132 "group" => "background"),
133 "background-position" => array(
134 "values" => array("horizontal" => array("left", "center", "right"),
135 "vertical" => array("top", "center", "bottom")),
136 "input" => "background_position",
137 "group" => "background"),
138
139 "position" => array(
140 "values" => array("absolute", "fixed", "relative", "static"),
141 "input" => "select",
142 "group" => "positioning"),
143 "top" => array(
144 "values" => array(),
145 "input" => "numeric",
146 "group" => "positioning"),
147 "bottom" => array(
148 "values" => array(),
149 "input" => "numeric",
150 "group" => "positioning"),
151 "left" => array(
152 "values" => array(),
153 "input" => "numeric",
154 "group" => "positioning"),
155 "right" => array(
156 "values" => array(),
157 "input" => "numeric",
158 "group" => "positioning"),
159 "width" => array(
160 "values" => array(),
161 "input" => "numeric",
162 "group" => "positioning"),
163 "height" => array(
164 "values" => array(),
165 "input" => "numeric",
166 "group" => "positioning"),
167 "min-height" => array(
168 "values" => array(),
169 "input" => "numeric",
170 "group" => "positioning"),
171 "float" => array(
172 "values" => array("left", "right", "none"),
173 "input" => "select",
174 "group" => "positioning"),
175 "overflow" => array(
176 "values" => array("visible", "hidden", "scroll", "auto"),
177 "input" => "select",
178 "group" => "positioning"),
179 "opacity" => array(
180 "values" => array(),
181 "input" => "percentage",
182 "group" => "special"),
183 "transform" => array(
184 "values" => array("rotate(90deg)", "rotate(180deg)", "rotate(270deg)"),
185 "input" => "select",
186 "group" => "special"),
187 "transform-origin" => array(
188 "values" => array( "horizontal" => array("left", "center", "right"),
189 "vertical" => array("top", "center", "bottom")),
190 "input" => "background_position",
191 "group" => "special"),
192 "cursor" => array(
193 "values" => array("auto", "default", "crosshair", "pointer", "move",
194 "n-resize", "ne-resize", "e-resize", "se-resize", "s-resize", "sw-resize",
195 "w-resize", "nw-resize", "text", "wait", "help"),
196 "input" => "select",
197 "group" => "special"),
198 "clear" => array(
199 "values" => array("both","left","right","none"),
200 "input" => "select",
201 "group" => "special"),
202
203 "list-style-type.ol" => array(
204 "values" => array("decimal","lower-roman","upper-roman",
205 "lower-alpha", "upper-alpha", "lower-greek", "hebrew",
206 "decimal-leading-zero", "cjk-ideographic", "hiragana",
207 "katakana", "hiragana-iroha", "katakana-iroha", "none"),
208 "input" => "select",
209 "group" => "ol"),
210 "list-style-type.ul" => array(
211 "values" => array("disc","circle","square",
212 "none"),
213 "input" => "select",
214 "group" => "ul"),
215 "list-style-image.ul" => array(
216 "values" => array(),
217 "input" => "background_image",
218 "group" => "ul"),
219 "list-style-position.ol" => array(
220 "values" => array("inside","outside"),
221 "input" => "select",
222 "group" => "ol"),
223 "list-style-position.ul" => array(
224 "values" => array("inside","outside"),
225 "input" => "select",
226 "group" => "ul"
227 ),
228 "border-collapse" => array(
229 "values" => array("collapse","separate"),
230 "input" => "select",
231 "group" => "table"
232 ),
233 "caption-side" => array(
234 "values" => array("top","bottom","left","right"),
235 "input" => "select",
236 "group" => "table"
237 )
238 );
239
240 // filter groups of properties that should only be
241 // displayed with matching tag (group -> tags)
242 public static $filtered_groups =
243 array("ol" => array("ol"), "ul" => array("ul"),
244 "table" => array("table"), "positioning" => array("h1", "h2", "h3", "div", "img", "table", "a", "figure"));
245
246 // style types and their super type
247 public static $style_super_types = array(
248 "text_block" => array("text_block", "heading1", "heading2", "heading3", "code_block"),
249 "text_inline" => array("text_inline", "sub", "sup", "code_inline"),
250 "section" => array("section"),
251 "link" => array("link"),
252 "table" => array("table", "table_cell", "table_caption"),
253 "list" => array("list_o", "list_u", "list_item"),
254 "flist" => array("flist_cont", "flist_head", "flist", "flist_li", "flist_a"),
255 "media" => array("media_cont", "media_caption", "iim", "marker"),
256 "tabs" => array("va_cntr", "va_icntr", "va_ihead", "va_iheada", "va_ihcap", "va_icont",
257 "ha_cntr", "ha_icntr", "ha_ihead", "ha_iheada", "ha_ihcap", "ha_icont", "ca_cntr", "ca_icntr", "ca_ihead", "ca_icont"),
258 "question" => array("question", "qtitle", "qanswer", "qinput", "qlinput", "qsubmit", "qfeedr", "qfeedw",
259 "qimg", "qordul", "qordli", "qimgd", "qetitem", "qetcorr", "qover"),
260 "page" => array("page_frame", "page_cont", "page_title", "page_fn",
261 "page_tnav", "page_bnav", "page_lnav", "page_rnav", "page_lnavlink", "page_rnavlink",
262 "page_lnavimage", "page_rnavimage"),
263 "glo" => array("glo_overlay", "glo_ovtitle", "glo_ovclink", "glo_ovuglink", "glo_ovuglistlink"),
264 "sco" => array("sco_title", "sco_keyw", "sco_desc", "sco_desct", "sco_obj", "sco_objt", "sco_fmess"),
265 "rte" => array("rte_menu", "rte_mlink", "rte_tree", "rte_node", "rte_tlink","rte_status",
266 "rte_tul", "rte_tli", "rte_texp", "rte_tclink", "rte_drag")
267 );
268
269 // these types are expandable, i.e. the user can define new style classes
270 public static $expandable_types = array(
271 "text_block", "text_inline", "section", "media_cont", "table", "table_cell", "flist_li", "table_caption",
272 "list_o", "list_u",
273 "va_cntr", "va_icntr", "va_ihead", "va_iheada", "va_ihcap", "va_icont",
274 "ha_cntr", "ha_icntr", "ha_ihead", "ha_iheada", "ha_ihcap", "ha_icont",
275 "ca_cntr", "ca_icntr", "ca_ihead", "ca_icont"
276 );
277
278 // these types can be hidden in the content editor
279 public static $hideable_types = array(
280 "table", "table_cell"
281 );
282
283 // tag that are used by style types
284 public static $assigned_tags = array(
285 "text_block" => "div",
286 "heading1" => "h1",
287 "heading2" => "h2",
288 "heading3" => "h3",
289 "code_block" => "pre",
290 "text_inline" => "span",
291 "code_inline" => "code",
292 "sup" => "sup",
293 "sub" => "sub",
294 "section" => "div",
295 "link" => "a",
296 "table" => "table",
297 "table_cell" => "td",
298 "table_caption" => "caption",
299 "media_cont" => "figure",
300 "media_caption" => "div",
301 "iim" => "div",
302 "marker" => "a",
303 "glo_overlay" => "div",
304 "glo_ovtitle" => "h1",
305 "glo_ovclink" => "a",
306 "glo_ovuglink" => "a",
307 "glo_ovuglistlink" => "a",
308 "sco_title" => "div",
309 "sco_keyw" => "div",
310 "sco_desc" => "div",
311 "sco_obj" => "div",
312 "sco_desct" => "div",
313 "sco_objt" => "div",
314 "sco_fmess" => "div",
315 "rte_menu" => "div",
316 "rte_mlink" => "a",
317 "rte_tree" => "div",
318 "rte_tclink" => "a",
319 "rte_drag" => "div",
320 "rte_node" => "div",
321 "rte_status" => "div",
322 "rte_tlink" => "a",
323 "rte_tul" => "div",
324 "rte_tli" => "div",
325 "rte_texp" => "a",
326 "list_o" => "ol",
327 "list_u" => "ul",
328 "list_item" => "li",
329 "flist_cont" => "div",
330 "flist_head" => "div",
331 "flist" => "ul",
332 "flist_li" => "li",
333 "flist_a" => "a",
334 "question" => "div",
335 "qtitle" => "div",
336 "qanswer" => "div",
337 "qimg" => "img",
338 "qimgd" => "a",
339 "qordul" => "ul",
340 "qordli" => "li",
341 "qetitem" => "a",
342 "qetcorr" => "span",
343 "qinput" => "input",
344 "qlinput" => "textarea",
345 "qsubmit" => "input",
346 "qfeedr" => "div",
347 "qfeedw" => "div",
348 "qover" => "div",
349 "page_frame" => "div",
350 "page_cont" => "div",
351 "page_fn" => "div",
352 "page" => "div",
353 "page_tnav" => "div",
354 "page_bnav" => "div",
355 "page_lnav" => "div",
356 "page_rnav" => "div",
357 "page_lnavlink" => "a",
358 "page_rnavlink" => "a",
359 "page_lnavimage" => "img",
360 "page_rnavimage" => "img",
361 "page_title" => "h1",
362 "va_cntr" => "div",
363 "va_icntr" => "div",
364 "va_icont" => "div",
365 "va_ihead" => "div",
366 "va_iheada" => "div",
367 "va_ihcap" => "div",
368 "ha_cntr" => "div",
369 "ha_icntr" => "div",
370 "ha_icont" => "div",
371 "ha_iheada" => "div",
372 "ha_ihcap" => "div",
373 "ha_ihead" => "div",
374 "ca_cntr" => "div",
375 "ca_icntr" => "div",
376 "ca_ihead" => "div",
377 "ca_icont" => "div"
378 );
379
380 // pseudo classes
381 public static $pseudo_classes =
382 array("a" => array("hover"), "div" => array("hover"), "img" => array("hover"));
383
384 // core styles these styles MUST exists -> see also basic_style/style.xml
385 public static $core_styles = array(
386 array("type" => "text_block", "class" => "Standard"),
387 array("type" => "text_block", "class" => "List"),
388 array("type" => "text_block", "class" => "TableContent"),
389 array("type" => "code_block", "class" => "Code"),
390 array("type" => "heading1", "class" => "Headline1"),
391 array("type" => "heading2", "class" => "Headline2"),
392 array("type" => "heading3", "class" => "Headline3"),
393 array("type" => "text_inline", "class" => "Comment"),
394 array("type" => "text_inline", "class" => "Emph"),
395 array("type" => "text_inline", "class" => "Quotation"),
396 array("type" => "text_inline", "class" => "Strong"),
397 array("type" => "text_inline", "class" => "Accent"),
398 array("type" => "text_inline", "class" => "Important"),
399 array("type" => "code_inline", "class" => "CodeInline"),
400 array("type" => "sup", "class" => "Sup"),
401 array("type" => "sub", "class" => "Sub"),
402 array("type" => "link", "class" => "IntLink"),
403 array("type" => "link", "class" => "ExtLink"),
404 array("type" => "link", "class" => "FootnoteLink"),
405 array("type" => "link", "class" => "FileLink"),
406 array("type" => "link", "class" => "GlossaryLink"),
407 array("type" => "media_cont", "class" => "MediaContainer"),
408 array("type" => "media_cont", "class" => "MediaContainerMax50"),
409 array("type" => "media_cont", "class" => "MediaContainerFull100"),
410 array("type" => "table", "class" => "StandardTable"),
411 array("type" => "media_caption", "class" => "MediaCaption"),
412 array("type" => "iim", "class" => "ContentPopup"),
413 array("type" => "marker", "class" => "Marker"),
414 array("type" => "page_frame", "class" => "PageFrame"),
415 array("type" => "page_cont", "class" => "PageContainer"),
416 array("type" => "page", "class" => "Page"),
417 array("type" => "page_tnav", "class" => "TopNavigation"),
418 array("type" => "page_bnav", "class" => "BottomNavigation"),
419 array("type" => "page_lnav", "class" => "LeftNavigation"),
420 array("type" => "page_rnav", "class" => "RightNavigation"),
421 array("type" => "page_lnavlink", "class" => "LeftNavigationLink"),
422 array("type" => "page_rnavlink", "class" => "RightNavigationLink"),
423 array("type" => "page_lnavimage", "class" => "LeftNavigationImage"),
424 array("type" => "page_rnavimage", "class" => "RightNavigationImage"),
425 array("type" => "page_fn", "class" => "Footnote"),
426 array("type" => "page_title", "class" => "PageTitle"),
427 array("type" => "glo_overlay", "class" => "GlossaryOverlay"),
428 array("type" => "glo_ovtitle", "class" => "GlossaryOvTitle"),
429 array("type" => "glo_ovclink", "class" => "GlossaryOvCloseLink"),
430 array("type" => "glo_ovuglink", "class" => "GlossaryOvUnitGloLink"),
431 array("type" => "glo_ovuglistlink", "class" => "GlossaryOvUGListLink"),
432 array("type" => "sco_title", "class" => "Title"),
433 array("type" => "sco_desc", "class" => "Description"),
434 array("type" => "sco_desct", "class" => "DescriptionTop"),
435 array("type" => "sco_keyw", "class" => "Keywords"),
436 array("type" => "sco_obj", "class" => "Objective"),
437 array("type" => "sco_objt", "class" => "ObjectiveTop"),
438 array("type" => "sco_fmess", "class" => "FinalMessage"),
439 array("type" => "rte_menu", "class" => "RTEMenu"),
440 array("type" => "rte_menu", "class" => "RTELogo"),
441 array("type" => "rte_menu", "class" => "RTELinkBar"),
442 array("type" => "rte_mlink", "class" => "RTELink"),
443 array("type" => "rte_mlink", "class" => "RTELinkDisabled"),
444 array("type" => "rte_tree", "class" => "RTETree"),
445 array("type" => "rte_node", "class" => "RTECourse"),
446 array("type" => "rte_node", "class" => "RTEChapter"),
447 array("type" => "rte_node", "class" => "RTESco"),
448 array("type" => "rte_node", "class" => "RTEAsset"),
449 array("type" => "rte_node", "class" => "RTECourseDisabled"),
450 array("type" => "rte_node", "class" => "RTEChapterDisabled"),
451 array("type" => "rte_node", "class" => "RTEScoDisabled"),
452 array("type" => "rte_node", "class" => "RTEAssetDisabled"),
453 array("type" => "rte_status", "class" => "RTEAsset"),
454 array("type" => "rte_status", "class" => "RTECompleted"),
455 array("type" => "rte_status", "class" => "RTENotAttempted"),
456 array("type" => "rte_status", "class" => "RTERunning"),
457 array("type" => "rte_status", "class" => "RTEIncomplete"),
458 array("type" => "rte_status", "class" => "RTEPassed"),
459 array("type" => "rte_status", "class" => "RTEFailed"),
460 array("type" => "rte_status", "class" => "RTEBrowsed"),
461 array("type" => "rte_tlink", "class" => "RTETreeLink"),
462 array("type" => "rte_tlink", "class" => "RTETreeLinkDisabled"),
463 array("type" => "rte_tlink", "class" => "RTETreeCurrent"),
464 array("type" => "rte_tul", "class" => "RTETreeList"),
465 array("type" => "rte_tli", "class" => "RTETreeItem"),
466 array("type" => "rte_texp", "class" => "RTETreeExpanded"),
467 array("type" => "rte_texp", "class" => "RTETreeCollapsed"),
468 array("type" => "rte_tree", "class" => "RTETreeControl"),
469 array("type" => "rte_tclink", "class" => "RTETreeControlLink"),
470 array("type" => "rte_drag", "class" => "RTEDragBar"),
471 array("type" => "list_o", "class" => "NumberedList"),
472 array("type" => "list_u", "class" => "BulletedList"),
473 array("type" => "list_item", "class" => "StandardListItem"),
474 array("type" => "question", "class" => "Standard"),
475 array("type" => "question", "class" => "SingleChoice"),
476 array("type" => "question", "class" => "MultipleChoice"),
477 array("type" => "question", "class" => "TextQuestion"),
478 array("type" => "question", "class" => "OrderingQuestion"),
479 array("type" => "question", "class" => "MatchingQuestion"),
480 array("type" => "question", "class" => "ImagemapQuestion"),
481 array("type" => "question", "class" => "ErrorText"),
482 array("type" => "question", "class" => "TextSubset"),
483 array("type" => "question", "class" => "ClozeTest"),
484 array("type" => "qtitle", "class" => "Title"),
485 array("type" => "qanswer", "class" => "Answer"),
486 array("type" => "qimg", "class" => "QuestionImage"),
487 array("type" => "qimgd", "class" => "ImageDetailsLink"),
488 array("type" => "qordul", "class" => "OrderList"),
489 array("type" => "qordli", "class" => "OrderListItem"),
490 array("type" => "qordul", "class" => "OrderListHorizontal"),
491 array("type" => "qordli", "class" => "OrderListItemHorizontal"),
492 array("type" => "qetitem", "class" => "ErrorTextItem"),
493 array("type" => "qetitem", "class" => "ErrorTextSelected"),
494 array("type" => "qetcorr", "class" => "ErrorTextCorrected"),
495 array("type" => "qinput", "class" => "TextInput"),
496 array("type" => "qlinput", "class" => "LongTextInput"),
497 array("type" => "qsubmit", "class" => "Submit"),
498 array("type" => "qfeedr", "class" => "FeedbackRight"),
499 array("type" => "qfeedw", "class" => "FeedbackWrong"),
500 array("type" => "qover", "class" => "Correct"),
501 array("type" => "qover", "class" => "Inorrect"),
502 array("type" => "qover", "class" => "StatusMessage"),
503 array("type" => "qover", "class" => "WrongAnswersMessage"),
504 array("type" => "flist_cont", "class" => "FileListContainer"),
505 array("type" => "flist_head", "class" => "FileListHeading"),
506 array("type" => "flist", "class" => "FileList"),
507 array("type" => "flist_li", "class" => "FileListItem"),
508 array("type" => "flist_a", "class" => "FileListItemLink")
509 );
510
511 public static $templates = array(
512 "table" => array(
513 "table" => "table",
514 "caption" => "table_caption",
515 "row_head" => "table_cell",
516 "row_foot" => "table_cell",
517 "col_head" => "table_cell",
518 "col_foot" => "table_cell",
519 "odd_row" => "table_cell",
520 "even_row" => "table_cell",
521 "odd_col" => "table_cell",
522 "even_col" => "table_cell"),
523 "vaccordion" => array(
524 "va_cntr" => "va_cntr",
525 "va_icntr" => "va_icntr",
526 "va_ihead" => "va_ihead",
527 "va_iheada" => "va_iheada",
528 "va_ihcap" => "va_ihcap",
529 "va_icont" => "va_icont"
530 ),
531 "haccordion" => array(
532 "ha_cntr" => "ha_cntr",
533 "ha_icntr" => "ha_icntr",
534 "ha_ihead" => "ha_ihead",
535 "ha_iheada" => "ha_iheada",
536 "ha_ihcap" => "ha_ihcap",
537 "ha_icont" => "ha_icont"
538 ),
539 "carousel" => array(
540 "ca_cntr" => "ca_cntr",
541 "ca_icntr" => "ca_icntr",
542 "ca_ihead" => "ca_ihead",
543 "ca_icont" => "ca_icont"
544 )
545 );
546
547 // basic style xml file, image directory and dom
548 protected static $basic_style_file = "./libs/ilias/Style/basic_style/style.xml";
549 protected static $basic_style_zip = "./libs/ilias/Style/basic_style/style.zip";
550 protected static $basic_style_image_dir = "./libs/ilias/Style/basic_style/images";
551 protected static $basic_style_dom;
552
559 public function __construct($a_id = 0, $a_call_by_reference = false)
560 {
561 global $DIC;
562
563 $this->db = $DIC->database();
564 $this->lng = $DIC->language();
565 $this->type = "sty";
566 $this->style = array();
567 if ($a_call_by_reference) {
568 $this->ilias->raiseError("Can't instantiate style object via reference id.", $this->ilias->error_obj->FATAL);
569 }
570
571 parent::__construct($a_id, false);
572 }
573
579 public static function getBasicZipPath() : string
580 {
582 }
583
587 public function setRefId($a_ref_id)
588 {
589 $this->ilias->raiseError("Operation ilObjStyleSheet::setRefId() not allowed.", $this->ilias->error_obj->FATAL);
590 }
591
595 public function getRefId()
596 {
597 return "";
598 //$this->ilias->raiseError("Operation ilObjStyleSheet::getRefId() not allowed.",$this->ilias->error_obj->FATAL);
599 }
600
604 public function putInTree($a_parent_ref)
605 {
606 $this->ilias->raiseError("Operation ilObjStyleSheet::putInTree() not allowed.", $this->ilias->error_obj->FATAL);
607 }
608
612 public function createReference()
613 {
614 $this->ilias->raiseError("Operation ilObjStyleSheet::createReference() not allowed.", $this->ilias->error_obj->FATAL);
615 }
616
620 public function setUpToDate($a_up_to_date = true)
621 {
622 $this->up_to_date = $a_up_to_date;
623 }
624
628 public function getUpToDate()
629 {
630 return $this->up_to_date;
631 }
632
636 public function setScope($a_scope)
637 {
638 $this->scope = $a_scope;
639 }
640
644 public function getScope()
645 {
646 return $this->scope;
647 }
648
652 public static function _writeUpToDate($a_id, $a_up_to_date)
653 {
654 global $DIC;
655
656 $ilDB = $DIC->database();
657
658 $q = "UPDATE style_data SET uptodate = " .
659 $ilDB->quote((int) $a_up_to_date, "integer") .
660 " WHERE id = " . $ilDB->quote($a_id, "integer");
661 $ilDB->manipulate($q);
662 }
663
667 public static function _lookupUpToDate($a_id)
668 {
669 global $DIC;
670
671 $ilDB = $DIC->database();
672
673 $q = "SELECT uptodate FROM style_data " .
674 " WHERE id = " . $ilDB->quote($a_id, "integer");
675 $res = $ilDB->query($q);
676 $sty = $ilDB->fetchAssoc($res);
677
678 return (boolean) $sty["uptodate"];
679 }
680
684 public static function _writeStandard($a_id, $a_std)
685 {
686 global $DIC;
687
688 $ilDB = $DIC->database();
689
690 $q = "UPDATE style_data SET standard = " .
691 $ilDB->quote((int) $a_std, "integer") .
692 " WHERE id = " . $ilDB->quote($a_id, "integer");
693 $ilDB->manipulate($q);
694 }
695
699 public static function _writeScope($a_id, $a_scope)
700 {
701 global $DIC;
702
703 $ilDB = $DIC->database();
704
705 $q = "UPDATE style_data SET category = " .
706 $ilDB->quote((int) $a_scope, "integer") .
707 " WHERE id = " . $ilDB->quote($a_id, "integer");
708 $ilDB->manipulate($q);
709 }
710
714 public static function _lookupStandard($a_id)
715 {
716 global $DIC;
717
718 $ilDB = $DIC->database();
719
720 $q = "SELECT * FROM style_data " .
721 " WHERE id = " . $ilDB->quote($a_id, "integer");
722 $res = $ilDB->query($q);
723 $sty = $ilDB->fetchAssoc($res);
724
725 return (boolean) $sty["standard"];
726 }
727
731 public static function _writeActive($a_id, $a_active)
732 {
733 global $DIC;
734
735 $ilDB = $DIC->database();
736
737 $q = "UPDATE style_data SET active = " .
738 $ilDB->quote((int) $a_active, "integer") .
739 " WHERE id = " . $ilDB->quote($a_id, "integer");
740 $ilDB->manipulate($q);
741 }
742
746 public static function _lookupActive($a_id)
747 {
748 global $DIC;
749
750 $ilDB = $DIC->database();
751
752 $q = "SELECT * FROM style_data " .
753 " WHERE id = " . $ilDB->quote($a_id, "integer");
754 $res = $ilDB->query($q);
755 $sty = $ilDB->fetchAssoc($res);
756
757 return (boolean) $sty["active"];
758 }
759
763 public static function _getStandardStyles(
764 $a_exclude_default_style = false,
765 $a_include_deactivated = false,
766 $a_scope = 0
767 ) {
768 global $DIC;
769
770 $ilDB = $DIC->database();
771 $ilSetting = $DIC->settings();
772 $tree = $DIC->repositoryTree();
773
774 $default_style = $ilSetting->get("default_content_style_id");
775
776 $and_str = "";
777 if (!$a_include_deactivated) {
778 $and_str = " AND active = 1";
779 }
780
781 $q = "SELECT * FROM style_data " .
782 " WHERE standard = 1" . $and_str;
783 $res = $ilDB->query($q);
784 $styles = array();
785 while ($sty = $ilDB->fetchAssoc($res)) {
786 if (!$a_exclude_default_style || $default_style != $sty["id"]) {
787 // check scope
788 if ($a_scope > 0 && $sty["category"] > 0) {
789 if ($tree->isInTree($sty["category"]) &&
790 $tree->isInTree($a_scope)) {
791 $path = $tree->getPathId($a_scope);
792 if (!in_array($sty["category"], $path)) {
793 continue;
794 }
795 }
796 }
797 $styles[$sty["id"]] = ilObject::_lookupTitle($sty["id"]);
798 }
799 }
800
801 return $styles;
802 }
803
804
809 public static function _getClonableContentStyles()
810 {
811 global $DIC;
812
813 $ilAccess = $DIC->access();
814 $ilDB = $DIC->database();
815
816 $clonable_styles = array();
817
818 $q = "SELECT * FROM style_data";
819 $style_set = $ilDB->query($q);
820 while ($style_rec = $ilDB->fetchAssoc($style_set)) {
821 $clonable = false;
822 if ($style_rec["standard"] == 1) {
823 if ($style_rec["active"] == 1) {
824 $clonable = true;
825 }
826 } else {
827 include_once("./Modules/LearningModule/classes/class.ilObjContentObject.php");
828 $obj_ids = ilObjContentObject::_lookupContObjIdByStyleId($style_rec["id"]);
829 if (count($obj_ids) == 0) {
830 $obj_ids = self::lookupObjectForStyle($style_rec["id"]);
831 }
832 foreach ($obj_ids as $id) {
834 foreach ($ref as $ref_id) {
835 if ($ilAccess->checkAccess("write", "", $ref_id)) {
836 $clonable = true;
837 }
838 }
839 }
840 }
841 if ($clonable) {
842 $clonable_styles[$style_rec["id"]] =
843 ilObject::_lookupTitle($style_rec["id"]);
844 }
845 }
846
847 asort($clonable_styles);
848
849 return $clonable_styles;
850 }
851
855 public function assignMetaData(&$a_meta_data)
856 {
857 $this->meta_data = $a_meta_data;
858 }
859
863 public static function _getBasicStyleDom()
864 {
865 if (!is_object(self::$basic_style_dom)) {
866 self::$basic_style_dom = new DOMDocument();
867 self::$basic_style_dom->load(self::$basic_style_file);
868 }
869
871 }
872
876 public function &getMetaData()
877 {
878 return $this->meta_data;
879 }
880
885 public static function getBasicImageDir()
886 {
888 }
889
890
894 public function create($a_from_style = 0, $a_import_mode = false)
895 {
897
898 parent::create();
899
900 if ($a_from_style == 0) {
901 if (!$a_import_mode) {
902 // copy styles from basic style
903 $this->createFromXMLFile(self::$basic_style_file, true);
904
905 // copy images from basic style
906 $this->createImagesDirectory();
908 self::$basic_style_image_dir,
909 $this->getImagesDirectory()
910 );
911 } else {
912 // add style_data record
913 $q = "INSERT INTO style_data (id, uptodate, category) VALUES " .
914 "(" . $ilDB->quote($this->getId(), "integer") . ", 0," .
915 $ilDB->quote((int) $this->getScope(), "integer") . ")";
916 $ilDB->manipulate($q);
918 }
919 } else {
920 // get style parameter records
921 $def = array();
922 $q = "SELECT * FROM style_parameter WHERE style_id = " .
923 $ilDB->quote($a_from_style, "integer");
924 $par_set = $ilDB->query($q);
925 while ($par_rec = $ilDB->fetchAssoc($par_set)) {
926 $def[] = array("tag" => $par_rec["tag"], "class" => $par_rec["class"],
927 "parameter" => $par_rec["parameter"], "value" => $par_rec["value"],
928 "type" => $par_rec["type"], "mq_id" => $par_rec["mq_id"], "custom" => $par_rec["custom"]);
929 }
930
931 // get style characteristics records
932 $chars = array();
933 $q = "SELECT * FROM style_char WHERE style_id = " .
934 $ilDB->quote($a_from_style, "integer");
935 $par_set = $ilDB->query($q);
936 while ($par_rec = $ilDB->fetchAssoc($par_set)) {
937 $chars[] = array("type" => $par_rec["type"], "characteristic" => $par_rec["characteristic"]);
938 }
939
940
941 // copy media queries
942 $from_style = new ilObjStyleSheet($a_from_style);
943 $mqs = $from_style->getMediaQueries();
944 $mq_mapping = array();
945 foreach ($mqs as $mq) {
946 $nid = $this->addMediaQuery($mq["mquery"]);
947 $mq_mapping[$mq["id"]] = $nid;
948 }
949
950 // default style settings
951 foreach ($def as $sty) {
952 $id = $ilDB->nextId("style_parameter");
953 $q = "INSERT INTO style_parameter (id, style_id, tag, class, parameter, value, type, mq_id, custom) VALUES " .
954 "(" .
955 $ilDB->quote($id, "integer") . "," .
956 $ilDB->quote($this->getId(), "integer") . "," .
957 $ilDB->quote($sty["tag"], "text") . "," .
958 $ilDB->quote($sty["class"], "text") . "," .
959 $ilDB->quote($sty["parameter"], "text") . "," .
960 $ilDB->quote($sty["value"], "text") . "," .
961 $ilDB->quote($sty["type"], "text") . "," .
962 $ilDB->quote((int) $mq_mapping[$sty["mq_id"]], "integer") . "," .
963 $ilDB->quote($sty["custom"], "integer") .
964 ")";
965 $ilDB->manipulate($q);
966 }
967
968 // insert style characteristics
969 foreach ($chars as $char) {
970 $q = "INSERT INTO style_char (style_id, type, characteristic) VALUES " .
971 "(" . $ilDB->quote($this->getId(), "integer") . "," .
972 $ilDB->quote($char["type"], "text") . "," .
973 $ilDB->quote($char["characteristic"], "text") . ")";
974 $ilDB->manipulate($q);
975 }
976
977 // add style_data record
978 $q = "INSERT INTO style_data (id, uptodate, category) VALUES " .
979 "(" . $ilDB->quote($this->getId(), "integer") . ", 0," .
980 $ilDB->quote((int) $this->getScope(), "integer") . ")";
981 $ilDB->manipulate($q);
982
983 // copy images
984 $this->createImagesDirectory();
986 $from_style->getImagesDirectory(),
987 $this->getImagesDirectory()
988 );
989
990 // copy colors
991 $colors = $from_style->getColors();
992 foreach ($colors as $c) {
993 $this->addColor($c["name"], $c["code"]);
994 }
995
996 // copy templates
998 foreach ($tcts as $tct => $v) {
999 $templates = $from_style->getTemplates($tct);
1000 foreach ($templates as $t) {
1001 $this->addTemplate($tct, $t["name"], $t["classes"]);
1002 }
1003 }
1004 }
1005
1006 $this->read();
1007 if (!$a_import_mode) {
1008 $this->writeCSSFile();
1009 }
1010 }
1011
1015 public function deleteCharacteristic($a_type, $a_tag, $a_class)
1016 {
1017 $ilDB = $this->db;
1018
1019 // check, if characteristic is not a core style
1021 if (empty($core_styles[$a_type . "." . $a_tag . "." . $a_class])) {
1022 // delete characteristic record
1023 $st = $ilDB->manipulateF(
1024 "DELETE FROM style_char WHERE style_id = %s AND type = %s AND characteristic = %s",
1025 array("integer", "text", "text"),
1026 array($this->getId(), $a_type, $a_class)
1027 );
1028
1029 // delete parameter records
1030 $st = $ilDB->manipulateF(
1031 "DELETE FROM style_parameter WHERE style_id = %s AND tag = %s AND type = %s AND class = %s",
1032 array("integer", "text", "text", "text"),
1033 array($this->getId(), $a_tag, $a_type, $a_class)
1034 );
1035 }
1036
1037 $this->setUpToDate(false);
1038 $this->_writeUpToDate($this->getId(), false);
1039 }
1040
1044 public function characteristicExists($a_char, $a_style_type)
1045 {
1046 $ilDB = $this->db;
1047
1048 $set = $ilDB->queryF(
1049 "SELECT style_id FROM style_char WHERE style_id = %s AND characteristic = %s AND type = %s",
1050 array("integer", "text", "text"),
1051 array($this->getId(), $a_char, $a_style_type)
1052 );
1053 if ($rec = $ilDB->fetchAssoc($set)) {
1054 return true;
1055 }
1056 return false;
1057 }
1058
1062 public function addCharacteristic($a_type, $a_char, $a_hidden = false)
1063 {
1064 $ilDB = $this->db;
1065
1066 // delete characteristic record
1067 $ilDB->manipulateF(
1068 "INSERT INTO style_char (style_id, type, characteristic, hide)" .
1069 " VALUES (%s,%s,%s,%s) ",
1070 array("integer", "text", "text", "integer"),
1071 array($this->getId(), $a_type, $a_char, $a_hidden)
1072 );
1073
1074 $this->setUpToDate(false);
1075 $this->_writeUpToDate($this->getId(), false);
1076 }
1077
1084 public function copyCharacteristic(
1085 $a_from_style_id,
1086 $a_from_type,
1087 $a_from_char,
1088 $a_to_char
1089 ) {
1090 $ilDB = $this->db;
1091
1092 if (!$this->characteristicExists($a_to_char, $a_from_type)) {
1093 $this->addCharacteristic($a_from_type, $a_to_char);
1094 }
1095 $this->deleteStyleParOfChar($a_from_type, $a_to_char);
1096
1097 $from_style = new ilObjStyleSheet($a_from_style_id);
1098
1099 // todo fix using mq_id
1100 $pars = $from_style->getParametersOfClass($a_from_type, $a_from_char);
1101
1102 $colors = array();
1103 foreach ($pars as $p => $v) {
1104 if (substr($v, 0, 1) == "!") {
1105 $colors[] = substr($v, 1);
1106 }
1107 $this->replaceStylePar(
1108 ilObjStyleSheet::_determineTag($a_from_type),
1109 $a_to_char,
1110 $p,
1111 $v,
1112 $a_from_type
1113 );
1114 }
1115
1116 // copy colors
1117 foreach ($colors as $c) {
1118 if (!$this->colorExists($c)) {
1119 $this->addColor($c, $from_style->getColorCodeForName($c));
1120 }
1121 }
1122 }
1123
1127 public function getCharacteristics($a_type = "", $a_no_hidden = false, $a_include_core = true)
1128 {
1129 $chars = array();
1130
1131 if ($a_type == "") {
1132 $chars = $this->chars;
1133 }
1134 if (is_array($this->chars_by_type[$a_type])) {
1135 foreach ($this->chars_by_type[$a_type] as $c) {
1136 if ($a_include_core || !self::isCoreStyle($a_type, $c)) {
1137 $chars[] = $c;
1138 }
1139 }
1140 }
1141
1142 if ($a_no_hidden) {
1143 foreach ($chars as $k => $char) {
1144 if ($a_type == "" && $this->hidden_chars[$char["type"] . ":" . $char["class"]]) {
1145 unset($chars[$k]);
1146 } elseif ($this->hidden_chars[$a_type . ":" . $char]) {
1147 unset($chars[$k]);
1148 }
1149 }
1150 }
1151
1152 return $chars;
1153 }
1154
1158 public function setCharacteristics($a_chars)
1159 {
1160 $this->chars = $a_chars;
1161 // $this->chars_by_type[$a_type];
1162 }
1163
1167 public function saveHideStatus($a_type, $a_char, $a_hide)
1168 {
1169 $ilDB = $this->db;
1170
1171 $ilDB->manipulate(
1172 "UPDATE style_char SET " .
1173 " hide = " . $ilDB->quote((int) $a_hide, "integer") .
1174 " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1175 " type = " . $ilDB->quote($a_type, "text") . " AND " .
1176 " characteristic = " . $ilDB->quote($a_char, "text")
1177 );
1178 }
1179
1183 public function getHideStatus($a_type, $a_char)
1184 {
1185 $ilDB = $this->db;
1186
1187 $set = $ilDB->query(
1188 "SELECT hide FROM style_char " .
1189 " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1190 " type = " . $ilDB->quote($a_type, "text") . " AND " .
1191 " characteristic = " . $ilDB->quote($a_char, "text")
1192 );
1193 $rec = $ilDB->fetchAssoc($set);
1194
1195 return $rec["hide"];
1196 }
1197
1204 public function ilClone()
1205 {
1206 $lng = $this->lng;
1207
1208 $lng->loadLanguageModule("style");
1209
1210 $new_obj = new ilObjStyleSheet();
1211 $new_obj->setTitle($this->getTitle() . " (" . $lng->txt("sty_acopy") . ")");
1212 $new_obj->setType($this->getType());
1213 $new_obj->setDescription($this->getDescription());
1214 $new_obj->create($this->getId());
1215
1216 $new_obj->writeStyleSetting(
1217 "disable_auto_margins",
1218 $this->lookupStyleSetting("disable_auto_margins")
1219 );
1220
1221 return $new_obj->getId();
1222 }
1223
1227 public function copyImagesToDir($a_target)
1228 {
1229 ilUtil::rCopy($this->getImagesDirectory(), $a_target);
1230 }
1231
1241 public function addParameter($a_tag, $a_par, $a_type, $a_mq_id = 0, $a_custom = false)
1242 {
1243 $ilDB = $this->db;
1244
1245 $avail_params = $this->getAvailableParameters();
1246 $tag = explode(".", $a_tag);
1247 $value = $avail_params[$a_par][0];
1248 $id = $ilDB->nextId("style_parameter");
1249 $q = "INSERT INTO style_parameter (id,style_id, type, tag, class, parameter, value, mq_id, custom) VALUES " .
1250 "(" .
1251 $ilDB->quote($id, "integer") . "," .
1252 $ilDB->quote($this->getId(), "integer") . "," .
1253 $ilDB->quote($a_type, "text") . "," .
1254 $ilDB->quote($tag[0], "text") . "," .
1255 $ilDB->quote($tag[1], "text") . "," .
1256 $ilDB->quote($a_par, "text") . "," .
1257 $ilDB->quote($value, "text") . "," .
1258 $ilDB->quote($a_mq_id, "integer") . "," .
1259 $ilDB->quote($a_custom, "integer") .
1260 ")";
1261 $ilDB->manipulate($q);
1262 $this->read();
1263 $this->writeCSSFile();
1264 }
1265
1270 public function createImagesDirectory()
1271 {
1273 }
1274
1279 public static function _createImagesDirectory($a_style_id)
1280 {
1281 global $DIC;
1282
1283 $ilErr = $DIC["ilErr"];
1284
1285 $sty_data_dir = ilUtil::getWebspaceDir() . "/sty";
1286 ilUtil::makeDir($sty_data_dir);
1287 if (!is_writable($sty_data_dir)) {
1288 $ilErr->raiseError("Style data directory (" . $sty_data_dir
1289 . ") not writeable.", $ilErr->FATAL);
1290 }
1291
1292 $style_dir = $sty_data_dir . "/sty_" . $a_style_id;
1293 ilUtil::makeDir($style_dir);
1294 if (!@is_dir($style_dir)) {
1295 $ilErr->raiseError("Creation of style directory failed (" .
1296 $style_dir . ").", $ilErr->FATAL);
1297 }
1298
1299 // create images subdirectory
1300 $im_dir = $style_dir . "/images";
1301 ilUtil::makeDir($im_dir);
1302 if (!@is_dir($im_dir)) {
1303 $ilErr->raiseError("Creation of Import Directory failed (" .
1304 $im_dir . ").", $ilErr->FATAL);
1305 }
1306
1307 // create thumbnails directory
1308 $thumb_dir = $style_dir . "/images/thumbnails";
1309 ilUtil::makeDir($thumb_dir);
1310 if (!@is_dir($thumb_dir)) {
1311 $ilErr->raiseError("Creation of Import Directory failed (" .
1312 $thumb_dir . ").", $ilErr->FATAL);
1313 }
1314 }
1315
1319 public function getImagesDirectory()
1320 {
1322 }
1323
1327 public static function _getImagesDirectory($a_style_id)
1328 {
1329 return ilUtil::getWebspaceDir() . "/sty/sty_" . $a_style_id .
1330 "/images";
1331 }
1332
1336 public function getThumbnailsDirectory()
1337 {
1338 return $this->getImagesDirectory() .
1339 "/thumbnails";
1340 }
1341
1345 public function getImages()
1346 {
1347 $dir = $this->getImagesDirectory();
1348 $images = array();
1349 if (is_dir($dir)) {
1350 $entries = ilUtil::getDir($dir);
1351 foreach ($entries as $entry) {
1352 if (substr($entry["entry"], 0, 1) == ".") {
1353 continue;
1354 }
1355 if ($entry["type"] != "dir") {
1356 $images[] = $entry;
1357 }
1358 }
1359 }
1360
1361 return $images;
1362 }
1363
1367 public function uploadImage($a_file)
1368 {
1369 $this->createImagesDirectory();
1371 $a_file["tmp_name"],
1372 $a_file["name"],
1373 $this->getImagesDirectory() . "/" . $a_file["name"]
1374 );
1376 $this->getImagesDirectory() . "/" . $a_file["name"],
1377 $this->getThumbnailsDirectory() . "/" . $a_file["name"],
1378 75,
1379 75
1380 );
1381 }
1382
1386 public function deleteImage($a_file)
1387 {
1388 if (is_file($this->getImagesDirectory() . "/" . $a_file)) {
1389 unlink($this->getImagesDirectory() . "/" . $a_file);
1390 }
1391 if (is_file($this->getThumbnailsDirectory() . "/" . $a_file)) {
1392 unlink($this->getThumbnailsDirectory() . "/" . $a_file);
1393 }
1394 }
1395
1401 public function deleteParameter($a_id)
1402 {
1403 $ilDB = $this->db;
1404
1405 $q = "DELETE FROM style_parameter WHERE id = " .
1406 $ilDB->quote($a_id, "integer");
1407 $ilDB->query($q);
1408 }
1409
1419 public function deleteStylePar($a_tag, $a_class, $a_par, $a_type, $a_mq_id = 0, $a_custom = false)
1420 {
1421 $ilDB = $this->db;
1422
1423 $q = "DELETE FROM style_parameter WHERE " .
1424 " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1425 " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1426 " class = " . $ilDB->quote($a_class, "text") . " AND " .
1427 " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1428 " custom = " . $ilDB->quote($a_custom, "integer") . " AND " .
1429 " " . $ilDB->equals("type", $a_type, "text", true) . " AND " .
1430 " parameter = " . $ilDB->quote($a_par, "text");
1431
1432 $ilDB->manipulate($q);
1433 }
1434
1444 public function deleteCustomStylePars($a_tag, $a_class, $a_type, $a_mq_id = 0)
1445 {
1446 $ilDB = $this->db;
1447
1448 $q = "DELETE FROM style_parameter WHERE " .
1449 " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1450 " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1451 " class = " . $ilDB->quote($a_class, "text") . " AND " .
1452 " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1453 " custom = " . $ilDB->quote(1, "integer") . " AND " .
1454 " " . $ilDB->equals("type", $a_type, "text", true);
1455
1456 $ilDB->manipulate($q);
1457 }
1458
1467 public function deleteStyleParOfChar($a_type, $a_class)
1468 {
1469 $ilDB = $this->db;
1470
1471 $q = "DELETE FROM style_parameter WHERE " .
1472 " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1473 " class = " . $ilDB->quote($a_class, "text") . " AND " .
1474 " " . $ilDB->equals("type", $a_type, "text", true);
1475
1476 $ilDB->manipulate($q);
1477 }
1478
1479
1483 public function delete()
1484 {
1485 $ilDB = $this->db;
1486
1487 // delete object
1488 parent::delete();
1489
1490 // check whether this style is global default
1491 $def_style = $this->ilias->getSetting("default_content_style_id");
1492 if ($def_style == $this->getId()) {
1493 $this->ilias->deleteSetting("default_content_style_id");
1494 }
1495
1496 // check whether this style is global fixed
1497 $fixed_style = $this->ilias->getSetting("fixed_content_style_id");
1498 if ($fixed_style == $this->getId()) {
1499 $this->ilias->deleteSetting("fixed_content_style_id");
1500 }
1501
1502 // delete style parameter
1503 $q = "DELETE FROM style_parameter WHERE style_id = " .
1504 $ilDB->quote($this->getId(), "integer");
1505 $ilDB->manipulate($q);
1506
1507 // delete style file
1508 $css_file_name = ilUtil::getWebspaceDir() . "/css/style_" . $this->getId() . ".css";
1509 if (is_file($css_file_name)) {
1510 unlink($css_file_name);
1511 }
1512
1513 // delete media queries
1514 $ilDB->manipulate(
1515 "DELETE FROM sty_media_query WHERE " .
1516 " style_id = " . $ilDB->quote($this->getId(), "integer")
1517 );
1518
1519 // delete entries in learning modules
1520 include_once("./Modules/LearningModule/classes/class.ilObjContentObject.php");
1522
1523 // delete style data record
1524 $q = "DELETE FROM style_data WHERE id = " .
1525 $ilDB->quote($this->getId(), "integer");
1526 $ilDB->manipulate($q);
1527 }
1528
1529
1533 public function read()
1534 {
1535 $ilDB = $this->db;
1536
1537 parent::read();
1538
1539 $q = "SELECT * FROM style_parameter WHERE style_id = " .
1540 $ilDB->quote($this->getId(), "integer") . " ORDER BY tag, class, type, mq_id ";
1541 $style_set = $ilDB->query($q);
1542 $ctag = "";
1543 $cclass = "";
1544 $ctype = "";
1545 $cmq_id = 0;
1546 $this->style = array();
1547 // workaround for bug #17586, see also http://stackoverflow.com/questions/3066356/multiple-css-classes-properties-overlapping-based-on-the-order-defined
1548 // e.g. ha_iheada must be written after ha_ihead, since they are acting on the same dom node
1549 // styles that must be added at the end
1550 $this->end_styles = array();
1551 while ($style_rec = $ilDB->fetchAssoc($style_set)) {
1552 if ($style_rec["tag"] != $ctag || $style_rec["class"] != $cclass
1553 || $style_rec["type"] != $ctype || $style_rec["mq_id"] != $cmq_id) {
1554 // add current tag array to style array
1555 if (is_array($tag)) {
1556 if (in_array($ctype, array("ha_iheada", "va_iheada"))) {
1557 $this->end_styles[] = $tag;
1558 } else {
1559 $this->style[] = $tag;
1560 }
1561 }
1562 $tag = array();
1563 }
1564 $ctag = $style_rec["tag"];
1565 $cclass = $style_rec["class"];
1566 $ctype = $style_rec["type"];
1567 $cmq_id = $style_rec["mq_id"];
1568 $tag[] = $style_rec;
1569 // added $cmq_id
1570 $this->style_class[$ctype][$cclass][$cmq_id][$style_rec["parameter"]] = $style_rec["value"];
1571 }
1572 if (is_array($tag)) {
1573 $this->style[] = $tag;
1574 }
1575 foreach ($this->end_styles as $s) {
1576 $this->style[] = $s;
1577 }
1578 //var_dump($this->style_class);
1579 $q = "SELECT * FROM style_data WHERE id = " .
1580 $ilDB->quote($this->getId(), "integer");
1581 $res = $ilDB->query($q);
1582 $sty = $ilDB->fetchAssoc($res);
1583 $this->setUpToDate((boolean) $sty["uptodate"]);
1584 $this->setScope($sty["category"]);
1585
1586 // get style characteristics records
1587 $this->chars = array();
1588 $this->chars_by_type = array();
1589 $q = "SELECT * FROM style_char WHERE style_id = " .
1590 $ilDB->quote($this->getId(), "integer") .
1591 " ORDER BY type ASC, characteristic ASC";
1592 $par_set = $ilDB->query($q);
1593 while ($par_rec = $ilDB->fetchAssoc($par_set)) {
1594 $this->chars[] = array("type" => $par_rec["type"], "class" => $par_rec["characteristic"], "hide" => $par_rec["hide"]);
1595 $this->chars_by_type[$par_rec["type"]][] = $par_rec["characteristic"];
1596 if ($par_rec["hide"]) {
1597 $this->hidden_chars[$par_rec["type"] . ":" . $par_rec["characteristic"]] = true;
1598 }
1599 }
1600 // var_dump($this->style); exit;
1601 }
1602
1606 public function writeCSSFile($a_target_file = "", $a_image_dir = "")
1607 {
1608 $style = $this->getStyle();
1609
1610 if (!is_dir(ilUtil::getWebspaceDir() . "/css")) {
1612 }
1613
1614 if ($a_target_file == "") {
1615 $css_file_name = ilUtil::getWebspaceDir() . "/css/style_" . $this->getId() . ".css";
1616 } else {
1617 $css_file_name = $a_target_file;
1618 }
1619 $css_file = fopen($css_file_name, "w");
1620
1621 $page_background = "";
1622
1623 $mqs = array(array("mquery" => "", "id" => 0));
1624 foreach ($this->getMediaQueries() as $mq) {
1625 $mqs[] = $mq;
1626 }
1627
1628 // iterate all media queries
1629 foreach ($mqs as $mq) {
1630 if ($mq["id"] > 0) {
1631 fwrite($css_file, "@media " . $mq["mquery"] . " {\n");
1632 }
1633 reset($style);
1634 foreach ($style as $tag) {
1635 if ($tag[0]["mq_id"] != $mq["id"]) {
1636 continue;
1637 }
1638 fwrite($css_file, $tag[0]["tag"] . ".ilc_" . $tag[0]["type"] . "_" . $tag[0]["class"] . "\n");
1639 // echo "<br>";
1640 // var_dump($tag[0]["type"]);
1641 if ($tag[0]["tag"] == "td") {
1642 fwrite($css_file, ",th" . ".ilc_" . $tag[0]["type"] . "_" . $tag[0]["class"] . "\n");
1643 }
1644 if (in_array($tag[0]["tag"], array("h1", "h2", "h3"))) {
1645 fwrite($css_file, ",div.ilc_text_block_" . $tag[0]["class"] . "\n");
1646 fwrite($css_file, ",body.ilc_text_block_" . $tag[0]["class"] . "\n");
1647 }
1648 if ($tag[0]["type"] == "section") { // sections can use a tags, if links are used
1649 fwrite($css_file, ",a.ilc_" . $tag[0]["type"] . "_" . $tag[0]["class"] . "\n");
1650 }
1651 if ($tag[0]["type"] == "text_block") {
1652 fwrite($css_file, ",body.ilc_text_block_" . $tag[0]["class"] . "\n");
1653 }
1654 fwrite($css_file, "{\n");
1655
1656 // collect table border attributes
1657 $t_border = array();
1658
1659 foreach ($tag as $par) {
1660 $cur_par = $par["parameter"];
1661 $cur_val = $par["value"];
1662
1663 // replace named colors
1664 if (is_int(strpos($cur_par, "color")) && substr(trim($cur_val), 0, 1) == "!") {
1665 $cur_val = $this->getColorCodeForName(substr($cur_val, 1));
1666 }
1667
1668 if ($tag[0]["type"] == "table" && is_int(strpos($par["parameter"], "border"))) {
1669 $t_border[$cur_par] = $cur_val;
1670 }
1671
1672 if (in_array($cur_par, array("background-image", "list-style-image"))) {
1673 if (is_int(strpos($cur_val, "/"))) { // external
1674 $cur_val = "url(" . $cur_val . ")";
1675 } else { // internal
1676 if ($a_image_dir == "") {
1677 $cur_val = "url(../sty/sty_" . $this->getId() . "/images/" . $cur_val . ")";
1678 } else {
1679 $cur_val = "url(" . $a_image_dir . "/" . $cur_val . ")";
1680 }
1681 }
1682 }
1683
1684 if ($cur_par == "opacity") {
1685 $cur_val = ((int) $cur_val) / 100;
1686 }
1687
1688 fwrite($css_file, "\t" . $cur_par . ": " . $cur_val . ";\n");
1689
1690 // IE6 fix for minimum height
1691 if ($cur_par == "min-height") {
1692 fwrite($css_file, "\t" . "height" . ": " . "auto !important" . ";\n");
1693 fwrite($css_file, "\t" . "height" . ": " . $cur_val . ";\n");
1694 }
1695
1696 // opacity fix
1697 if ($cur_par == "opacity") {
1698 fwrite($css_file, "\t" . '-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=' . ($cur_val * 100) . ')"' . ";\n");
1699 fwrite($css_file, "\t" . 'filter: alpha(opacity=' . ($cur_val * 100) . ')' . ";\n");
1700 fwrite($css_file, "\t" . '-moz-opacity: ' . $cur_val . ";\n");
1701 }
1702
1703 // transform fix
1704 if ($cur_par == "transform") {
1705 fwrite($css_file, "\t" . '-webkit-transform: ' . $cur_val . ";\n");
1706 fwrite($css_file, "\t" . '-moz-transform: ' . $cur_val . ";\n");
1707 fwrite($css_file, "\t" . '-ms-transform: ' . $cur_val . ";\n");
1708 }
1709
1710 // transform-origin fix
1711 if ($cur_par == "transform-origin") {
1712 fwrite($css_file, "\t" . '-webkit-transform-origin: ' . $cur_val . ";\n");
1713 fwrite($css_file, "\t" . '-moz-transform-origin: ' . $cur_val . ";\n");
1714 fwrite($css_file, "\t" . '-ms-transform-origin: ' . $cur_val . ";\n");
1715 }
1716
1717 // save page background
1718 if ($tag[0]["tag"] == "div" && $tag[0]["class"] == "Page"
1719 && $cur_par == "background-color") {
1720 $page_background = $cur_val;
1721 }
1722 }
1723 fwrite($css_file, "}\n");
1724 fwrite($css_file, "\n");
1725
1726 // use table border attributes for th td as well
1727 /* if ($tag[0]["type"] == "table")
1728 {
1729 if (count($t_border) > 0)
1730 {
1731 fwrite ($css_file, $tag[0]["tag"].".ilc_".$tag[0]["type"]."_".$tag[0]["class"]." th,".
1732 $tag[0]["tag"].".ilc_".$tag[0]["type"]."_".$tag[0]["class"]." td\n");
1733 fwrite ($css_file, "{\n");
1734 foreach ($t_border as $p => $v)
1735 {
1736 // fwrite ($css_file, "\t".$p.": ".$v.";\n");
1737 }
1738 fwrite ($css_file, "}\n");
1739 fwrite ($css_file, "\n");
1740 }
1741 }*/
1742 }
1743
1744 if ($page_background != "") {
1745 fwrite($css_file, "td.ilc_Page\n");
1746 fwrite($css_file, "{\n");
1747 fwrite($css_file, "\t" . "background-color: " . $page_background . ";\n");
1748 fwrite($css_file, "}\n");
1749 }
1750 if ($mq["id"] > 0) {
1751 fwrite($css_file, "}\n");
1752 }
1753 }
1754 fclose($css_file);
1755 // exit;
1756 $this->setUpToDate(true);
1757 $this->_writeUpToDate($this->getId(), true);
1758 }
1759
1766 public static function getEffectiveContentStyleId($a_style_id, $a_type = "")
1767 {
1768 global $DIC;
1769
1770 $ilSetting = $DIC->settings();
1771
1772 // check global fixed content style
1773 $fixed_style = $ilSetting->get("fixed_content_style_id");
1774 if ($fixed_style > 0) {
1775 $a_style_id = $fixed_style;
1776 }
1777
1778 // check global default style
1779 if ($a_style_id <= 0) {
1780 $a_style_id = $ilSetting->get("default_content_style_id");
1781 }
1782
1783 if ($a_style_id > 0 && ilObject::_lookupType($a_style_id) == "sty") {
1784 return $a_style_id;
1785 }
1786
1787 return 0;
1788 }
1789
1796 public function getParametersOfClass($a_type, $a_class, $a_mq_id = 0)
1797 {
1798 if (is_array($this->style_class[$a_type][$a_class][$a_mq_id])) {
1799 return $this->style_class[$a_type][$a_class][$a_mq_id];
1800 }
1801 return array();
1802 }
1803
1809 public static function getContentStylePath($a_style_id, $add_random = true, $add_token = true)
1810 {
1811 global $DIC;
1812
1813 $ilSetting = $DIC->settings();
1814
1815 $random = new \ilRandom();
1816 $rand = $random->int(1, 999999);
1817
1818
1819 // check global fixed content style
1820 $fixed_style = $ilSetting->get("fixed_content_style_id");
1821 if ($fixed_style > 0) {
1822 $a_style_id = $fixed_style;
1823 }
1824
1825 // check global default style
1826 if ($a_style_id <= 0) {
1827 $a_style_id = $ilSetting->get("default_content_style_id");
1828 }
1829
1830 if ($a_style_id > 0 && ilObject::_exists($a_style_id)) {
1831 // check whether file is up to date
1832 if (!ilObjStyleSheet::_lookupUpToDate($a_style_id)) {
1833 $style = new ilObjStyleSheet($a_style_id);
1834 $style->writeCSSFile();
1835 }
1836
1837 $path = ilUtil::getWebspaceDir("output") . "/css/style_" . $a_style_id . ".css";
1838 if ($add_random) {
1839 $path .= "?dummy=$rand";
1840 }
1841 if ($add_token) {
1842 require_once('./Services/WebAccessChecker/classes/class.ilWACSignedPath.php');
1843 $path = ilWACSignedPath::signFile($path);
1844 }
1845
1846 return $path;
1847 } else { // todo: work this out
1848 return "./Services/COPage/css/content.css";
1849 }
1850 }
1851
1857 public static function getContentPrintStyle()
1858 {
1859 return "./Services/COPage/css/print_content.css";
1860 }
1861
1867 public static function getSyntaxStylePath()
1868 {
1869 return "./Services/COPage/css/syntaxhighlight.css";
1870 }
1871
1877 public static function getPlaceHolderStylePath()
1878 {
1879 return "./Services/COPage/css/placeholder.css";
1880 }
1881
1882 public function update()
1883 {
1884 $ilDB = $this->db;
1885
1886 parent::update();
1887 $this->read(); // this could be done better
1888 $this->writeCSSFile();
1889
1890 $q = "UPDATE style_data " .
1891 "SET category = " . $ilDB->quote((int) $this->getScope(), "integer") .
1892 " WHERE id = " . $ilDB->quote($this->getId(), "integer");
1893 $ilDB->manipulate($q);
1894 }
1895
1902 public function updateStyleParameter($a_id, $a_value)
1903 {
1904 $ilDB = $this->db;
1905
1906 $q = "UPDATE style_parameter SET VALUE = " .
1907 $ilDB->quote($a_value, "text") . " WHERE id = " .
1908 $ilDB->quote($a_id, "integer");
1909 $style_set = $ilDB->manipulate($q);
1910 }
1911
1916 // todo: search for usages, add mq_id
1917 public function replaceStylePar($a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id = 0, $a_custom = false)
1918 {
1919 ilObjStyleSheet::_replaceStylePar($this->getId(), $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id, $a_custom);
1920 }
1921
1922 public static function _replaceStylePar($style_id, $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id = 0, $a_custom = false)
1923 {
1924 global $DIC;
1925
1926 $ilDB = $DIC->database();
1927
1928 $q = "SELECT * FROM style_parameter WHERE " .
1929 " style_id = " . $ilDB->quote($style_id, "integer") . " AND " .
1930 " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1931 " class = " . $ilDB->quote($a_class, "text") . " AND " .
1932 " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1933 " custom = " . $ilDB->quote($a_custom, "integer") . " AND " .
1934 " " . $ilDB->equals("type", $a_type, "text", true) . " AND " .
1935 " parameter = " . $ilDB->quote($a_par, "text");
1936
1937 $set = $ilDB->query($q);
1938
1939 if ($rec = $set->fetchRow()) {
1940 $q = "UPDATE style_parameter SET " .
1941 " value = " . $ilDB->quote($a_val, "text") . " WHERE " .
1942 " style_id = " . $ilDB->quote($style_id, "integer") . " AND " .
1943 " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1944 " class = " . $ilDB->quote($a_class, "text") . " AND " .
1945 " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1946 " custom = " . $ilDB->quote($a_custom, "integer") . " AND " .
1947 " " . $ilDB->equals("type", $a_type, "text", true) . " AND " .
1948 " parameter = " . $ilDB->quote($a_par, "text");
1949
1950 $ilDB->manipulate($q);
1951 } else {
1952 $id = $ilDB->nextId("style_parameter");
1953 $q = "INSERT INTO style_parameter (id, value, style_id, tag, class, type, parameter, mq_id, custom) VALUES " .
1954 " (" .
1955 $ilDB->quote($id, "integer") . "," .
1956 $ilDB->quote($a_val, "text") . "," .
1957 " " . $ilDB->quote($style_id, "integer") . "," .
1958 " " . $ilDB->quote($a_tag, "text") . "," .
1959 " " . $ilDB->quote($a_class, "text") . "," .
1960 " " . $ilDB->quote($a_type, "text") . "," .
1961 " " . $ilDB->quote($a_par, "text") . "," .
1962 " " . $ilDB->quote($a_mq_id, "integer") . "," .
1963 " " . $ilDB->quote($a_custom, "integer") .
1964 ")";
1965
1966 $ilDB->manipulate($q);
1967 }
1968 }
1969
1970
1974 public function getStyle()
1975 {
1976 return $this->style;
1977 }
1978
1982 public function setStyle($a_style)
1983 {
1984 $this->style = $a_style;
1985 }
1986
1987
1994 public function handleXmlString($a_str)
1995 {
1996 return str_replace("&", "&amp;", $a_str);
1997 }
1998
2003 public function getXML()
2004 {
2005 $xml .= "<StyleSheet>\n";
2006
2007 // title and description
2008 $xml .= "<Title>" . $this->handleXmlString($this->getTitle()) . "</Title>";
2009 $xml .= "<Description>" . $this->handleXmlString($this->getDescription()) . "</Description>\n";
2010
2011 // style classes
2012 foreach ($this->chars as $char) {
2013 $xml .= "<Style Tag=\"" . ilObjStyleSheet::_determineTag($char["type"]) .
2014 "\" Type=\"" . $char["type"] . "\" Class=\"" . $char["class"] . "\">\n";
2015 foreach ($this->style as $style) {
2016 if ($style[0]["type"] == $char["type"] && $style[0]["class"] == $char["class"]) {
2017 foreach ($style as $tag) {
2018 $xml .= "<StyleParameter Name=\"" . $tag["parameter"] . "\" Value=\"" . $tag["value"] . "\" Custom=\"" . $tag["custom"] . "\" />\n";
2019 }
2020 }
2021 }
2022 $xml .= "</Style>\n";
2023 }
2024
2025 // colors
2026 foreach ($this->getColors() as $color) {
2027 $xml .= "<StyleColor Name=\"" . $color["name"] . "\" Code=\"" . $color["code"] . "\"/>\n";
2028 }
2029
2030 // templates
2032 foreach ($tcts as $tct => $v) {
2033 $ts = $this->getTemplates($tct);
2034
2035 foreach ($ts as $t) {
2036 $xml .= "<StyleTemplate Type=\"" . $tct . "\" Name=\"" . $t["name"] . "\">\n";
2037 foreach ($t["classes"] as $ct => $c) {
2038 if ($c != "") {
2039 $xml .= "<StyleTemplateClass ClassType=\"" . $ct . "\" Class=\"" . $c . "\"/>\n";
2040 }
2041 }
2042 $xml .= "</StyleTemplate>\n";
2043 }
2044 }
2045
2046
2047 $xml .= "</StyleSheet>";
2048 //echo "<pre>".htmlentities($xml)."</pre>"; exit;
2049 return $xml;
2050 }
2051
2052
2056 public function createExportDirectory()
2057 {
2058 $sty_data_dir = ilUtil::getDataDir() . "/sty";
2059 ilUtil::makeDir($sty_data_dir);
2060 if (!is_writable($sty_data_dir)) {
2061 $this->ilias->raiseError("Style data directory (" . $sty_data_dir
2062 . ") not writeable.", $this->ilias->error_obj->FATAL);
2063 }
2064
2065 $style_dir = $sty_data_dir . "/sty_" . $this->getId();
2066 ilUtil::makeDir($style_dir);
2067 if (!@is_dir($style_dir)) {
2068 $this->ilias->raiseError("Creation of style directory failed (" .
2069 $style_dir . ").", $this->ilias->error_obj->FATAL);
2070 }
2071
2072 // create export subdirectory
2073 $ex_dir = $style_dir . "/export";
2074 ilUtil::makeDir($ex_dir);
2075 if (!@is_dir($ex_dir)) {
2076 $this->ilias->raiseError("Creation of Import Directory failed (" .
2077 $ex_dir . ").", $this->ilias->error_obj->FATAL);
2078 }
2079
2080 return $ex_dir;
2081 }
2082
2086 public function cleanExportDirectory()
2087 {
2088 $sty_data_dir = ilUtil::getDataDir() . "/sty";
2089 $style_dir = $sty_data_dir . "/sty_" . $this->getId();
2090 // create export subdirectory
2091 $ex_dir = $style_dir . "/export";
2092
2093 if (is_dir($ex_dir)) {
2094 ilUtil::delDir($ex_dir, true);
2095 }
2096 }
2097
2098
2103 {
2104 $ex_dir = $this->createExportDirectory();
2105 $ex_sub_dir = $ex_dir . "/" . $this->getExportSubDir();
2106 ilUtil::makeDir($ex_sub_dir);
2107 if (!is_writable($ex_sub_dir)) {
2108 $this->ilias->raiseError("Style data directory (" . $ex_sub_dir
2109 . ") not writeable.", $this->ilias->error_obj->FATAL);
2110 }
2111 $ex_sub_images_dir = $ex_sub_dir . "/images";
2112 ilUtil::makeDir($ex_sub_images_dir);
2113 if (!is_writable($ex_sub_images_dir)) {
2114 $this->ilias->raiseError("Style data directory (" . $ex_sub_images_dir
2115 . ") not writeable.", $this->ilias->error_obj->FATAL);
2116 }
2117 }
2118
2122 public function setExportSubDir($a_dir)
2123 {
2124 $this->export_sub_dir = $a_dir;
2125 }
2126
2130 public function getExportSubDir()
2131 {
2132 if ($this->export_sub_dir == "") {
2133 return "sty_" . $this->getId();
2134 } else {
2135 return $this->export_sub_dir;
2136 }
2137 }
2138
2144 public function export()
2145 {
2146 $this->cleanExportDirectory();
2147 $ex_dir = $this->createExportDirectory();
2148 $this->createExportSubDirectory();
2149 $this->exportXML($ex_dir . "/" . $this->getExportSubDir());
2150 //echo "-".$this->getImagesDirectory()."-".$ex_dir."/".$this->getExportSubDir()."/images"."-";
2152 $this->getImagesDirectory(),
2153 $ex_dir . "/" . $this->getExportSubDir() . "/images"
2154 );
2155 if (is_file($ex_dir . "/" . $this->getExportSubDir() . ".zip")) {
2156 unlink($ex_dir . "/" . $this->getExportSubDir() . ".zip");
2157 }
2159 $ex_dir . "/" . $this->getExportSubDir(),
2160 $ex_dir . "/" . $this->getExportSubDir() . ".zip"
2161 );
2162
2163 return $ex_dir . "/" . $this->getExportSubDir() . ".zip";
2164 }
2165
2169 public function exportXML($a_dir)
2170 {
2171 $file = $a_dir . "/style.xml";
2172
2173 // open file
2174 if (!($fp = @fopen($file, "w"))) {
2175 die("<b>Error</b>: Could not open \"" . $file . "\" for writing" .
2176 " in <b>" . __FILE__ . "</b> on line <b>" . __LINE__ . "</b><br />");
2177 }
2178
2179 // set file permissions
2180 chmod($file, 0770);
2181
2182 // write xml data into the file
2183 fwrite($fp, $this->getXML());
2184
2185 // close file
2186 fclose($fp);
2187 }
2188
2192 public function createImportDirectory()
2193 {
2194 $sty_data_dir = ilUtil::getDataDir() . "/sty";
2195 ilUtil::makeDir($sty_data_dir);
2196 if (!is_writable($sty_data_dir)) {
2197 $this->ilias->raiseError("Style data directory (" . $sty_data_dir
2198 . ") not writeable.", $this->ilias->error_obj->FATAL);
2199 }
2200
2201 $style_dir = $sty_data_dir . "/sty_" . $this->getId();
2202 ilUtil::makeDir($style_dir);
2203 if (!@is_dir($style_dir)) {
2204 $this->ilias->raiseError("Creation of style directory failed (" .
2205 $style_dir . ").", $this->ilias->error_obj->FATAL);
2206 }
2207
2208 // create import subdirectory
2209 $im_dir = $style_dir . "/import";
2210 ilUtil::makeDir($im_dir);
2211 if (!@is_dir($im_dir)) {
2212 $this->ilias->raiseError("Creation of Import Directory failed (" .
2213 $im_dir . ").", $this->ilias->error_obj->FATAL);
2214 }
2215
2216 return $im_dir;
2217 }
2218
2222 public function import($a_file)
2223 {
2224 parent::create();
2225
2226 $im_dir = $this->createImportDirectory();
2227
2228 // handle uploaded files
2229 if (is_array($a_file)) {
2231 $a_file["tmp_name"],
2232 $a_file["name"],
2233 $im_dir . "/" . $a_file["name"]
2234 );
2235 $file_name = $a_file["name"];
2236 } else { // handle not directly uploaded files
2237 $pi = pathinfo($a_file);
2238 $file_name = $pi["basename"];
2239 copy($a_file, $im_dir . "/" . $file_name);
2240 }
2241 $file = pathinfo($file_name);
2242
2243 // unzip file
2244 if (strtolower($file["extension"] == "zip")) {
2245 ilUtil::unzip($im_dir . "/" . $file_name);
2246 $subdir = basename($file["basename"], "." . $file["extension"]);
2247 if (!is_dir($im_dir . "/" . $subdir)) {
2248 $subdir = "style"; // check style subdir
2249 }
2250 $xml_file = $im_dir . "/" . $subdir . "/style.xml";
2251 } else { // handle xml file directly (old style)
2252 $xml_file = $im_dir . "/" . $file_name;
2253 }
2254
2255 // load information from xml file
2256 //echo "-$xml_file-";
2257 $this->createFromXMLFile($xml_file, true);
2258
2259 // copy images
2260 $this->createImagesDirectory();
2261 if (is_dir($im_dir . "/" . $subdir . "/images")) {
2263 $im_dir . "/" . $subdir . "/images",
2264 $this->getImagesDirectory()
2265 );
2266 }
2267
2269 $this->read();
2270 $this->writeCSSFile();
2271 }
2272
2277 public function createFromXMLFile($a_file, $a_skip_parent_create = false)
2278 {
2279 $ilDB = $this->db;
2280
2281 $this->is_3_10_skin = false;
2282
2283 if (!$a_skip_parent_create) {
2284 parent::create();
2285 }
2286 include_once("./Services/Style/Content/classes/class.ilStyleImportParser.php");
2287 $importParser = new ilStyleImportParser($a_file, $this);
2288 $importParser->startParsing();
2289
2290 // store style parameter
2291 foreach ($this->style as $style) {
2292 foreach ($style as $tag) {
2293 $id = $ilDB->nextId("style_parameter");
2294
2295 // migrate old table PageFrame/PageContainer to div
2296 if (in_array($tag["class"], array("PageFrame", "PageContainer")) &&
2297 $tag["tag"] == "table") {
2298 $tag["tag"] = "div";
2299 if ($tag["parameter"] == "width" && $tag["value"] == "100%") {
2300 continue;
2301 }
2302 }
2303
2304 $q = "INSERT INTO style_parameter (id,style_id, tag, class, parameter, type, value, custom) VALUES " .
2305 "(" .
2306 $ilDB->quote($id, "integer") . "," .
2307 $ilDB->quote($this->getId(), "integer") . "," .
2308 $ilDB->quote($tag["tag"], "text") . "," .
2309 $ilDB->quote($tag["class"], "text") . "," .
2310 $ilDB->quote($tag["parameter"], "text") . "," .
2311 $ilDB->quote($tag["type"], "text") . "," .
2312 $ilDB->quote($tag["value"], "text") . "," .
2313 $ilDB->quote((bool) $tag["custom"], "integer") .
2314 ")";
2315 $ilDB->manipulate($q);
2316 }
2317 }
2318
2319 // store characteristics
2320 $this->is_3_10_skin = true;
2321 if (is_array($this->chars)) {
2322 foreach ($this->chars as $char) {
2323 if ($char["type"] != "") {
2324 $s = substr($char["class"], strlen($char["class"]) - 6);
2325 if ($s != ":hover") {
2326 $ilDB->replace(
2327 "style_char",
2328 array(
2329 "style_id" => array("integer", $this->getId()),
2330 "type" => array("text", $char["type"]),
2331 "characteristic" => array("text", $char["class"])),
2332 array("hide" => array("integer", 0))
2333 );
2334 /*
2335 $q = "INSERT INTO style_char (style_id, type, characteristic) VALUES ".
2336 "(".$ilDB->quote($this->getId(), "integer").",".
2337 $ilDB->quote($char["type"], "text").",".
2338 $ilDB->quote($char["class"], "text").")";
2339 $ilDB->manipulate($q);*/
2340 $this->is_3_10_skin = false;
2341 }
2342 }
2343 }
2344 }
2345
2346 // add style_data record
2347 $q = "INSERT INTO style_data (id, uptodate) VALUES " .
2348 "(" . $ilDB->quote($this->getId(), "integer") . ", 0)";
2349 $ilDB->manipulate($q);
2350
2351 $this->update();
2352 $this->read();
2353
2354 if ($this->is_3_10_skin) {
2355 $this->do_3_10_Migration();
2356 }
2357 //$this->writeCSSFile();
2358 }
2359
2363 public function getStyleParameterGroups()
2364 {
2365 $groups = array();
2366
2367 foreach (self::$parameter as $parameter => $props) {
2368 $groups[$props["group"]][] = $parameter;
2369 }
2370 return $groups;
2371 }
2372
2373 public static function _getStyleParameterInputType($par)
2374 {
2375 $input = self::$parameter[$par]["input"];
2376 return $input;
2377 }
2378
2379 public static function _getStyleParameterSubPar($par)
2380 {
2381 $subpar = self::$parameter[$par]["subpar"];
2382 return $subpar;
2383 }
2384
2385 public static function _getStyleParameters($a_tag = "")
2386 {
2387 if ($a_tag == "") {
2388 return self::$parameter;
2389 }
2390 $par = array();
2391 foreach (self::$parameter as $k => $v) {
2392 if (is_array(self::$filtered_groups[$v["group"]]) &&
2393 !in_array($a_tag, self::$filtered_groups[$v["group"]])) {
2394 continue;
2395 }
2396 $par[$k] = $v;
2397 }
2398 return $par;
2399 }
2400
2401 public static function _getFilteredGroups()
2402 {
2404 }
2405
2406 public static function _getStyleParameterNumericUnits($a_no_percentage = false)
2407 {
2408 if ($a_no_percentage) {
2410 }
2411 return self::$num_unit;
2412 }
2413
2414 public static function _getStyleParameterValues($par)
2415 {
2416 return self::$parameter[$par]["values"];
2417 }
2418
2419 /*static function _getStyleTypes()
2420 {
2421 return self::$style_types;
2422 }*/
2423
2424 public static function _getStyleSuperTypes()
2425 {
2427 }
2428
2429 public static function _isExpandable($a_type)
2430 {
2431 return in_array($a_type, self::$expandable_types);
2432 }
2433
2434 public static function _isHideable($a_type)
2435 {
2436 return in_array($a_type, self::$hideable_types);
2437 }
2438
2439 public static function _getStyleSuperTypeForType($a_type)
2440 {
2441 foreach (self::$style_super_types as $s => $t) {
2442 if (in_array($a_type, $t)) {
2443 return $s;
2444 }
2445 if ($a_type == $s) {
2446 return $s;
2447 }
2448 }
2449 }
2450
2454 public static function _getCoreStyles()
2455 {
2456 $c_styles = array();
2457 foreach (self::$core_styles as $cstyle) {
2458 $c_styles[$cstyle["type"] . "." . ilObjStyleSheet::_determineTag($cstyle["type"]) . "." . $cstyle["class"]]
2459 = array("type" => $cstyle["type"],
2460 "tag" => ilObjStyleSheet::_determineTag($cstyle["type"]),
2461 "class" => $cstyle["class"]);
2462 }
2463 return $c_styles;
2464 }
2465
2472 public static function isCoreStyle($a_type, $a_class)
2473 {
2474 foreach (self::$core_styles as $s) {
2475 if ($s["type"] == $a_type && $s["class"] == $a_class) {
2476 return true;
2477 }
2478 }
2479 return false;
2480 }
2481
2482
2486 public static function _getTemplateClassTypes($a_template_type = "")
2487 {
2488 if ($a_template_type == "") {
2489 return self::$templates;
2490 }
2491
2492 return self::$templates[$a_template_type];
2493 }
2494
2495
2496 public static function _getPseudoClasses($tag)
2497 {
2498 return self::$pseudo_classes[$tag];
2499 }
2500
2501 public function determineTemplateStyleClassType($t, $k)
2502 {
2503 return self::$templates[$t][$k];
2504 }
2505
2506 public static function _determineTag($a_type)
2507 {
2508 return self::$assigned_tags[$a_type];
2509 }
2510
2514 public static function getAvailableParameters()
2515 {
2516 $pars = array();
2517 foreach (self::$parameter as $p => $v) {
2518 $pars[$p] = $v["values"];
2519 }
2520
2521 return $pars;
2522 }
2523
2524
2528 public static function _addMissingStyleClassesToStyle($a_id)
2529 {
2530 $styles = array(array("id" => $a_id));
2532 }
2533
2538 public static function _addMissingStyleClassesToAllStyles($a_styles = "")
2539 {
2540 global $DIC;
2541
2542 $ilDB = $DIC->database();
2543
2544 if ($a_styles == "") {
2545 $styles = ilObject::_getObjectsDataForType("sty");
2546 } else {
2547 $styles = $a_styles;
2548 }
2551
2552 // get all core image files
2553 $core_images = array();
2554 $core_dir = self::$basic_style_image_dir;
2555 if (is_dir($core_dir)) {
2556 $dir = opendir($core_dir);
2557 while ($file = readdir($dir)) {
2558 if (substr($file, 0, 1) != "." && is_file($core_dir . "/" . $file)) {
2559 $core_images[] = $file;
2560 }
2561 }
2562 }
2563
2564 foreach ($styles as $style) {
2565 $id = $style["id"];
2566
2567 foreach ($core_styles as $cs) {
2568 // check, whether core style class exists
2569 $set = $ilDB->queryF(
2570 "SELECT * FROM style_char WHERE style_id = %s " .
2571 "AND type = %s AND characteristic = %s",
2572 array("integer", "text", "text"),
2573 array($id, $cs["type"], $cs["class"])
2574 );
2575
2576 // if not, add core style class
2577 if (!($rec = $ilDB->fetchAssoc($set))) {
2578 $ilDB->manipulateF(
2579 "INSERT INTO style_char (style_id, type, characteristic) " .
2580 " VALUES (%s,%s,%s) ",
2581 array("integer", "text", "text"),
2582 array($id, $cs["type"], $cs["class"])
2583 );
2584
2585 $xpath = new DOMXPath($bdom);
2586 $par_nodes = $xpath->query("/StyleSheet/Style[@Tag = '" . $cs["tag"] . "' and @Type='" .
2587 $cs["type"] . "' and @Class='" . $cs["class"] . "']/StyleParameter");
2588 foreach ($par_nodes as $par_node) {
2589 // check whether style parameter exists
2590 $set = $ilDB->queryF(
2591 "SELECT * FROM style_parameter WHERE style_id = %s " .
2592 "AND type = %s AND class = %s AND tag = %s AND parameter = %s",
2593 array("integer", "text", "text", "text", "text"),
2594 array($id, $cs["type"], $cs["class"],
2595 $cs["tag"], $par_node->getAttribute("Name"))
2596 );
2597
2598 // if not, create style parameter
2599 if (!($rec = $ilDB->fetchAssoc($set))) {
2600 $spid = $ilDB->nextId("style_parameter");
2601 $st = $ilDB->manipulateF(
2602 "INSERT INTO style_parameter (id, style_id, type, class, tag, parameter, value) " .
2603 " VALUES (%s,%s,%s,%s,%s,%s,%s)",
2604 array("integer", "integer", "text", "text", "text", "text", "text"),
2605 array($spid, $id, $cs["type"], $cs["class"], $cs["tag"],
2606 $par_node->getAttribute("Name"), $par_node->getAttribute("Value"))
2607 );
2608 }
2609 }
2610 }
2611 }
2612
2613 // now check, whether some core image files are missing
2616 reset($core_images);
2617 foreach ($core_images as $cim) {
2618 if (!is_file($imdir . "/" . $cim)) {
2619 copy($core_dir . "/" . $cim, $imdir . "/" . $cim);
2620 }
2621 }
2622 }
2623 }
2624
2625 //
2626 // Color management
2627 //
2628
2632 public function do_3_10_Migration()
2633 {
2634 $ilDB = $this->db;
2635
2636 $this->do_3_9_Migration($this->getId());
2637
2638 //include_once("./Services/Migration/DBUpdate_1385/classes/class.ilStyleMigration.php");
2639 //ilStyleMigration::addMissingStyleCharacteristics($this->getId());
2640
2641 $this->do_3_10_CharMigration($this->getId());
2642
2643 // style_char: type for characteristic
2644 $st = $ilDB->prepareManip("UPDATE style_char SET type = ? WHERE characteristic = ?" .
2645 " AND style_id = ? ", array("text", "text", "integer"));
2646 $ilDB->execute($st, array("media_cont", "Media", $this->getId()));
2647 $ilDB->execute($st, array("media_caption", "MediaCaption", $this->getId()));
2648 $ilDB->execute($st, array("page_fn", "Footnote", $this->getId()));
2649 $ilDB->execute($st, array("page_nav", "LMNavigation", $this->getId()));
2650 $ilDB->execute($st, array("page_title", "PageTitle", $this->getId()));
2651 $ilDB->execute($st, array("page_cont", "Page", $this->getId()));
2652
2653 // style_parameter: type for class
2654 $st = $ilDB->prepareManip("UPDATE style_parameter SET type = ? WHERE class = ?" .
2655 " AND style_id = ? ", array("text", "text", "integer"));
2656 $ilDB->execute($st, array("media_cont", "Media", $this->getId()));
2657 $ilDB->execute($st, array("media_caption", "MediaCaption", $this->getId()));
2658 $ilDB->execute($st, array("page_fn", "Footnote", $this->getId()));
2659 $ilDB->execute($st, array("page_nav", "LMNavigation", $this->getId()));
2660 $ilDB->execute($st, array("page_title", "PageTitle", $this->getId()));
2661 $ilDB->execute($st, array("table", "Page", $this->getId()));
2662
2663 $st = $ilDB->prepareManip("UPDATE style_parameter SET tag = ? WHERE class = ?" .
2664 " AND style_id = ? ", array("text", "text", "integer"));
2665 $ilDB->execute($st, array("div", "MediaCaption", $this->getId()));
2666
2667 // style_char: characteristic for characteristic
2668 $st = $ilDB->prepareManip("UPDATE style_char SET characteristic = ? WHERE characteristic = ?" .
2669 " AND style_id = ? ", array("text", "text", "integer"));
2670 $ilDB->execute($st, array("MediaContainer", "Media", $this->getId()));
2671 $ilDB->execute($st, array("PageContainer", "Page", $this->getId()));
2672
2673 // style_parameter: class for class
2674 $st = $ilDB->prepareManip("UPDATE style_parameter SET class = ? WHERE class = ?" .
2675 " AND style_id = ? ", array("text", "text", "integer"));
2676 $ilDB->execute($st, array("MediaContainer", "Media", $this->getId()));
2677 $ilDB->execute($st, array("PageContainer", "Page", $this->getId()));
2678
2679 // force rewriting of container style
2680 $st = $ilDB->prepareManip("DELETE FROM style_char WHERE type = ?" .
2681 " AND style_id = ? ", array("text", "integer"));
2682 $ilDB->execute($st, array("page_cont", $this->getId()));
2683 $st = $ilDB->prepareManip("DELETE FROM style_parameter WHERE type = ?" .
2684 " AND style_id = ? ", array("text", "integer"));
2685 $ilDB->execute($st, array("page_cont", $this->getId()));
2686 }
2687
2694 public function do_3_10_CharMigration($a_id = "")
2695 {
2696 $ilDB = $this->db;
2697
2698 $add_str = "";
2699 if ($a_id != "") {
2700 $add_str = " AND style_id = " . $ilDB->quote($a_id, "integer");
2701 }
2702
2703 $set = $ilDB->query($q = "SELECT DISTINCT style_id, tag, class FROM style_parameter WHERE " .
2704 $ilDB->equals("type", "", "text", true) . " " . $add_str);
2705
2706 while ($rec = $ilDB->fetchAssoc($set)) {
2707 // derive types from tag
2708 $types = array();
2709 switch ($rec["tag"]) {
2710 case "div":
2711 case "p":
2712 if (in_array($rec["class"], array("Headline3", "Headline1",
2713 "Headline2", "TableContent", "List", "Standard", "Remark",
2714 "Additional", "Mnemonic", "Citation", "Example"))) {
2715 $types[] = "text_block";
2716 }
2717 if (in_array($rec["class"], array("Block", "Remark",
2718 "Additional", "Mnemonic", "Example", "Excursus", "Special"))) {
2719 $types[] = "section";
2720 }
2721 if (in_array($rec["class"], array("Page", "Footnote", "PageTitle", "LMNavigation"))) {
2722 $types[] = "page";
2723 }
2724 break;
2725
2726 case "td":
2727 $types[] = "table_cell";
2728 break;
2729
2730 case "a":
2731 if (in_array($rec["class"], array("ExtLink", "IntLink", "FootnoteLink"))) {
2732 $types[] = "link";
2733 }
2734 break;
2735
2736 case "span":
2737 $types[] = "text_inline";
2738 break;
2739
2740 case "table":
2741 $types[] = "table";
2742 break;
2743 }
2744
2745 // check if style_char set exists
2746 foreach ($types as $t) {
2747 // check if second type already exists
2748 $set4 = $ilDB->queryF(
2749 "SELECT * FROM style_char " .
2750 " WHERE style_id = %s AND type = %s AND characteristic = %s",
2751 array("integer", "text", "text"),
2752 array($rec["style_id"], $t, $rec["class"])
2753 );
2754 if ($rec4 = $ilDB->fetchAssoc($set4)) {
2755 // ok
2756 } else {
2757 //echo "<br>1-".$rec["style_id"]."-".$t."-".$rec["class"]."-";
2758 $ilDB->manipulateF(
2759 "INSERT INTO style_char " .
2760 " (style_id, type, characteristic) VALUES " .
2761 " (%s,%s,%s) ",
2762 array("integer", "text", "text"),
2763 array($rec["style_id"], $t, $rec["class"])
2764 );
2765 }
2766 }
2767
2768 // update types
2769 if ($rec["type"] == "") {
2770 if (count($types) > 0) {
2771 $ilDB->manipulateF(
2772 "UPDATE style_parameter SET type = %s " .
2773 " WHERE style_id = %s AND class = %s AND " . $ilDB->equals("type", "", "text", true),
2774 array("text", "integer", "text"),
2775 array($types[0], $rec["style_id"], $rec["class"])
2776 );
2777 //echo "<br>3-".$types[0]."-".$rec["style_id"]."-".$rec["class"]."-";
2778
2779 // links extra handling
2780 if ($types[0] == "link") {
2781 $ilDB->manipulateF(
2782 "UPDATE style_parameter SET type = %s " .
2783 " WHERE style_id = %s AND (class = %s OR class = %s) AND " . $ilDB->equals("type", "", "text", true),
2784 array("text", "integer", "text", "text"),
2785 array($types[0], $rec["style_id"], $rec["class"] . ":visited",
2786 $rec["class"] . ":hover")
2787 );
2788 }
2789 }
2790
2791 if (count($types) == 2) {
2792 // select all records of first type and add second type
2793 // records if necessary.
2794 $set2 = $ilDB->queryF(
2795 "SELECT * FROM style_parameter " .
2796 " WHERE style_id = %s AND class = %s AND type = %s",
2797 array("integer", "text", "text"),
2798 array($rec["style_id"], $rec["class"], $types[0])
2799 );
2800 while ($rec2 = $ilDB->fetchAssoc($set2)) {
2801 // check if second type already exists
2802 $set3 = $ilDB->queryF(
2803 "SELECT * FROM style_parameter " .
2804 " WHERE style_id = %s AND tag = %s AND class = %s AND type = %s AND parameter = %s",
2805 array("integer", "text", "text", "text", "text"),
2806 array($rec["style_id"], $rec["tag"], $rec["class"], $types[1], $rec["parameter"])
2807 );
2808 if ($rec3 = $ilDB->fetchAssoc($set3)) {
2809 // ok
2810 } else {
2811 $nid = $ilDB->nextId("style_parameter");
2812 $ilDB->manipulateF(
2813 "INSERT INTO style_parameter " .
2814 " (id, style_id, tag, class, parameter, value, type) VALUES " .
2815 " (%s, %s,%s,%s,%s,%s,%s) ",
2816 array("integer", "integer", "text", "text", "text", "text", "text"),
2817 array($nid, $rec2["style_id"], $rec2["tag"], $rec2["class"],
2818 $rec2["parameter"], $rec2["value"], $types[1])
2819 );
2820 }
2821 }
2822 }
2823 }
2824 }
2825 }
2826
2830 public function do_3_9_Migration($a_id)
2831 {
2832 $ilDB = $this->db;
2833
2834 $classes = array("Example", "Additional", "Citation", "Mnemonic", "Remark");
2835 $pars = array("margin-top", "margin-bottom");
2836
2837 foreach ($classes as $curr_class) {
2838 foreach ($pars as $curr_par) {
2839 $res2 = $ilDB->queryF(
2840 "SELECT id FROM style_parameter WHERE style_id = %s" .
2841 " AND tag = %s AND class= %s AND parameter = %s",
2842 array("integer", "text", "text", "text"),
2843 array($a_id, "p", $curr_class, $curr_par)
2844 );
2845 if ($row2 = $ilDB->fetchAssoc($res2)) {
2846 $ilDB->manipulateF(
2847 "UPDATE style_parameter SET value= %s WHERE id = %s",
2848 array("text", "integer"),
2849 array("10px", $row2["id"])
2850 );
2851 } else {
2852 $nid = $ilDB->nextId("style_parameter");
2853 $ilDB->manipulateF(
2854 "INSERT INTO style_parameter " .
2855 "(id, style_id, tag, class, parameter,value) VALUES (%s,%s,%s,%s,%s,%s)",
2856 array("integer", "integer", "text", "text", "text", "text"),
2857 array($nid, $a_id, "div", $curr_class, $curr_par, "10px")
2858 );
2859 }
2860 }
2861 }
2862
2863 $ilDB->manipulateF(
2864 "UPDATE style_parameter SET tag = %s WHERE tag = %s and style_id = %s",
2865 array("text", "text", "integer"),
2866 array("div", "p", $a_id)
2867 );
2868 }
2869
2873
2877 public function getColors()
2878 {
2879 $ilDB = $this->db;
2880
2881 $set = $ilDB->query("SELECT * FROM style_color WHERE " .
2882 "style_id = " . $ilDB->quote($this->getId(), "integer") . " " .
2883 "ORDER BY color_name");
2884
2885 $colors = array();
2886 while ($rec = $ilDB->fetchAssoc($set)) {
2887 $colors[] = array(
2888 "name" => $rec["color_name"],
2889 "code" => $rec["color_code"]
2890 );
2891 }
2892
2893 return $colors;
2894 }
2895
2899 public function addColor($a_name, $a_code)
2900 {
2901 $ilDB = $this->db;
2902
2903 $ilDB->manipulate("INSERT INTO style_color (style_id, color_name, color_code)" .
2904 " VALUES (" .
2905 $ilDB->quote($this->getId(), "integer") . "," .
2906 $ilDB->quote($a_name, "text") . "," .
2907 $ilDB->quote($a_code, "text") .
2908 ")");
2909 }
2910
2914 public function updateColor($a_name, $a_new_name, $a_code)
2915 {
2916 $ilDB = $this->db;
2917
2918 // todo: update names in parameters as well
2919
2920 $ilDB->manipulate("UPDATE style_color SET " .
2921 "color_name = " . $ilDB->quote($a_new_name, "text") . ", " .
2922 "color_code = " . $ilDB->quote($a_code, "text") .
2923 " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") .
2924 " AND color_name = " . $ilDB->quote($a_name, "text"));
2925 ilObjStyleSheet::_writeUpToDate($this->getId(), false);
2926
2927 // rename also the name in the style parameter values
2928 if ($a_name != $a_new_name) {
2929 $set = $ilDB->query("SELECT * FROM style_parameter " .
2930 " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") .
2931 " AND (" .
2932 " parameter = " . $ilDB->quote("background-color", "text") . " OR " .
2933 " parameter = " . $ilDB->quote("color", "text") . " OR " .
2934 " parameter = " . $ilDB->quote("border-color", "text") . " OR " .
2935 " parameter = " . $ilDB->quote("border-top-color", "text") . " OR " .
2936 " parameter = " . $ilDB->quote("border-bottom-color", "text") . " OR " .
2937 " parameter = " . $ilDB->quote("border-left-color", "text") . " OR " .
2938 " parameter = " . $ilDB->quote("border-right-color", "text") .
2939 ")");
2940 while ($rec = $ilDB->fetchAssoc($set)) {
2941 if ($rec["value"] == "!" . $a_name ||
2942 is_int(strpos($rec["value"], "!" . $a_name . "("))) {
2943 // parameter is based on color -> rename it
2944 $this->replaceStylePar(
2945 $rec["tag"],
2946 $rec["class"],
2947 $rec["parameter"],
2948 str_replace($a_name, $a_new_name, $rec["value"]),
2949 $rec["type"],
2950 $rec["mq_id"],
2951 $rec["custom"]
2952 );
2953 }
2954 }
2955 }
2956 }
2957
2961 public function removeColor($a_name)
2962 {
2963 $ilDB = $this->db;
2964
2965 $ilDB->manipulate("DELETE FROM style_color WHERE " .
2966 " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
2967 " color_name = " . $ilDB->quote($a_name, "text"));
2968 }
2969
2973 public function colorExists($a_color_name)
2974 {
2975 $ilDB = $this->db;
2976
2977 $set = $ilDB->query("SELECT * FROM style_color WHERE " .
2978 "style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
2979 "color_name = " . $ilDB->quote($a_color_name, "text"));
2980 if ($rec = $ilDB->fetchAssoc($set)) {
2981 return true;
2982 }
2983 return false;
2984 }
2985
2989 public function getColorCodeForName($a_name)
2990 {
2991 $ilDB = $this->db;
2992
2993 $pos = strpos($a_name, "(");
2994 if ($pos > 0) {
2995 $a_i = substr($a_name, $pos + 1);
2996 $a_i = str_replace(")", "", $a_i);
2997 $a_name = substr($a_name, 0, $pos);
2998 }
2999
3000 $set = $ilDB->query("SELECT color_code FROM style_color WHERE " .
3001 " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
3002 " color_name = " . $ilDB->quote($a_name, "text"));
3003 if ($rec = $ilDB->fetchAssoc($set)) {
3004 if ($a_i == "") {
3005 return "#" . $rec["color_code"];
3006 } else {
3008 $rec["color_code"],
3009 (int) $a_i
3010 );
3011 }
3012 }
3013 }
3014
3018 public static function _getColorFlavor($a_rgb, $a_i)
3019 {
3020 $rgb = ilObjStyleSheet::_explodeRGB($a_rgb, true);
3021 $hls = ilObjStyleSheet::_RGBToHLS($rgb);
3022
3023 if ($a_i > 0) {
3024 $hls["l"] = $hls["l"] + ((255 - $hls["l"]) * ($a_i / 100));
3025 }
3026 if ($a_i < 0) {
3027 $hls["l"] = $hls["l"] - (($hls["l"]) * (-$a_i / 100));
3028 }
3029
3030 $rgb = ilObjStyleSheet::_HLSToRGB($hls);
3031
3032 foreach ($rgb as $k => $v) {
3033 $rgb[$k] = str_pad(dechex($v), 2, "0", STR_PAD_LEFT);
3034 }
3035
3036 return $rgb["r"] . $rgb["g"] . $rgb["b"];
3037 }
3038
3042 public static function _explodeRGB($a_rgb, $as_dec = false)
3043 {
3044 $r["r"] = substr($a_rgb, 0, 2);
3045 $r["g"] = substr($a_rgb, 2, 2);
3046 $r["b"] = substr($a_rgb, 4, 2);
3047
3048 if ($as_dec) {
3049 $r["r"] = (int) hexdec($r["r"]);
3050 $r["g"] = (int) hexdec($r["g"]);
3051 $r["b"] = (int) hexdec($r["b"]);
3052 }
3053
3054 return $r;
3055 }
3056
3060 public static function _RGBToHLS($a_rgb)
3061 {
3062 $r = $a_rgb["r"] / 255;
3063 $g = $a_rgb["g"] / 255;
3064 $b = $a_rgb["b"] / 255;
3065
3066 // max / min
3067 $max = max($r, $g, $b);
3068 $min = min($r, $g, $b);
3069
3070 //lightness
3071 $l = ($max + $min) / 2;
3072
3073 if ($max == $min) {
3074 $s = 0;
3075 $h = 0;
3076 } else {
3077 if ($l < 0.5) {
3078 $s = ($max - $min) / ($max + $min);
3079 } else {
3080 $s = ($max - $min) / (2.0 - $max - $min);
3081 }
3082
3083 if ($r == $max) {
3084 $h = ($g - $b) / ($max - $min);
3085 } elseif ($g == $max) {
3086 $h = 2.0 + ($b - $r) / ($max - $min);
3087 } elseif ($b == $max) {
3088 $h = 4.0 + ($r - $g) / ($max - $min);
3089 }
3090 }
3091
3092 $hls["h"] = round(($h / 6) * 255);
3093 $hls["l"] = round($l * 255);
3094 $hls["s"] = round($s * 255);
3095
3096 return $hls;
3097 }
3098
3102 public static function _HLSToRGB($a_hls)
3103 {
3104 $h = $a_hls["h"] / 255;
3105 $l = $a_hls["l"] / 255;
3106 $s = $a_hls["s"] / 255;
3107
3108 $rgb["r"] = $rgb["g"] = $rgb["b"] = 0;
3109
3110 // If S=0, define R, G, and B all to L
3111 if ($s == 0) {
3112 $rgb["r"] = $rgb["g"] = $rgb["b"] = $l;
3113 } else {
3114 if ($l < 0.5) {
3115 $temp2 = $l * (1.0 + $s);
3116 } else {
3117 $temp2 = $l + $s - $l * $s;
3118 }
3119
3120 $temp1 = 2.0 * $l - $temp2;
3121
3122
3123 # For each of R, G, B, compute another temporary value, temp3, as follows:
3124 foreach ($rgb as $k => $v) {
3125 switch ($k) {
3126 case "r":
3127 $temp3 = $h + 1.0 / 3.0;
3128 break;
3129
3130 case "g":
3131 $temp3 = $h;
3132 break;
3133
3134 case "b":
3135 $temp3 = $h - 1.0 / 3.0;
3136 break;
3137 }
3138 if ($temp3 < 0) {
3139 $temp3 = $temp3 + 1.0;
3140 }
3141 if ($temp3 > 1) {
3142 $temp3 = $temp3 - 1.0;
3143 }
3144
3145 if (6.0 * $temp3 < 1) {
3146 $rgb[$k] = $temp1 + ($temp2 - $temp1) * 6.0 * $temp3;
3147 } elseif (2.0 * $temp3 < 1) {
3148 $rgb[$k] = $temp2;
3149 } elseif (3.0 * $temp3 < 2) {
3150 $rgb[$k] = $temp1 + ($temp2 - $temp1) * ((2.0 / 3.0) - $temp3) * 6.0;
3151 } else {
3152 $rgb[$k] = $temp1;
3153 }
3154 }
3155 }
3156
3157 $rgb["r"] = round($rgb["r"] * 255);
3158 $rgb["g"] = round($rgb["g"] * 255);
3159 $rgb["b"] = round($rgb["b"] * 255);
3160
3161 return $rgb;
3162 }
3163
3164 //
3165 // Media queries
3166 //
3167
3171
3175 public function getMediaQueries()
3176 {
3177 $ilDB = $this->db;
3178
3179 $set = $ilDB->query("SELECT * FROM sty_media_query WHERE " .
3180 "style_id = " . $ilDB->quote($this->getId(), "integer") . " " .
3181 "ORDER BY order_nr");
3182
3183 $mq = array();
3184 while ($rec = $ilDB->fetchAssoc($set)) {
3185 $mq[] = $rec;
3186 }
3187
3188 return $mq;
3189 }
3190
3195 public function addMediaQuery($a_mquery, $order_nr = 0)
3196 {
3197 $ilDB = $this->db;
3198
3199 $id = $ilDB->nextId("sty_media_query");
3200 if ($order_nr == 0) {
3201 $order_nr = $this->getMaxMQueryOrderNr() + 10;
3202 }
3203
3204 $ilDB->manipulate("INSERT INTO sty_media_query (id, style_id, mquery, order_nr)" .
3205 " VALUES (" .
3206 $ilDB->quote($id, "integer") . "," .
3207 $ilDB->quote($this->getId(), "integer") . "," .
3208 $ilDB->quote($a_mquery, "text") . "," .
3209 $ilDB->quote($order_nr, "integer") .
3210 ")");
3211
3212 return $id;
3213 }
3214
3219 public function getMaxMQueryOrderNr()
3220 {
3221 $ilDB = $this->db;
3222
3223 $set = $ilDB->query(
3224 "SELECT max(order_nr) mnr FROM sty_media_query " .
3225 " WHERE style_id = " . $ilDB->quote($this->getId(), "integer")
3226 );
3227 $rec = $ilDB->fetchAssoc($set);
3228
3229 return (int) $rec["mnr"];
3230 }
3231
3238 public function updateMediaQuery($a_id, $a_mquery)
3239 {
3240 $ilDB = $this->db;
3241
3242 $ilDB->manipulate(
3243 "UPDATE sty_media_query SET " .
3244 " mquery = " . $ilDB->quote($a_mquery, "text") .
3245 " WHERE id = " . $ilDB->quote($a_id, "integer")
3246 );
3247 }
3248
3255 public function getMediaQueryForId($a_id)
3256 {
3257 $ilDB = $this->db;
3258
3259 $set = $ilDB->query(
3260 "SELECT * FROM sty_media_query " .
3261 " WHERE id = " . $ilDB->quote($a_id, "integer")
3262 );
3263 return $ilDB->fetchAssoc($set);
3264 }
3265
3271 public function deleteMediaQuery($a_id)
3272 {
3273 $ilDB = $this->db;
3274
3275 $ilDB->manipulate(
3276 "DELETE FROM sty_media_query WHERE " .
3277 " style_id = " . $ilDB->quote($this->getId(), "integer") .
3278 " AND id = " . $ilDB->quote($a_id, "integer")
3279 );
3280 $this->saveMediaQueryOrder();
3281 }
3282
3288 public function saveMediaQueryOrder($a_order_nr = null)
3289 {
3290 $ilDB = $this->db;
3291
3292 $mqueries = $this->getMediaQueries();
3293 if (is_array($a_order_nr)) {
3294 foreach ($mqueries as $k => $mq) {
3295 $mqueries[$k]["order_nr"] = $a_order_nr[$mq["id"]];
3296 }
3297 $mqueries = ilUtil::sortArray($mqueries, "order_nr", "", true);
3298 }
3299 $cnt = 10;
3300 foreach ($mqueries as $mq) {
3301 $ilDB->manipulate(
3302 "UPDATE sty_media_query SET " .
3303 " order_nr = " . $ilDB->quote($cnt, "integer") .
3304 " WHERE id = " . $ilDB->quote($mq["id"], "integer")
3305 );
3306 $cnt += 10;
3307 }
3308 }
3309
3310
3311 //
3312 // Table template management
3313 //
3314
3318 public function getTemplates($a_type)
3319 {
3320 $ilDB = $this->db;
3321
3322 $set = $ilDB->query("SELECT * FROM style_template WHERE " .
3323 "style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
3324 "temp_type = " . $ilDB->quote($a_type, "text") . " " .
3325 "ORDER BY name");
3326
3327 $templates = array();
3328 while ($rec = $ilDB->fetchAssoc($set)) {
3329 $rec["classes"] = $this->getTemplateClasses($rec["id"]);
3330 $templates[] = $rec;
3331 }
3332
3333 return $templates;
3334 }
3335
3339 public function getTemplateClasses($a_tid)
3340 {
3341 $ilDB = $this->db;
3342 $set = $ilDB->query("SELECT * FROM style_template_class WHERE " .
3343 "template_id = " . $ilDB->quote($a_tid, "integer"));
3344
3345 $class = array();
3346 while ($rec = $ilDB->fetchAssoc($set)) {
3347 $key = $rec["class_type"];
3348 $class[$key] = $rec["class"];
3349 }
3350
3351 return $class;
3352 }
3353
3354
3358 public function addTemplate($a_type, $a_name, $a_classes)
3359 {
3360 $ilDB = $this->db;
3361
3362 $tid = $ilDB->nextId("style_template");
3363 $ilDB->manipulate($q = "INSERT INTO style_template " .
3364 "(id, style_id, name, temp_type)" .
3365 " VALUES (" .
3366 $ilDB->quote($tid, "integer") . "," .
3367 $ilDB->quote($this->getId(), "integer") . "," .
3368 $ilDB->quote($a_name, "text") . "," .
3369 $ilDB->quote($a_type, "text") .
3370 ")");
3371
3372 foreach ($a_classes as $t => $c) {
3373 $ilDB->manipulate($q = "INSERT INTO style_template_class " .
3374 "(template_id, class_type, class)" .
3375 " VALUES (" .
3376 $ilDB->quote($tid, "integer") . "," .
3377 $ilDB->quote($t, "text") . "," .
3378 $ilDB->quote($c, "text") .
3379 ")");
3380 }
3381
3382 include_once("./Services/Style/Content/classes/class.ilObjStyleSheetGUI.php");
3383 $this->writeTemplatePreview(
3384 $tid,
3386 );
3387
3388 return $tid;
3389 }
3390
3394 public function updateTemplate($a_t_id, $a_name, $a_classes)
3395 {
3396 $ilDB = $this->db;
3397
3398 $ilDB->manipulate("UPDATE style_template SET " .
3399 "name = " . $ilDB->quote($a_name, "text") .
3400 " WHERE id = " . $ilDB->quote($a_t_id, "integer"));
3401
3402 $ilDB->manipulate(
3403 "DELETE FROM style_template_class WHERE " .
3404 "template_id = " . $ilDB->quote($a_t_id, "integer")
3405 );
3406 foreach ($a_classes as $t => $c) {
3407 $ilDB->manipulate($q = "INSERT INTO style_template_class " .
3408 "(template_id, class_type, class)" .
3409 " VALUES (" .
3410 $ilDB->quote($a_t_id, "integer") . "," .
3411 $ilDB->quote($t, "text") . "," .
3412 $ilDB->quote($c, "text") .
3413 ")");
3414 }
3415 }
3416
3420 public function addTemplateClass($a_t_id, $a_type, $a_class)
3421 {
3422 $ilDB = $this->db;
3423
3424 $ilDB->manipulate($q = "INSERT INTO style_template_class " .
3425 "(template_id, class_type, class)" .
3426 " VALUES (" .
3427 $ilDB->quote($a_t_id, "integer") . "," .
3428 $ilDB->quote($a_type, "text") . "," .
3429 $ilDB->quote($a_class, "text") .
3430 ")");
3431 }
3432
3433
3437 public function templateExists($a_template_name)
3438 {
3439 $ilDB = $this->db;
3440
3441 $set = $ilDB->query("SELECT * FROM style_template WHERE " .
3442 "style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
3443 "name = " . $ilDB->quote($a_template_name, "text"));
3444 if ($rec = $ilDB->fetchAssoc($set)) {
3445 return true;
3446 }
3447 return false;
3448 }
3449
3453 public function getTemplate($a_t_id)
3454 {
3455 $ilDB = $this->db;
3456
3457 $set = $ilDB->query("SELECT * FROM style_template WHERE " .
3458 "style_id = " . $ilDB->quote($this->getId(), "integer") . " " .
3459 " AND id = " . $ilDB->quote($a_t_id, "integer"));
3460
3461 if ($rec = $ilDB->fetchAssoc($set)) {
3462 $rec["classes"] = $this->getTemplateClasses($rec["id"]);
3463
3464 $template = $rec;
3465 return $template;
3466 }
3467 return array();
3468 }
3469
3473 public function lookupTemplateName($a_t_id)
3474 {
3475 return self::_lookupTemplateName($a_t_id);
3476 }
3477
3481 public static function _lookupTemplateName($a_t_id)
3482 {
3483 global $DIC;
3484
3485 $ilDB = $DIC->database();
3486
3487 $set = $ilDB->query("SELECT name FROM style_template WHERE " .
3488 " id = " . $ilDB->quote($a_t_id, "integer"));
3489
3490 if ($rec = $ilDB->fetchAssoc($set)) {
3491 return $rec["name"];
3492 }
3493
3494 return false;
3495 }
3496
3500 public function getTemplateXML()
3501 {
3502 $ilDB = $this->db;
3503
3504 $tag = "<StyleTemplates>";
3505
3506 $ttypes = array("table", "vaccordion", "haccordion", "carousel");
3507
3508 foreach ($ttypes as $ttype) {
3509 $ts = $this->getTemplates($ttype);
3510
3511 foreach ($ts as $t) {
3513 /*$atts = array("table" => "TableClass",
3514 "caption" => "CaptionClass",
3515 "row_head" => "RowHeadClass",
3516 "row_foot" => "RowFootClass",
3517 "col_head" => "ColHeadClass",
3518 "col_foot" => "ColFootClass",
3519 "odd_row" => "OddRowClass",
3520 "even_row" => "EvenRowClass",
3521 "odd_col" => "OddColClass",
3522 "even_col" => "EvenColClass");*/
3523 $c = $t["classes"];
3524
3525 $tag .= '<StyleTemplate Name="' . $t["name"] . '">';
3526
3527 foreach ($atts as $type => $t) {
3528 if ($c[$type] != "") {
3529 $tag .= '<StyleClass Type="' . $type . '" Value="' . $c[$type] . '" />';
3530 }
3531 }
3532
3533 $tag .= "</StyleTemplate>";
3534 }
3535 }
3536
3537 $tag .= "</StyleTemplates>";
3538
3539 //echo htmlentities($tag);
3540 return $tag;
3541 }
3542
3546 public function writeTemplatePreview($a_t_id, $a_preview_html)
3547 {
3548 $ilDB = $this->db;
3549 $a_preview_html = str_replace(' width=""', "", $a_preview_html);
3550 $a_preview_html = str_replace(' valign="top"', "", $a_preview_html);
3551 $a_preview_html = str_replace('<div class="ilc_text_block_TableContent">', "<div>", $a_preview_html);
3552 //echo "1-".strlen($a_preview_html)."-";
3553 //echo htmlentities($a_preview_html);
3554 if (strlen($a_preview_html) > 4000) {
3555 //echo "2";
3556 $a_preview_html = "";
3557 }
3558 $ilDB->manipulate("UPDATE style_template SET " .
3559 "preview = " . $ilDB->quote($a_preview_html, "text") .
3560 " WHERE id = " . $ilDB->quote($a_t_id, "integer"));
3561 }
3562
3566 public function lookupTemplatePreview($a_t_id)
3567 {
3568 $ilDB = $this->db;
3569
3570 $set = $ilDB->query("SELECT preview FROM style_template " .
3571 " WHERE id = " . $ilDB->quote($a_t_id, "integer"));
3572 if ($rec = $ilDB->fetchAssoc($set)) {
3573 return $rec["preview"];
3574 }
3575
3576 return "";
3577 }
3578
3582 public static function _lookupTemplateIdByName($a_style_id, $a_name)
3583 {
3584 global $DIC;
3585
3586 $ilDB = $DIC->database();
3587
3588 $set = $ilDB->query("SELECT id FROM style_template " .
3589 " WHERE style_id = " . $ilDB->quote($a_style_id, "integer") .
3590 " AND name = " . $ilDB->quote($a_name, "text"));
3591 if ($rec = $ilDB->fetchAssoc($set)) {
3592 return $rec["id"];
3593 }
3594
3595 return false;
3596 }
3597
3601 public function removeTemplate($a_t_id)
3602 {
3603 $ilDB = $this->db;
3604
3605 $ilDB->manipulate("DELETE FROM style_template WHERE " .
3606 " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
3607 " id = " . $ilDB->quote($a_t_id, "integer"));
3608
3609 $ilDB->manipulate(
3610 "DELETE FROM style_template_class WHERE " .
3611 "template_id = " . $ilDB->quote($a_t_id, "integer")
3612 );
3613 }
3614
3618 public function writeStyleSetting($a_name, $a_value)
3619 {
3620 $ilDB = $this->db;
3621
3622 $ilDB->manipulate(
3623 "DELETE FROM style_setting WHERE " .
3624 " style_id = " . $ilDB->quote($this->getId(), "integer") .
3625 " AND name = " . $ilDB->quote($a_name, "text")
3626 );
3627
3628 $ilDB->manipulate("INSERT INTO style_setting " .
3629 "(style_id, name, value) VALUES (" .
3630 $ilDB->quote($this->getId(), "integer") . "," .
3631 $ilDB->quote($a_name, "text") . "," .
3632 $ilDB->quote($a_value, "text") .
3633 ")");
3634 }
3635
3639 public function lookupStyleSetting($a_name)
3640 {
3641 $ilDB = $this->db;
3642
3643 $set = $ilDB->query(
3644 "SELECT value FROM style_setting " .
3645 " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") .
3646 " AND name = " . $ilDB->quote($a_name, "text")
3647 );
3648 $rec = $ilDB->fetchAssoc($set);
3649
3650 return $rec["value"];
3651 }
3652
3656 public static function writeStyleUsage($a_obj_id, $a_style_id)
3657 {
3658 global $DIC;
3659
3660 $ilDB = $DIC->database();
3661
3662 $ilDB->replace(
3663 "style_usage",
3664 array(
3665 "obj_id" => array("integer", (int) $a_obj_id)),
3666 array(
3667 "style_id" => array("integer", (int) $a_style_id))
3668 );
3669 }
3670
3674 public static function lookupObjectStyle($a_obj_id)
3675 {
3676 global $DIC;
3677
3678 $ilDB = $DIC->database();
3679
3680 $set = $ilDB->query(
3681 "SELECT style_id FROM style_usage " .
3682 " WHERE obj_id = " . $ilDB->quote($a_obj_id, "integer")
3683 );
3684 $rec = $ilDB->fetchAssoc($set);
3685
3686 if (ilObject::_lookupType($rec["style_id"]) == "sty") {
3687 return (int) $rec["style_id"];
3688 }
3689
3690 return 0;
3691 }
3692
3696 public static function lookupObjectForStyle($a_style_id)
3697 {
3698 global $DIC;
3699
3700 $ilDB = $DIC->database();
3701
3702 $obj_ids = array();
3703 if (ilObject::_lookupType($a_style_id) == "sty") {
3704 $set = $ilDB->query(
3705 "SELECT DISTINCT obj_id FROM style_usage " .
3706 " WHERE style_id = " . $ilDB->quote($a_style_id, "integer")
3707 );
3708
3709 while ($rec = $ilDB->fetchAssoc($set)) {
3710 $obj_ids[] = $rec["obj_id"];
3711 }
3712 }
3713 return $obj_ids;
3714 }
3715}
An exception for terminatinating execution or to throw for unit testing.
static _lookupContObjIdByStyleId($a_style_id)
lookup style sheet ID
static _deleteStyleAssignments($a_style_id)
delete all style references to style
static _getTemplatePreview($a_style, $a_type, $a_t_id, $a_small_mode=false)
Get table template preview.
Class ilObjStyleSheet.
static getBasicZipPath()
Get basic zip path.
setExportSubDir($a_dir)
Set local directory, that will be included within the zip file.
static _lookupActive($a_id)
Lookup active flag.
static _lookupStandard($a_id)
Lookup standard flag.
getMediaQueries()
Get colors of style.
getMaxMQueryOrderNr()
Get maximum media query order nr.
export()
Create export file.
getRefId()
Get ref id (show error message, since styles do not use ref ids)
static _getStyleParameterInputType($par)
static getBasicImageDir()
Get basic image dir.
updateTemplate($a_t_id, $a_name, $a_classes)
Update table template.
static getContentPrintStyle()
get content print style
addMediaQuery($a_mquery, $order_nr=0)
Add media query.
getColorCodeForName($a_name)
Remove a color.
deleteMediaQuery($a_id)
Delete media query.
do_3_9_Migration($a_id)
Migrate old 3.9 styles.
getCharacteristics($a_type="", $a_no_hidden=false, $a_include_core=true)
Get characteristics.
writeTemplatePreview($a_t_id, $a_preview_html)
Write table template preview.
read()
read style properties
static _getTemplateClassTypes($a_template_type="")
Get template class types.
deleteStylePar($a_tag, $a_class, $a_par, $a_type, $a_mq_id=0, $a_custom=false)
Delete style parameter by tag/class/parameter.
static _getClonableContentStyles()
Get all clonable styles (active standard styles and individual learning module styles with write perm...
addColor($a_name, $a_code)
Add color.
createReference()
Create a reference (show error message, since styles do not use ref ids)
static _lookupUpToDate($a_id)
Looup up to date.
static _replaceStylePar($style_id, $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id=0, $a_custom=false)
createExportDirectory()
Create export directory.
update()
update object in db
static _getStyleParameters($a_tag="")
putInTree($a_parent_ref)
Put in tree (show error message, since styles do not use ref ids)
static _HLSToRGB($a_hls)
HLS to RGB (both arrays, 0..255)
getParametersOfClass($a_type, $a_class, $a_mq_id=0)
Get parameters of class.
updateStyleParameter($a_id, $a_value)
update style parameter per id
uploadImage($a_file)
Upload image.
copyImagesToDir($a_target)
Copy images to directory.
createFromXMLFile($a_file, $a_skip_parent_create=false)
create style from xml file todo: add mq_id and custom
static lookupObjectForStyle($a_style_id)
Lookup object style.
characteristicExists($a_char, $a_style_type)
Check whether characteristic exists.
saveMediaQueryOrder($a_order_nr=null)
Save media query order.
addCharacteristic($a_type, $a_char, $a_hidden=false)
Add characteristic.
lookupTemplateName($a_t_id)
Lookup table template name for template ID.
getImagesDirectory()
Get images directory.
addTemplateClass($a_t_id, $a_type, $a_class)
Update table template.
getTemplates($a_type)
Get table templates of style.
removeColor($a_name)
Remove a color.
do_3_10_CharMigration($a_id="")
This is more or less a copy of Services/Migration/DBUpdate_1385/classes ilStyleMigration->addMissingS...
static getAvailableParameters()
Get available parameters.
updateMediaQuery($a_id, $a_mquery)
Update media query.
ilClone()
clone style sheet (note: styles have no ref ids and return an object id)
static _writeStandard($a_id, $a_std)
Write standard flag.
exportXML($a_dir)
export style xml file to directory
static _isExpandable($a_type)
setStyle($a_style)
set styles
cleanExportDirectory()
Clear export directory.
static lookupObjectStyle($a_obj_id)
Lookup object style.
handleXmlString($a_str)
Handle xml strin.
__construct($a_id=0, $a_call_by_reference=false)
Constructor @access public.
deleteCustomStylePars($a_tag, $a_class, $a_type, $a_mq_id=0)
Delete style parameter by tag/class/parameter.
& getMetaData()
get meta data object
addParameter($a_tag, $a_par, $a_type, $a_mq_id=0, $a_custom=false)
write style parameter to db
static _getColorFlavor($a_rgb, $a_i)
Get color flavor.
replaceStylePar($a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id=0, $a_custom=false)
Set style parameter per tag/class/parameter.
static _getStyleParameterNumericUnits($a_no_percentage=false)
static _createImagesDirectory($a_style_id)
Create images directory <data_dir>/sty/sty_<id>/images.
deleteParameter($a_id)
delete style parameter
getTemplateXML()
Get table template xml.
setRefId($a_ref_id)
Set ref id (show error message, since styles do not use ref ids)
setCharacteristics($a_chars)
Set characteristics.
static _getPseudoClasses($tag)
saveHideStatus($a_type, $a_char, $a_hide)
Save characteristic hide status.
writeStyleSetting($a_name, $a_value)
Write Style Setting.
static _addMissingStyleClassesToStyle($a_id)
Add missing style classes to all styles.
static _RGBToHLS($a_rgb)
RGB to HLS (both arrays, 0..255)
static _isHideable($a_type)
getStyleParameterGroups()
Get grouped parameter.
lookupStyleSetting($a_name)
Lookup style setting.
getThumbnailsDirectory()
Get thumbnails directory.
getTemplateClasses($a_tid)
Get template classes.
getHideStatus($a_type, $a_char)
Get characteristic hide status.
lookupTemplatePreview($a_t_id)
Lookup table template preview.
create($a_from_style=0, $a_import_mode=false)
Create a new style.
static _getStyleParameterSubPar($par)
writeCSSFile($a_target_file="", $a_image_dir="")
write css file to webspace directory
static getSyntaxStylePath()
get syntax style path
colorExists($a_color_name)
Check whether color exists.
static _determineTag($a_type)
getUpToDate()
Get up to date.
removeTemplate($a_t_id)
Remove table template.
getExportSubDir()
The local directory, that will be included within the zip file.
getStyle()
todo: bad style! should return array of objects, not multi-dim-arrays
static _lookupTemplateIdByName($a_style_id, $a_name)
Lookup table template preview.
static _writeActive($a_id, $a_active)
Write active flag.
static _getStandardStyles( $a_exclude_default_style=false, $a_include_deactivated=false, $a_scope=0)
Get standard styles.
addTemplate($a_type, $a_name, $a_classes)
Add table template.
setScope($a_scope)
Set scope.
static _getStyleSuperTypeForType($a_type)
updateColor($a_name, $a_new_name, $a_code)
Update color.
static getEffectiveContentStyleId($a_style_id, $a_type="")
Get effective Style Id.
getImages()
Get images of style.
getMediaQueryForId($a_id)
Get media query for id.
static getContentStylePath($a_style_id, $add_random=true, $add_token=true)
get content style path
static _lookupTemplateName($a_t_id)
Lookup table template name for template ID.
static _writeUpToDate($a_id, $a_up_to_date)
Write up to date.
do_3_10_Migration()
Migrates 3.10 style to 3.11 style.
copyCharacteristic( $a_from_style_id, $a_from_type, $a_from_char, $a_to_char)
Copy characteristic.
static isCoreStyle($a_type, $a_class)
Is core style.
static getPlaceHolderStylePath()
get placeholder style path (for Page Layouts)
createImportDirectory()
Create import directory.
deleteCharacteristic($a_type, $a_tag, $a_class)
Delete Characteristic.
getColors()
Get colors of style.
createImagesDirectory()
Create images directory <data_dir>/sty/sty_<id>/images.
getTemplate($a_t_id)
Get template.
assignMetaData(&$a_meta_data)
assign meta data object
setUpToDate($a_up_to_date=true)
Set style up to date (false + update will trigger css generation next time)
static _explodeRGB($a_rgb, $as_dec=false)
Explode an RGB string into an array.
static _getImagesDirectory($a_style_id)
Get images directory.
static _getStyleParameterValues($par)
static _writeScope($a_id, $a_scope)
Write scope.
deleteImage($a_file)
Delete an image.
static _getCoreStyles()
Get core styles.
static _addMissingStyleClassesToAllStyles($a_styles="")
Add missing style classes to all styles todo: add mq_id and custom handling.
static writeStyleUsage($a_obj_id, $a_style_id)
Write style usage.
createExportSubDirectory()
Create export directory.
getXML()
get xml representation of style object todo: add mq_id
static _getBasicStyleDom()
Get basic style dom.
templateExists($a_template_name)
Check whether template exists.
deleteStyleParOfChar($a_type, $a_class)
Delete style parameters of characteristic.
Class ilObject Basic functions for all objects.
getType()
get object type @access public
static _lookupTitle($a_id)
lookup object title
static _getAllReferences($a_id)
get all reference ids of object
getDescription()
get object description
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data@access public
getId()
get object id @access public
static _getObjectsDataForType($a_type, $a_omit_trash=false)
get all objects of a certain type
static _lookupType($a_id, $a_reference=false)
lookup object type
getTitle()
get object title @access public
static getDataDir()
get data directory (outside webspace)
static moveUploadedFile($a_file, $a_name, $a_target, $a_raise_errors=true, $a_mode="move_uploaded")
move uploaded file
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static sortArray( $array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static getWebspaceDir($mode="filesystem")
get webspace directory
static rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
static resizeImage($a_from, $a_to, $a_width, $a_height, $a_constrain_prop=false)
resize image
static zip($a_dir, $a_file, $compress_content=false)
zips given directory/file into given zip.file
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
static makeDirParents($a_dir)
Create a new directory and all parent directories.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
static signFile($path_to_file)
$xml
Definition: metadata.php:332
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
redirection script todo: (a better solution should control the processing via a xml file)
global $ilSetting
Definition: privfeed.php:17
$ilErr
Definition: raiseError.php:18
foreach($_POST as $key=> $value) $res
global $ilDB
$a_type
Definition: workflow.php:92
$DIC
Definition: xapitoken.php:46