ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
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 
5 require_once "./Services/Object/classes/class.ilObject.php";
6 
16 {
17  var $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"));
245 
246  // style types and their super type
247  public static $style_super_types = array(
248  "text_block" => array("text_block", "heading1", "heading2", "heading3"),
249  "text_inline" => array("text_inline", "sub", "sup"),
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  "text_inline" => "span",
290  "sup" => "sup",
291  "sub" => "sub",
292  "section" => "div",
293  "link" => "a",
294  "table" => "table",
295  "table_cell" => "td",
296  "table_caption" => "caption",
297  "media_cont" => "figure",
298  "media_caption" => "div",
299  "iim" => "div",
300  "marker" => "a",
301  "glo_overlay" => "div",
302  "glo_ovtitle" => "h1",
303  "glo_ovclink" => "a",
304  "glo_ovuglink" => "a",
305  "glo_ovuglistlink" => "a",
306  "sco_title" => "div",
307  "sco_keyw" => "div",
308  "sco_desc" => "div",
309  "sco_obj" => "div",
310  "sco_desct" => "div",
311  "sco_objt" => "div",
312  "sco_fmess" => "div",
313  "rte_menu" => "div",
314  "rte_mlink" => "a",
315  "rte_tree" => "div",
316  "rte_tclink" => "a",
317  "rte_drag" => "div",
318  "rte_node" => "div",
319  "rte_status" => "div",
320  "rte_tlink" => "a",
321  "rte_tul" => "div",
322  "rte_tli" => "div",
323  "rte_texp" => "a",
324  "list_o" => "ol",
325  "list_u" => "ul",
326  "list_item" => "li",
327  "flist_cont" => "div",
328  "flist_head" => "div",
329  "flist" => "ul",
330  "flist_li" => "li",
331  "flist_a" => "a",
332  "question" => "div",
333  "qtitle" => "div",
334  "qanswer" => "div",
335  "qimg" => "img",
336  "qimgd" => "a",
337  "qordul" => "ul",
338  "qordli" => "li",
339  "qetitem" => "a",
340  "qetcorr" => "span",
341  "qinput" => "input",
342  "qlinput" => "textarea",
343  "qsubmit" => "input",
344  "qfeedr" => "div",
345  "qfeedw" => "div",
346  "qover" => "div",
347  "page_frame" => "div",
348  "page_cont" => "div",
349  "page_fn" => "div",
350  "page" => "div",
351  "page_tnav" => "div",
352  "page_bnav" => "div",
353  "page_lnav" => "div",
354  "page_rnav" => "div",
355  "page_lnavlink" => "a",
356  "page_rnavlink" => "a",
357  "page_lnavimage" => "img",
358  "page_rnavimage" => "img",
359  "page_title" => "h1",
360  "va_cntr" => "div",
361  "va_icntr" => "div",
362  "va_icont" => "div",
363  "va_ihead" => "div",
364  "va_iheada" => "div",
365  "va_ihcap" => "div",
366  "ha_cntr" => "div",
367  "ha_icntr" => "div",
368  "ha_icont" => "div",
369  "ha_iheada" => "div",
370  "ha_ihcap" => "div",
371  "ha_ihead" => "div",
372  "ca_cntr" => "div",
373  "ca_icntr" => "div",
374  "ca_ihead" => "div",
375  "ca_icont" => "div"
376  );
377 
378  // pseudo classes
379  public static $pseudo_classes =
380  array ("a" => array("hover"), "div" => array("hover"), "img" => array("hover"));
381 
382  // core styles these styles MUST exists -> see also basic_style/style.xml
383  public static $core_styles = array(
384  array("type" => "text_block", "class" => "Standard"),
385  array("type" => "text_block", "class" => "List"),
386  array("type" => "text_block", "class" => "TableContent"),
387  array("type" => "heading1", "class" => "Headline1"),
388  array("type" => "heading2", "class" => "Headline2"),
389  array("type" => "heading3", "class" => "Headline3"),
390  array("type" => "text_inline", "class" => "Comment"),
391  array("type" => "text_inline", "class" => "Emph"),
392  array("type" => "text_inline", "class" => "Quotation"),
393  array("type" => "text_inline", "class" => "Strong"),
394  array("type" => "text_inline", "class" => "Accent"),
395  array("type" => "text_inline", "class" => "Important"),
396  array("type" => "sup", "class" => "Sup"),
397  array("type" => "sub", "class" => "Sub"),
398  array("type" => "link", "class" => "IntLink"),
399  array("type" => "link", "class" => "ExtLink"),
400  array("type" => "link", "class" => "FootnoteLink"),
401  array("type" => "link", "class" => "FileLink"),
402  array("type" => "link", "class" => "GlossaryLink"),
403  array("type" => "media_cont", "class" => "MediaContainer"),
404  array("type" => "media_cont", "class" => "MediaContainerMax50"),
405  array("type" => "media_cont", "class" => "MediaContainerFull100"),
406  array("type" => "table", "class" => "StandardTable"),
407  array("type" => "media_caption", "class" => "MediaCaption"),
408  array("type" => "iim", "class" => "ContentPopup"),
409  array("type" => "marker", "class" => "Marker"),
410  array("type" => "page_frame", "class" => "PageFrame"),
411  array("type" => "page_cont", "class" => "PageContainer"),
412  array("type" => "page", "class" => "Page"),
413  array("type" => "page_tnav", "class" => "TopNavigation"),
414  array("type" => "page_bnav", "class" => "BottomNavigation"),
415  array("type" => "page_lnav", "class" => "LeftNavigation"),
416  array("type" => "page_rnav", "class" => "RightNavigation"),
417  array("type" => "page_lnavlink", "class" => "LeftNavigationLink"),
418  array("type" => "page_rnavlink", "class" => "RightNavigationLink"),
419  array("type" => "page_lnavimage", "class" => "LeftNavigationImage"),
420  array("type" => "page_rnavimage", "class" => "RightNavigationImage"),
421  array("type" => "page_fn", "class" => "Footnote"),
422  array("type" => "page_title", "class" => "PageTitle"),
423  array("type" => "glo_overlay", "class" => "GlossaryOverlay"),
424  array("type" => "glo_ovtitle", "class" => "GlossaryOvTitle"),
425  array("type" => "glo_ovclink", "class" => "GlossaryOvCloseLink"),
426  array("type" => "glo_ovuglink", "class" => "GlossaryOvUnitGloLink"),
427  array("type" => "glo_ovuglistlink", "class" => "GlossaryOvUGListLink"),
428  array("type" => "sco_title", "class" => "Title"),
429  array("type" => "sco_desc", "class" => "Description"),
430  array("type" => "sco_desct", "class" => "DescriptionTop"),
431  array("type" => "sco_keyw", "class" => "Keywords"),
432  array("type" => "sco_obj", "class" => "Objective"),
433  array("type" => "sco_objt", "class" => "ObjectiveTop"),
434  array("type" => "sco_fmess", "class" => "FinalMessage"),
435  array("type" => "rte_menu", "class" => "RTEMenu"),
436  array("type" => "rte_menu", "class" => "RTELogo"),
437  array("type" => "rte_menu", "class" => "RTELinkBar"),
438  array("type" => "rte_mlink", "class" => "RTELink"),
439  array("type" => "rte_mlink", "class" => "RTELinkDisabled"),
440  array("type" => "rte_tree", "class" => "RTETree"),
441  array("type" => "rte_node", "class" => "RTECourse"),
442  array("type" => "rte_node", "class" => "RTEChapter"),
443  array("type" => "rte_node", "class" => "RTESco"),
444  array("type" => "rte_node", "class" => "RTEAsset"),
445  array("type" => "rte_node", "class" => "RTECourseDisabled"),
446  array("type" => "rte_node", "class" => "RTEChapterDisabled"),
447  array("type" => "rte_node", "class" => "RTEScoDisabled"),
448  array("type" => "rte_node", "class" => "RTEAssetDisabled"),
449  array("type" => "rte_status", "class" => "RTEAsset"),
450  array("type" => "rte_status", "class" => "RTECompleted"),
451  array("type" => "rte_status", "class" => "RTENotAttempted"),
452  array("type" => "rte_status", "class" => "RTERunning"),
453  array("type" => "rte_status", "class" => "RTEIncomplete"),
454  array("type" => "rte_status", "class" => "RTEPassed"),
455  array("type" => "rte_status", "class" => "RTEFailed"),
456  array("type" => "rte_status", "class" => "RTEBrowsed"),
457  array("type" => "rte_tlink", "class" => "RTETreeLink"),
458  array("type" => "rte_tlink", "class" => "RTETreeLinkDisabled"),
459  array("type" => "rte_tlink", "class" => "RTETreeCurrent"),
460  array("type" => "rte_tul", "class" => "RTETreeList"),
461  array("type" => "rte_tli", "class" => "RTETreeItem"),
462  array("type" => "rte_texp", "class" => "RTETreeExpanded"),
463  array("type" => "rte_texp", "class" => "RTETreeCollapsed"),
464  array("type" => "rte_tree", "class" => "RTETreeControl"),
465  array("type" => "rte_tclink", "class" => "RTETreeControlLink"),
466  array("type" => "rte_drag", "class" => "RTEDragBar"),
467  array("type" => "list_o", "class" => "NumberedList"),
468  array("type" => "list_u", "class" => "BulletedList"),
469  array("type" => "list_item", "class" => "StandardListItem"),
470  array("type" => "question", "class" => "Standard"),
471  array("type" => "question", "class" => "SingleChoice"),
472  array("type" => "question", "class" => "MultipleChoice"),
473  array("type" => "question", "class" => "TextQuestion"),
474  array("type" => "question", "class" => "OrderingQuestion"),
475  array("type" => "question", "class" => "MatchingQuestion"),
476  array("type" => "question", "class" => "ImagemapQuestion"),
477  array("type" => "question", "class" => "ErrorText"),
478  array("type" => "question", "class" => "TextSubset"),
479  array("type" => "question", "class" => "ClozeTest"),
480  array("type" => "qtitle", "class" => "Title"),
481  array("type" => "qanswer", "class" => "Answer"),
482  array("type" => "qimg", "class" => "QuestionImage"),
483  array("type" => "qimgd", "class" => "ImageDetailsLink"),
484  array("type" => "qordul", "class" => "OrderList"),
485  array("type" => "qordli", "class" => "OrderListItem"),
486  array("type" => "qordul", "class" => "OrderListHorizontal"),
487  array("type" => "qordli", "class" => "OrderListItemHorizontal"),
488  array("type" => "qetitem", "class" => "ErrorTextItem"),
489  array("type" => "qetitem", "class" => "ErrorTextSelected"),
490  array("type" => "qetcorr", "class" => "ErrorTextCorrected"),
491  array("type" => "qinput", "class" => "TextInput"),
492  array("type" => "qlinput", "class" => "LongTextInput"),
493  array("type" => "qsubmit", "class" => "Submit"),
494  array("type" => "qfeedr", "class" => "FeedbackRight"),
495  array("type" => "qfeedw", "class" => "FeedbackWrong"),
496  array("type" => "qover", "class" => "Correct"),
497  array("type" => "qover", "class" => "Inorrect"),
498  array("type" => "qover", "class" => "StatusMessage"),
499  array("type" => "qover", "class" => "WrongAnswersMessage"),
500  array("type" => "flist_cont", "class" => "FileListContainer"),
501  array("type" => "flist_head", "class" => "FileListHeading"),
502  array("type" => "flist", "class" => "FileList"),
503  array("type" => "flist_li", "class" => "FileListItem"),
504  array("type" => "flist_a", "class" => "FileListItemLink")
505  );
506 
507  public static $templates = array(
508  "table" => array(
509  "table" => "table",
510  "caption" => "table_caption",
511  "row_head" => "table_cell",
512  "row_foot" => "table_cell",
513  "col_head" => "table_cell",
514  "col_foot" => "table_cell",
515  "odd_row" => "table_cell",
516  "even_row" => "table_cell",
517  "odd_col" => "table_cell",
518  "even_col" => "table_cell"),
519  "vaccordion" => array(
520  "va_cntr" => "va_cntr",
521  "va_icntr" => "va_icntr",
522  "va_ihead" => "va_ihead",
523  "va_iheada" => "va_iheada",
524  "va_ihcap" => "va_ihcap",
525  "va_icont" => "va_icont"
526  ),
527  "haccordion" => array(
528  "ha_cntr" => "ha_cntr",
529  "ha_icntr" => "ha_icntr",
530  "ha_ihead" => "ha_ihead",
531  "ha_iheada" => "ha_iheada",
532  "ha_ihcap" => "ha_ihcap",
533  "ha_icont" => "ha_icont"
534  ),
535  "carousel" => array(
536  "ca_cntr" => "ca_cntr",
537  "ca_icntr" => "ca_icntr",
538  "ca_ihead" => "ca_ihead",
539  "ca_icont" => "ca_icont"
540  )
541  );
542 
543  // basic style xml file, image directory and dom
544  protected static $basic_style_file = "./Services/Style/Content/basic_style/style.xml";
545  protected static $basic_style_image_dir = "./Services/Style/Content/basic_style/images";
546  protected static $basic_style_dom;
547 
554  function __construct($a_id = 0, $a_call_by_reference = false)
555  {
556  $this->type = "sty";
557  $this->style = array();
558  if($a_call_by_reference)
559  {
560  $this->ilias->raiseError("Can't instantiate style object via reference id.",$this->ilias->error_obj->FATAL);
561  }
562 
563  parent::__construct($a_id, false);
564  }
565 
569  function setRefId($a_ref_id)
570  {
571  $this->ilias->raiseError("Operation ilObjStyleSheet::setRefId() not allowed.",$this->ilias->error_obj->FATAL);
572  }
573 
577  function getRefId()
578  {
579  return "";
580  //$this->ilias->raiseError("Operation ilObjStyleSheet::getRefId() not allowed.",$this->ilias->error_obj->FATAL);
581  }
582 
586  function putInTree($a_parent_ref)
587  {
588  $this->ilias->raiseError("Operation ilObjStyleSheet::putInTree() not allowed.",$this->ilias->error_obj->FATAL);
589  }
590 
594  function createReference()
595  {
596  $this->ilias->raiseError("Operation ilObjStyleSheet::createReference() not allowed.",$this->ilias->error_obj->FATAL);
597  }
598 
602  function setUpToDate($a_up_to_date = true)
603  {
604  $this->up_to_date = $a_up_to_date;
605  }
606 
610  function getUpToDate()
611  {
612  return $this->up_to_date;
613  }
614 
618  function setScope($a_scope)
619  {
620  $this->scope = $a_scope;
621  }
622 
626  function getScope()
627  {
628  return $this->scope;
629  }
630 
634  static function _writeUpToDate($a_id, $a_up_to_date)
635  {
636  global $ilDB;
637 
638  $q = "UPDATE style_data SET uptodate = ".
639  $ilDB->quote((int) $a_up_to_date, "integer").
640  " WHERE id = ".$ilDB->quote($a_id, "integer");
641  $ilDB->manipulate($q);
642  }
643 
647  static function _lookupUpToDate($a_id)
648  {
649  global $ilDB;
650 
651  $q = "SELECT uptodate FROM style_data ".
652  " WHERE id = ".$ilDB->quote($a_id, "integer");
653  $res = $ilDB->query($q);
654  $sty = $ilDB->fetchAssoc($res);
655 
656  return (boolean) $sty["uptodate"];
657  }
658 
662  static function _writeStandard($a_id, $a_std)
663  {
664  global $ilDB;
665 
666  $q = "UPDATE style_data SET standard = ".
667  $ilDB->quote((int) $a_std, "integer").
668  " WHERE id = ".$ilDB->quote($a_id, "integer");
669  $ilDB->manipulate($q);
670  }
671 
675  static function _writeScope($a_id, $a_scope)
676  {
677  global $ilDB;
678 
679  $q = "UPDATE style_data SET category = ".
680  $ilDB->quote((int) $a_scope, "integer").
681  " WHERE id = ".$ilDB->quote($a_id, "integer");
682  $ilDB->manipulate($q);
683  }
684 
688  static function _lookupStandard($a_id)
689  {
690  global $ilDB;
691 
692  $q = "SELECT * FROM style_data ".
693  " WHERE id = ".$ilDB->quote($a_id, "integer");
694  $res = $ilDB->query($q);
695  $sty = $ilDB->fetchAssoc($res);
696 
697  return (boolean) $sty["standard"];
698  }
699 
703  static function _writeActive($a_id, $a_active)
704  {
705  global $ilDB;
706 
707  $q = "UPDATE style_data SET active = ".
708  $ilDB->quote((int) $a_active, "integer").
709  " WHERE id = ".$ilDB->quote($a_id, "integer");
710  $ilDB->manipulate($q);
711  }
712 
716  static function _lookupActive($a_id)
717  {
718  global $ilDB;
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["active"];
726  }
727 
731  static function _getStandardStyles($a_exclude_default_style = false,
732  $a_include_deactivated = false, $a_scope = 0)
733  {
734  global $ilDB, $ilias, $tree;
735 
736  $default_style = $ilias->getSetting("default_content_style_id");
737 
738  $and_str = "";
739  if (!$a_include_deactivated)
740  {
741  $and_str = " AND active = 1";
742  }
743 
744  $q = "SELECT * FROM style_data ".
745  " WHERE standard = 1".$and_str;
746  $res = $ilDB->query($q);
747  $styles = array();
748  while($sty = $ilDB->fetchAssoc($res))
749  {
750  if (!$a_exclude_default_style || $default_style != $sty["id"])
751  {
752  // check scope
753  if ($a_scope > 0 && $sty["category"] > 0)
754  {
755  if ($tree->isInTree($sty["category"]) &&
756  $tree->isInTree($a_scope))
757  {
758  $path = $tree->getPathId($a_scope);
759  if (!in_array($sty["category"], $path))
760  {
761  continue;
762  }
763  }
764  }
765  $styles[$sty["id"]] = ilObject::_lookupTitle($sty["id"]);
766  }
767  }
768 
769  return $styles;
770  }
771 
772 
777  static function _getClonableContentStyles()
778  {
779  global $ilAccess, $ilDB;
780 
781  $clonable_styles = array();
782 
783  $q = "SELECT * FROM style_data";
784  $style_set = $ilDB->query($q);
785  while($style_rec = $ilDB->fetchAssoc($style_set))
786  {
787  $clonable = false;
788  if ($style_rec["standard"] == 1)
789  {
790  if ($style_rec["active"] == 1)
791  {
792  $clonable = true;
793  }
794  }
795  else
796  {
797  include_once("./Modules/LearningModule/classes/class.ilObjContentObject.php");
798  $obj_ids = ilObjContentObject::_lookupContObjIdByStyleId($style_rec["id"]);
799  if (count($obj_ids) == 0)
800  {
801  $obj_ids = self::lookupObjectForStyle($style_rec["id"]);
802  }
803  foreach($obj_ids as $id)
804  {
805  $ref = ilObject::_getAllReferences($id);
806  foreach($ref as $ref_id)
807  {
808  if ($ilAccess->checkAccess("write", "", $ref_id))
809  {
810  $clonable = true;
811  }
812  }
813  }
814  }
815  if ($clonable)
816  {
817  $clonable_styles[$style_rec["id"]] =
818  ilObject::_lookupTitle($style_rec["id"]);
819  }
820  }
821 
822  asort($clonable_styles);
823 
824  return $clonable_styles;
825  }
826 
830  function assignMetaData(&$a_meta_data)
831  {
832  $this->meta_data = $a_meta_data;
833  }
834 
838  static function _getBasicStyleDom()
839  {
840  global $ilBench;
841 
842  if (!is_object(self::$basic_style_dom))
843  {
844  self::$basic_style_dom = new DOMDocument();
845  self::$basic_style_dom->load(self::$basic_style_file);
846  }
847 
848  return self::$basic_style_dom;
849  }
850 
854  function &getMetaData()
855  {
856  return $this->meta_data;
857  }
858 
862  function create($a_from_style = 0, $a_import_mode = false)
863  {
864  global $ilDB;
865 
866  parent::create();
867 
868  if ($a_from_style == 0)
869  {
870  if (!$a_import_mode)
871  {
872  // copy styles from basic style
873  $this->createFromXMLFile(self::$basic_style_file, true);
874 
875  // copy images from basic style
876  $this->createImagesDirectory();
877  ilUtil::rCopy(self::$basic_style_image_dir,
878  $this->getImagesDirectory());
879  }
880  else
881  {
882  // add style_data record
883  $q = "INSERT INTO style_data (id, uptodate, category) VALUES ".
884  "(".$ilDB->quote($this->getId(), "integer").", 0,".
885  $ilDB->quote((int) $this->getScope(), "integer").")";
886  $ilDB->manipulate($q);
888  }
889  }
890  else
891  {
892  // get style parameter records
893  $def = array();
894  $q = "SELECT * FROM style_parameter WHERE style_id = ".
895  $ilDB->quote($a_from_style, "integer");
896  $par_set = $ilDB->query($q);
897  while($par_rec = $ilDB->fetchAssoc($par_set))
898  {
899  $def[] = array("tag" => $par_rec["tag"], "class" => $par_rec["class"],
900  "parameter" => $par_rec["parameter"], "value" => $par_rec["value"],
901  "type" => $par_rec["type"], "mq_id" => $par_rec["mq_id"], "custom" => $par_rec["custom"]);
902  }
903 
904  // get style characteristics records
905  $chars = array();
906  $q = "SELECT * FROM style_char WHERE style_id = ".
907  $ilDB->quote($a_from_style, "integer");
908  $par_set = $ilDB->query($q);
909  while($par_rec = $ilDB->fetchAssoc($par_set))
910  {
911  $chars[] = array("type" => $par_rec["type"], "characteristic" => $par_rec["characteristic"]);
912  }
913 
914 
915  // copy media queries
916  $from_style = new ilObjStyleSheet($a_from_style);
917  $mqs = $from_style->getMediaQueries();
918  $mq_mapping = array();
919  foreach ($mqs as $mq)
920  {
921  $nid = $this->addMediaQuery($mq["mquery"]);
922  $mq_mapping[$mq["id"]] = $nid;
923  }
924 
925  // default style settings
926  foreach ($def as $sty)
927  {
928  $id = $ilDB->nextId("style_parameter");
929  $q = "INSERT INTO style_parameter (id, style_id, tag, class, parameter, value, type, mq_id, custom) VALUES ".
930  "(".
931  $ilDB->quote($id, "integer").",".
932  $ilDB->quote($this->getId(), "integer").",".
933  $ilDB->quote($sty["tag"], "text").",".
934  $ilDB->quote($sty["class"], "text").",".
935  $ilDB->quote($sty["parameter"], "text").",".
936  $ilDB->quote($sty["value"], "text").",".
937  $ilDB->quote($sty["type"], "text").",".
938  $ilDB->quote((int) $mq_mapping[$sty["mq_id"]], "integer").",".
939  $ilDB->quote($sty["custom"], "integer").
940  ")";
941  $ilDB->manipulate($q);
942  }
943 
944  // insert style characteristics
945  foreach ($chars as $char)
946  {
947  $q = "INSERT INTO style_char (style_id, type, characteristic) VALUES ".
948  "(".$ilDB->quote($this->getId(), "integer").",".
949  $ilDB->quote($char["type"], "text").",".
950  $ilDB->quote($char["characteristic"], "text").")";
951  $ilDB->manipulate($q);
952  }
953 
954  // add style_data record
955  $q = "INSERT INTO style_data (id, uptodate, category) VALUES ".
956  "(".$ilDB->quote($this->getId(), "integer").", 0,".
957  $ilDB->quote((int) $this->getScope(), "integer").")";
958  $ilDB->manipulate($q);
959 
960  // copy images
961  $this->createImagesDirectory();
962  ilUtil::rCopy($from_style->getImagesDirectory(),
963  $this->getImagesDirectory());
964 
965  // copy colors
966  $colors = $from_style->getColors();
967  foreach ($colors as $c)
968  {
969  $this->addColor($c["name"], $c["code"]);
970  }
971 
972  // copy templates
974  foreach ($tcts as $tct => $v)
975  {
976  $templates = $from_style->getTemplates($tct);
977  foreach ($templates as $t)
978  {
979  $this->addTemplate($tct, $t["name"], $t["classes"]);
980  }
981  }
982 
983  }
984 
985  $this->read();
986  if (!$a_import_mode)
987  {
988  $this->writeCSSFile();
989  }
990  }
991 
995  function deleteCharacteristic($a_type, $a_tag, $a_class)
996  {
997  global $ilDB;
998 
999  // check, if characteristic is not a core style
1001  if (empty($core_styles[$a_type.".".$a_tag.".".$a_class]))
1002  {
1003  // delete characteristic record
1004  $st = $ilDB->manipulateF(
1005  "DELETE FROM style_char WHERE style_id = %s AND type = %s AND characteristic = %s",
1006  array("integer", "text", "text"),
1007  array($this->getId(), $a_type, $a_class));
1008 
1009  // delete parameter records
1010  $st = $ilDB->manipulateF("DELETE FROM style_parameter WHERE style_id = %s AND tag = %s AND type = %s AND class = %s",
1011  array("integer", "text", "text", "text"),
1012  array($this->getId(), $a_tag, $a_type, $a_class));
1013  }
1014 
1015  $this->setUpToDate(false);
1016  $this->_writeUpToDate($this->getId(), false);
1017  }
1018 
1022  function characteristicExists($a_char, $a_style_type)
1023  {
1024  global $ilDB;
1025 
1026  $set = $ilDB->queryF(
1027  "SELECT style_id FROM style_char WHERE style_id = %s AND characteristic = %s AND type = %s",
1028  array("integer", "text", "text"),
1029  array($this->getId(), $a_char, $a_style_type));
1030  if ($rec = $ilDB->fetchAssoc($set))
1031  {
1032  return true;
1033  }
1034  return false;
1035  }
1036 
1040  function addCharacteristic($a_type, $a_char, $a_hidden = false)
1041  {
1042  global $ilDB;
1043 
1044  // delete characteristic record
1045  $ilDB->manipulateF("INSERT INTO style_char (style_id, type, characteristic, hide)".
1046  " VALUES (%s,%s,%s,%s) ",
1047  array("integer", "text", "text", "integer"),
1048  array($this->getId(), $a_type, $a_char, $a_hidden));
1049 
1050  $this->setUpToDate(false);
1051  $this->_writeUpToDate($this->getId(), false);
1052  }
1053 
1060  function copyCharacteristic($a_from_style_id,
1061  $a_from_type, $a_from_char, $a_to_char)
1062  {
1063  global $ilDB;
1064 
1065  if (!$this->characteristicExists($a_to_char, $a_from_type))
1066  {
1067  $this->addCharacteristic($a_from_type, $a_to_char);
1068  }
1069  $this->deleteStyleParOfChar($a_from_type, $a_to_char);
1070 
1071  $from_style = new ilObjStyleSheet($a_from_style_id);
1072 
1073  // todo fix using mq_id
1074  $pars = $from_style->getParametersOfClass($a_from_type, $a_from_char);
1075 
1076  $colors = array();
1077  foreach ($pars as $p => $v)
1078  {
1079  if (substr($v, 0, 1) == "!")
1080  {
1081  $colors[] = substr($v, 1);
1082  }
1083  $this->replaceStylePar(ilObjStyleSheet::_determineTag($a_from_type),
1084  $a_to_char, $p, $v, $a_from_type);
1085  }
1086 
1087  // copy colors
1088  foreach ($colors as $c)
1089  {
1090  if (!$this->colorExists($c))
1091  {
1092  $this->addColor($c, $from_style->getColorCodeForName($c));
1093  }
1094  }
1095  }
1096 
1100  function getCharacteristics($a_type = "", $a_no_hidden = false, $a_include_core = true)
1101  {
1102  $chars = array();
1103 
1104  if ($a_type == "")
1105  {
1106  $chars = $this->chars;
1107  }
1108  if (is_array($this->chars_by_type[$a_type]))
1109  {
1110  foreach ($this->chars_by_type[$a_type] as $c)
1111  {
1112  if ($a_include_core || !self::isCoreStyle($a_type, $c))
1113  {
1114  $chars[] = $c;
1115  }
1116  }
1117  }
1118 
1119  if ($a_no_hidden)
1120  {
1121  foreach ($chars as $k => $char)
1122  {
1123  if ($a_type == "" && $this->hidden_chars[$char["type"].":".$char["class"]])
1124  {
1125  unset($chars[$k]);
1126  }
1127  else if ($this->hidden_chars[$a_type.":".$char])
1128  {
1129  unset($chars[$k]);
1130  }
1131  }
1132  }
1133 
1134  return $chars;
1135  }
1136 
1140  function setCharacteristics($a_chars)
1141  {
1142  $this->chars = $a_chars;
1143  // $this->chars_by_type[$a_type];
1144  }
1145 
1149  function saveHideStatus($a_type, $a_char, $a_hide)
1150  {
1151  global $ilDB;
1152 
1153  $ilDB->manipulate("UPDATE style_char SET ".
1154  " hide = ".$ilDB->quote((int) $a_hide, "integer").
1155  " WHERE style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
1156  " type = ".$ilDB->quote($a_type, "text")." AND ".
1157  " characteristic = ".$ilDB->quote($a_char, "text")
1158  );
1159  }
1160 
1164  function getHideStatus($a_type, $a_char)
1165  {
1166  global $ilDB;
1167 
1168  $set = $ilDB->query("SELECT hide FROM style_char ".
1169  " WHERE style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
1170  " type = ".$ilDB->quote($a_type, "text")." AND ".
1171  " characteristic = ".$ilDB->quote($a_char, "text")
1172  );
1173  $rec = $ilDB->fetchAssoc($set);
1174 
1175  return $rec["hide"];
1176  }
1177 
1184  function ilClone()
1185  {
1186  global $log, $lng;
1187 
1188  $lng->loadLanguageModule("style");
1189 
1190  $new_obj = new ilObjStyleSheet();
1191  $new_obj->setTitle($this->getTitle()." (".$lng->txt("sty_acopy").")");
1192  $new_obj->setType($this->getType());
1193  $new_obj->setDescription($this->getDescription());
1194  $new_obj->create($this->getId());
1195 
1196  $new_obj->writeStyleSetting("disable_auto_margins",
1197  $this->lookupStyleSetting("disable_auto_margins"));
1198 
1199  return $new_obj->getId();
1200  }
1201 
1205  function copyImagesToDir($a_target)
1206  {
1207  ilUtil::rCopy($this->getImagesDirectory(), $a_target);
1208  }
1209 
1219  function addParameter($a_tag, $a_par, $a_type, $a_mq_id = 0, $a_custom = false)
1220  {
1221  global $ilDB;
1222 
1223  $avail_params = $this->getAvailableParameters();
1224  $tag = explode(".", $a_tag);
1225  $value = $avail_params[$a_par][0];
1226  $id = $ilDB->nextId("style_parameter");
1227  $q = "INSERT INTO style_parameter (id,style_id, type, tag, class, parameter, value, mq_id, custom) VALUES ".
1228  "(".
1229  $ilDB->quote($id, "integer").",".
1230  $ilDB->quote($this->getId(), "integer").",".
1231  $ilDB->quote($a_type, "text").",".
1232  $ilDB->quote($tag[0], "text").",".
1233  $ilDB->quote($tag[1], "text").",".
1234  $ilDB->quote($a_par, "text").",".
1235  $ilDB->quote($value, "text").",".
1236  $ilDB->quote($a_mq_id, "integer").",".
1237  $ilDB->quote($a_custom, "integer").
1238  ")";
1239  $ilDB->manipulate($q);
1240  $this->read();
1241  $this->writeCSSFile();
1242  }
1243 
1249  {
1251  }
1252 
1257  static function _createImagesDirectory($a_style_id)
1258  {
1259  global $ilErr;
1260 
1261  $sty_data_dir = ilUtil::getWebspaceDir()."/sty";
1262  ilUtil::makeDir($sty_data_dir);
1263  if(!is_writable($sty_data_dir))
1264  {
1265  $ilErr->raiseError("Style data directory (".$sty_data_dir
1266  .") not writeable.", $ilErr->FATAL);
1267  }
1268 
1269  $style_dir = $sty_data_dir."/sty_".$a_style_id;
1270  ilUtil::makeDir($style_dir);
1271  if(!@is_dir($style_dir))
1272  {
1273  $ilErr->raiseError("Creation of style directory failed (".
1274  $style_dir.").",$ilErr->FATAL);
1275  }
1276 
1277  // create images subdirectory
1278  $im_dir = $style_dir."/images";
1279  ilUtil::makeDir($im_dir);
1280  if(!@is_dir($im_dir))
1281  {
1282  $ilErr->raiseError("Creation of Import Directory failed (".
1283  $im_dir.").", $ilErr->FATAL);
1284  }
1285 
1286  // create thumbnails directory
1287  $thumb_dir = $style_dir."/images/thumbnails";
1288  ilUtil::makeDir($thumb_dir);
1289  if(!@is_dir($thumb_dir))
1290  {
1291  $ilErr->raiseError("Creation of Import Directory failed (".
1292  $thumb_dir.").", $ilErr->FATAL);
1293  }
1294  }
1295 
1300  {
1302  }
1303 
1307  static function _getImagesDirectory($a_style_id)
1308  {
1309  return ilUtil::getWebspaceDir()."/sty/sty_".$a_style_id.
1310  "/images";
1311  }
1312 
1317  {
1318  return $this->getImagesDirectory().
1319  "/thumbnails";
1320  }
1321 
1325  function getImages()
1326  {
1327  $dir = $this->getImagesDirectory();
1328  $images = array();
1329  if (is_dir($dir))
1330  {
1331  $entries = ilUtil::getDir($dir);
1332  foreach($entries as $entry)
1333  {
1334  if (substr($entry["entry"],0,1) == ".")
1335  {
1336  continue;
1337  }
1338  if ($entry["type"] != "dir")
1339  {
1340  $images[] = $entry;
1341  }
1342  }
1343  }
1344 
1345  return $images;
1346  }
1347 
1351  function uploadImage($a_file)
1352  {
1353  $this->createImagesDirectory();
1354  @ilUtil::moveUploadedFile($a_file["tmp_name"], $a_file["name"],
1355  $this->getImagesDirectory()."/".$a_file["name"]);
1356  @ilUtil::resizeImage($this->getImagesDirectory()."/".$a_file["name"],
1357  $this->getThumbnailsDirectory()."/".$a_file["name"], 75, 75);
1358  }
1359 
1363  function deleteImage($a_file)
1364  {
1365  if (is_file($this->getImagesDirectory()."/".$a_file))
1366  {
1367  unlink($this->getImagesDirectory()."/".$a_file);
1368  }
1369  if (is_file($this->getThumbnailsDirectory()."/".$a_file))
1370  {
1371  unlink($this->getThumbnailsDirectory()."/".$a_file);
1372  }
1373  }
1374 
1380  function deleteParameter($a_id)
1381  {
1382  global $ilDB;
1383 
1384  $q = "DELETE FROM style_parameter WHERE id = ".
1385  $ilDB->quote($a_id, "integer");
1386  $ilDB->query($q);
1387  }
1388 
1398  function deleteStylePar($a_tag, $a_class, $a_par, $a_type, $a_mq_id = 0, $a_custom = false)
1399  {
1400  global $ilDB;
1401 
1402  $q = "DELETE FROM style_parameter WHERE ".
1403  " style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
1404  " tag = ".$ilDB->quote($a_tag, "text")." AND ".
1405  " class = ".$ilDB->quote($a_class, "text")." AND ".
1406  " mq_id = ".$ilDB->quote($a_mq_id, "integer")." AND ".
1407  " custom = ".$ilDB->quote($a_custom, "integer")." AND ".
1408  " ".$ilDB->equals("type", $a_type, "text", true)." AND ".
1409  " parameter = ".$ilDB->quote($a_par, "text");
1410 
1411  $ilDB->manipulate($q);
1412  }
1413 
1423  function deleteCustomStylePars($a_tag, $a_class, $a_type, $a_mq_id = 0)
1424  {
1425  global $ilDB;
1426 
1427  $q = "DELETE FROM style_parameter WHERE ".
1428  " style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
1429  " tag = ".$ilDB->quote($a_tag, "text")." AND ".
1430  " class = ".$ilDB->quote($a_class, "text")." AND ".
1431  " mq_id = ".$ilDB->quote($a_mq_id, "integer")." AND ".
1432  " custom = ".$ilDB->quote(1, "integer")." AND ".
1433  " ".$ilDB->equals("type", $a_type, "text", true);
1434 
1435  $ilDB->manipulate($q);
1436  }
1437 
1446  function deleteStyleParOfChar($a_type, $a_class)
1447  {
1448  global $ilDB;
1449 
1450  $q = "DELETE FROM style_parameter WHERE ".
1451  " style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
1452  " class = ".$ilDB->quote($a_class, "text")." AND ".
1453  " ".$ilDB->equals("type", $a_type, "text", true);
1454 
1455  $ilDB->manipulate($q);
1456  }
1457 
1458 
1462  function delete()
1463  {
1464  global $ilDB;
1465 
1466  // delete object
1467  parent::delete();
1468 
1469  // check whether this style is global default
1470  $def_style = $this->ilias->getSetting("default_content_style_id");
1471  if ($def_style == $this->getId())
1472  {
1473  $this->ilias->deleteSetting("default_content_style_id");
1474  }
1475 
1476  // check whether this style is global fixed
1477  $fixed_style = $this->ilias->getSetting("fixed_content_style_id");
1478  if ($fixed_style == $this->getId())
1479  {
1480  $this->ilias->deleteSetting("fixed_content_style_id");
1481  }
1482 
1483  // delete style parameter
1484  $q = "DELETE FROM style_parameter WHERE style_id = ".
1485  $ilDB->quote($this->getId(), "integer");
1486  $ilDB->manipulate($q);
1487 
1488  // delete style file
1489  $css_file_name = ilUtil::getWebspaceDir()."/css/style_".$this->getId().".css";
1490  if (is_file($css_file_name))
1491  {
1492  unlink($css_file_name);
1493  }
1494 
1495  // delete media queries
1496  $ilDB->manipulate("DELETE FROM sty_media_query WHERE ".
1497  " style_id = ".$ilDB->quote($this->getId(), "integer")
1498  );
1499 
1500  // delete entries in learning modules
1501  include_once("./Modules/LearningModule/classes/class.ilObjContentObject.php");
1503 
1504  // delete style data record
1505  $q = "DELETE FROM style_data WHERE id = ".
1506  $ilDB->quote($this->getId(), "integer");
1507  $ilDB->manipulate($q);
1508 
1509  }
1510 
1511 
1515  function read()
1516  {
1517  global $ilDB;
1518 
1519  parent::read();
1520 
1521  $q = "SELECT * FROM style_parameter WHERE style_id = ".
1522  $ilDB->quote($this->getId(), "integer")." ORDER BY tag, class, type, mq_id ";
1523  $style_set = $ilDB->query($q);
1524  $ctag = "";
1525  $cclass = "";
1526  $ctype = "";
1527  $cmq_id = 0;
1528  $this->style = array();
1529  // workaround for bug #17586, see also http://stackoverflow.com/questions/3066356/multiple-css-classes-properties-overlapping-based-on-the-order-defined
1530  // e.g. ha_iheada must be written after ha_ihead, since they are acting on the same dom node
1531  // styles that must be added at the end
1532  $this->end_styles = array();
1533  while($style_rec = $ilDB->fetchAssoc($style_set))
1534  {
1535  if ($style_rec["tag"] != $ctag || $style_rec["class"] != $cclass
1536  || $style_rec["type"] != $ctype || $style_rec["mq_id"] != $cmq_id)
1537  {
1538  // add current tag array to style array
1539  if(is_array($tag))
1540  {
1541  if (in_array($ctype, array("ha_iheada", "va_iheada")))
1542  {
1543  $this->end_styles[] = $tag;
1544  }
1545  else
1546  {
1547  $this->style[] = $tag;
1548  }
1549  }
1550  $tag = array();
1551  }
1552  $ctag = $style_rec["tag"];
1553  $cclass = $style_rec["class"];
1554  $ctype = $style_rec["type"];
1555  $cmq_id = $style_rec["mq_id"];
1556  $tag[] = $style_rec;
1557  // added $cmq_id
1558  $this->style_class[$ctype][$cclass][$cmq_id][$style_rec["parameter"]] = $style_rec["value"];
1559  }
1560  if(is_array($tag))
1561  {
1562  $this->style[] = $tag;
1563  }
1564  foreach ($this->end_styles as $s)
1565  {
1566  $this->style[] = $s;
1567  }
1568 //var_dump($this->style_class);
1569  $q = "SELECT * FROM style_data WHERE id = ".
1570  $ilDB->quote($this->getId(), "integer");
1571  $res = $ilDB->query($q);
1572  $sty = $ilDB->fetchAssoc($res);
1573  $this->setUpToDate((boolean) $sty["uptodate"]);
1574  $this->setScope($sty["category"]);
1575 
1576  // get style characteristics records
1577  $this->chars = array();
1578  $this->chars_by_type = array();
1579  $q = "SELECT * FROM style_char WHERE style_id = ".
1580  $ilDB->quote($this->getId(), "integer").
1581  " ORDER BY type ASC, characteristic ASC";
1582  $par_set = $ilDB->query($q);
1583  while($par_rec = $ilDB->fetchAssoc($par_set))
1584  {
1585  $this->chars[] = array("type" => $par_rec["type"], "class" => $par_rec["characteristic"], "hide" => $par_rec["hide"]);
1586  $this->chars_by_type[$par_rec["type"]][] = $par_rec["characteristic"];
1587  if ($par_rec["hide"])
1588  {
1589  $this->hidden_chars[$par_rec["type"].":".$par_rec["characteristic"]] = true;
1590  }
1591  }
1592 // var_dump($this->style); exit;
1593  }
1594 
1598  function writeCSSFile($a_target_file = "", $a_image_dir = "")
1599  {
1600  $style = $this->getStyle();
1601 
1602  if ($a_target_file == "")
1603  {
1604  $css_file_name = ilUtil::getWebspaceDir()."/css/style_".$this->getId().".css";
1605  }
1606  else
1607  {
1608  $css_file_name = $a_target_file;
1609  }
1610  $css_file = fopen($css_file_name, "w");
1611 
1612  $page_background = "";
1613 
1614  $mqs = array(array("mquery" => "", "id" => 0));
1615  foreach ($this->getMediaQueries() as $mq)
1616  {
1617  $mqs[] = $mq;
1618  }
1619 
1620  // iterate all media queries
1621  foreach ($mqs as $mq)
1622  {
1623  if ($mq["id"] > 0)
1624  {
1625  fwrite ($css_file, "@media ".$mq["mquery"]." {\n");
1626  }
1627  reset($style);
1628  foreach ($style as $tag)
1629  {
1630  if ($tag[0]["mq_id"] != $mq["id"])
1631  {
1632  continue;
1633  }
1634  fwrite ($css_file, $tag[0]["tag"].".ilc_".$tag[0]["type"]."_".$tag[0]["class"]."\n");
1635 // echo "<br>";
1636 // var_dump($tag[0]["type"]);
1637  if ($tag[0]["tag"] == "td")
1638  {
1639  fwrite ($css_file, ",th".".ilc_".$tag[0]["type"]."_".$tag[0]["class"]."\n");
1640  }
1641  if (in_array($tag[0]["tag"], array("h1", "h2", "h3")))
1642  {
1643  fwrite ($css_file, ",div.ilc_text_block_".$tag[0]["class"]."\n");
1644  fwrite ($css_file, ",body.ilc_text_block_".$tag[0]["class"]."\n");
1645  }
1646  if ($tag[0]["type"] == "section") // sections can use a tags, if links are used
1647  {
1648  fwrite ($css_file, ",a.ilc_".$tag[0]["type"]."_".$tag[0]["class"]."\n");
1649  }
1650  if ($tag[0]["type"] == "text_block")
1651  {
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  {
1661  $cur_par = $par["parameter"];
1662  $cur_val = $par["value"];
1663 
1664  // replace named colors
1665  if (is_int(strpos($cur_par, "color")) && substr(trim($cur_val), 0, 1) == "!")
1666  {
1667  $cur_val = $this->getColorCodeForName(substr($cur_val, 1));
1668  }
1669 
1670  if ($tag[0]["type"] == "table" && is_int(strpos($par["parameter"], "border")))
1671  {
1672  $t_border[$cur_par] = $cur_val;
1673  }
1674 
1675  if (in_array($cur_par, array("background-image", "list-style-image")))
1676  {
1677  if (is_int(strpos($cur_val, "/"))) // external
1678  {
1679  $cur_val = "url(".$cur_val.")";
1680  }
1681  else // internal
1682  {
1683  if ($a_image_dir == "")
1684  {
1685  $cur_val = "url(../sty/sty_".$this->getId()."/images/".$cur_val.")";
1686  }
1687  else
1688  {
1689  $cur_val = "url(".$a_image_dir."/".$cur_val.")";
1690  }
1691  }
1692  }
1693 
1694  if ($cur_par == "opacity")
1695  {
1696  $cur_val = ((int) $cur_val) / 100;
1697  }
1698 
1699  fwrite ($css_file, "\t".$cur_par.": ".$cur_val.";\n");
1700 
1701  // IE6 fix for minimum height
1702  if ($cur_par == "min-height")
1703  {
1704  fwrite ($css_file, "\t"."height".": "."auto !important".";\n");
1705  fwrite ($css_file, "\t"."height".": ".$cur_val.";\n");
1706  }
1707 
1708  // opacity fix
1709  if ($cur_par == "opacity")
1710  {
1711  fwrite ($css_file, "\t".'-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity='.($cur_val * 100).')"'.";\n");
1712  fwrite ($css_file, "\t".'filter: alpha(opacity='.($cur_val * 100).')'.";\n");
1713  fwrite ($css_file, "\t".'-moz-opacity: '.$cur_val.";\n");
1714  }
1715 
1716  // transform fix
1717  if ($cur_par == "transform")
1718  {
1719  fwrite ($css_file, "\t".'-webkit-transform: '.$cur_val.";\n");
1720  fwrite ($css_file, "\t".'-moz-transform: '.$cur_val.";\n");
1721  fwrite ($css_file, "\t".'-ms-transform: '.$cur_val.";\n");
1722  }
1723 
1724  // transform-origin fix
1725  if ($cur_par == "transform-origin")
1726  {
1727  fwrite ($css_file, "\t".'-webkit-transform-origin: '.$cur_val.";\n");
1728  fwrite ($css_file, "\t".'-moz-transform-origin: '.$cur_val.";\n");
1729  fwrite ($css_file, "\t".'-ms-transform-origin: '.$cur_val.";\n");
1730  }
1731 
1732  // save page background
1733  if ($tag[0]["tag"] == "div" && $tag[0]["class"] == "Page"
1734  && $cur_par == "background-color")
1735  {
1736  $page_background = $cur_val;
1737  }
1738  }
1739  fwrite ($css_file, "}\n");
1740  fwrite ($css_file, "\n");
1741 
1742  // use table border attributes for th td as well
1743  /* if ($tag[0]["type"] == "table")
1744  {
1745  if (count($t_border) > 0)
1746  {
1747  fwrite ($css_file, $tag[0]["tag"].".ilc_".$tag[0]["type"]."_".$tag[0]["class"]." th,".
1748  $tag[0]["tag"].".ilc_".$tag[0]["type"]."_".$tag[0]["class"]." td\n");
1749  fwrite ($css_file, "{\n");
1750  foreach ($t_border as $p => $v)
1751  {
1752  // fwrite ($css_file, "\t".$p.": ".$v.";\n");
1753  }
1754  fwrite ($css_file, "}\n");
1755  fwrite ($css_file, "\n");
1756  }
1757  }*/
1758  }
1759 
1760  if ($page_background != "")
1761  {
1762  fwrite ($css_file, "td.ilc_Page\n");
1763  fwrite ($css_file, "{\n");
1764  fwrite ($css_file, "\t"."background-color: ".$page_background.";\n");
1765  fwrite ($css_file, "}\n");
1766  }
1767  if ($mq["id"] > 0)
1768  {
1769  fwrite ($css_file, "}\n");
1770  }
1771  }
1772  fclose($css_file);
1773 // exit;
1774  $this->setUpToDate(true);
1775  $this->_writeUpToDate($this->getId(), true);
1776  }
1777 
1784  static function getEffectiveContentStyleId($a_style_id, $a_type = "")
1785  {
1786  global $ilSetting;
1787 
1788  // check global fixed content style
1789  $fixed_style = $ilSetting->get("fixed_content_style_id");
1790  if ($fixed_style > 0)
1791  {
1792  $a_style_id = $fixed_style;
1793  }
1794 
1795  // check global default style
1796  if ($a_style_id <= 0)
1797  {
1798  $a_style_id = $ilSetting->get("default_content_style_id");
1799  }
1800 
1801  if ($a_style_id > 0 && ilObject::_lookupType($a_style_id) == "sty")
1802  {
1803  return $a_style_id;
1804  }
1805 
1806  return 0;
1807  }
1808 
1815  function getParametersOfClass($a_type, $a_class, $a_mq_id = 0)
1816  {
1817  if (is_array($this->style_class[$a_type][$a_class][$a_mq_id]))
1818  {
1819  return $this->style_class[$a_type][$a_class][$a_mq_id];
1820  }
1821  return array();
1822  }
1823 
1829  static function getContentStylePath($a_style_id)
1830  {
1831  global $ilias;
1832 
1833  $rand = rand(1,999999);
1834 
1835 
1836  // check global fixed content style
1837  $fixed_style = $ilias->getSetting("fixed_content_style_id");
1838  if ($fixed_style > 0)
1839  {
1840  $a_style_id = $fixed_style;
1841  }
1842 
1843  // check global default style
1844  if ($a_style_id <= 0)
1845  {
1846  $a_style_id = $ilias->getSetting("default_content_style_id");
1847  }
1848 
1849  if ($a_style_id > 0 && ilObject::_exists($a_style_id))
1850  {
1851  // check whether file is up to date
1852  if (!ilObjStyleSheet::_lookupUpToDate($a_style_id))
1853  {
1854  $style = new ilObjStyleSheet($a_style_id);
1855  $style->writeCSSFile();
1856  }
1857 
1858  $path = ilUtil::getWebspaceDir("output") . "/css/style_" . $a_style_id . ".css?dummy=$rand";
1859  require_once('./Services/WebAccessChecker/classes/class.ilWACSignedPath.php');
1861 
1862  return $path;
1863  }
1864  else // todo: work this out
1865  {
1866  return "./Services/COPage/css/content.css";
1867  }
1868  }
1869 
1875  static function getContentPrintStyle()
1876  {
1877  return "./Services/COPage/css/print_content.css";
1878  }
1879 
1885  static function getSyntaxStylePath()
1886  {
1887  return "./Services/COPage/css/syntaxhighlight.css";
1888  }
1889 
1895  static function getPlaceHolderStylePath()
1896  {
1897  return "./Services/COPage/css/placeholder.css";
1898  }
1899 
1900  function update()
1901  {
1902  global $ilDB;
1903 
1904  parent::update();
1905  $this->read(); // this could be done better
1906  $this->writeCSSFile();
1907 
1908  $q = "UPDATE style_data ".
1909  "SET category = ".$ilDB->quote((int) $this->getScope(), "integer").
1910  " WHERE id = ".$ilDB->quote($this->getId(), "integer");
1911  $ilDB->manipulate($q);
1912  }
1913 
1920  function updateStyleParameter($a_id, $a_value)
1921  {
1922  global $ilDB;
1923 
1924  $q = "UPDATE style_parameter SET VALUE = ".
1925  $ilDB->quote($a_value, "text")." WHERE id = ".
1926  $ilDB->quote($a_id, "integer");
1927  $style_set = $ilDB->manipulate($q);
1928  }
1929 
1934  // todo: search for usages, add mq_id
1935  function replaceStylePar($a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id = 0, $a_custom = false)
1936  {
1937  ilObjStyleSheet::_replaceStylePar($this->getId(), $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id, $a_custom);
1938  }
1939 
1940  static function _replaceStylePar($style_id, $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id = 0, $a_custom = false)
1941  {
1942  global $ilDB;
1943 
1944  $q = "SELECT * FROM style_parameter WHERE ".
1945  " style_id = ".$ilDB->quote($style_id, "integer")." AND ".
1946  " tag = ".$ilDB->quote($a_tag, "text")." AND ".
1947  " class = ".$ilDB->quote($a_class, "text")." AND ".
1948  " mq_id = ".$ilDB->quote($a_mq_id, "integer")." AND ".
1949  " custom = ".$ilDB->quote($a_custom, "integer")." AND ".
1950  " ".$ilDB->equals("type", $a_type, "text", true)." AND ".
1951  " parameter = ".$ilDB->quote($a_par, "text");
1952 
1953  $set = $ilDB->query($q);
1954 
1955  if ($rec = $set->fetchRow())
1956  {
1957  $q = "UPDATE style_parameter SET ".
1958  " value = ".$ilDB->quote($a_val, "text")." WHERE ".
1959  " style_id = ".$ilDB->quote($style_id, "integer")." AND ".
1960  " tag = ".$ilDB->quote($a_tag, "text")." AND ".
1961  " class = ".$ilDB->quote($a_class, "text")." AND ".
1962  " mq_id = ".$ilDB->quote($a_mq_id, "integer")." AND ".
1963  " custom = ".$ilDB->quote($a_custom, "integer")." AND ".
1964  " ".$ilDB->equals("type", $a_type, "text", true)." AND ".
1965  " parameter = ".$ilDB->quote($a_par, "text");
1966 
1967  $ilDB->manipulate($q);
1968  }
1969  else
1970  {
1971  $id = $ilDB->nextId("style_parameter");
1972  $q = "INSERT INTO style_parameter (id, value, style_id, tag, class, type, parameter, mq_id, custom) VALUES ".
1973  " (".
1974  $ilDB->quote($id, "integer").",".
1975  $ilDB->quote($a_val, "text").",".
1976  " ".$ilDB->quote($style_id, "integer").",".
1977  " ".$ilDB->quote($a_tag, "text").",".
1978  " ".$ilDB->quote($a_class, "text").",".
1979  " ".$ilDB->quote($a_type, "text").",".
1980  " ".$ilDB->quote($a_par, "text").",".
1981  " ".$ilDB->quote($a_mq_id, "integer").",".
1982  " ".$ilDB->quote($a_custom, "integer").
1983  ")";
1984 
1985  $ilDB->manipulate($q);
1986  }
1987  }
1988 
1989 
1993  function getStyle()
1994  {
1995  return $this->style;
1996  }
1997 
2001  function setStyle($a_style)
2002  {
2003  $this->style = $a_style;
2004  }
2005 
2006 
2013  function handleXmlString($a_str)
2014  {
2015  return str_replace("&", "&amp;", $a_str);
2016  }
2017 
2022  function getXML()
2023  {
2024  $xml.= "<StyleSheet>\n";
2025 
2026  // title and description
2027  $xml.= "<Title>".$this->handleXmlString($this->getTitle())."</Title>";
2028  $xml.= "<Description>".$this->handleXmlString($this->getDescription())."</Description>\n";
2029 
2030  // style classes
2031  foreach($this->chars as $char)
2032  {
2033  $xml.= "<Style Tag=\"".ilObjStyleSheet::_determineTag($char["type"]).
2034  "\" Type=\"".$char["type"]."\" Class=\"".$char["class"]."\">\n";
2035  foreach($this->style as $style)
2036  {
2037  if ($style[0]["type"] == $char["type"] && $style[0]["class"] == $char["class"])
2038  {
2039  foreach($style as $tag)
2040  {
2041  $xml.="<StyleParameter Name=\"".$tag["parameter"]."\" Value=\"".$tag["value"]."\" Custom=\"".$tag["custom"]."\" />\n";
2042  }
2043  }
2044  }
2045  $xml.= "</Style>\n";
2046  }
2047 
2048  // colors
2049  foreach($this->getColors() as $color)
2050  {
2051  $xml.="<StyleColor Name=\"".$color["name"]."\" Code=\"".$color["code"]."\"/>\n";
2052  }
2053 
2054  // templates
2056  foreach ($tcts as $tct => $v)
2057  {
2058  $ts = $this->getTemplates($tct);
2059 
2060  foreach ($ts as $t)
2061  {
2062  $xml.="<StyleTemplate Type=\"".$tct."\" Name=\"".$t["name"]."\">\n";
2063  foreach ($t["classes"] as $ct => $c)
2064  {
2065  if ($c != "")
2066  {
2067  $xml.="<StyleTemplateClass ClassType=\"".$ct."\" Class=\"".$c."\"/>\n";
2068  }
2069  }
2070  $xml.="</StyleTemplate>\n";
2071  }
2072  }
2073 
2074 
2075  $xml.= "</StyleSheet>";
2076 //echo "<pre>".htmlentities($xml)."</pre>"; exit;
2077  return $xml;
2078  }
2079 
2080 
2085  {
2086  $sty_data_dir = ilUtil::getDataDir()."/sty";
2087  ilUtil::makeDir($sty_data_dir);
2088  if(!is_writable($sty_data_dir))
2089  {
2090  $this->ilias->raiseError("Style data directory (".$sty_data_dir
2091  .") not writeable.",$this->ilias->error_obj->FATAL);
2092  }
2093 
2094  $style_dir = $sty_data_dir."/sty_".$this->getId();
2095  ilUtil::makeDir($style_dir);
2096  if(!@is_dir($style_dir))
2097  {
2098  $this->ilias->raiseError("Creation of style directory failed (".
2099  $style_dir.").",$this->ilias->error_obj->FATAL);
2100  }
2101 
2102  // create export subdirectory
2103  $ex_dir = $style_dir."/export";
2104  ilUtil::makeDir($ex_dir);
2105  if(!@is_dir($ex_dir))
2106  {
2107  $this->ilias->raiseError("Creation of Import Directory failed (".
2108  $ex_dir.").",$this->ilias->error_obj->FATAL);
2109  }
2110 
2111  return $ex_dir;
2112  }
2113 
2118  {
2119  $sty_data_dir = ilUtil::getDataDir()."/sty";
2120  $style_dir = $sty_data_dir."/sty_".$this->getId();
2121  // create export subdirectory
2122  $ex_dir = $style_dir."/export";
2123 
2124  if (is_dir($ex_dir))
2125  {
2126  ilUtil::delDir($ex_dir, true);
2127  }
2128  }
2129 
2130 
2135  {
2136  $ex_dir = $this->createExportDirectory();
2137  $ex_sub_dir = $ex_dir."/".$this->getExportSubDir();
2138  ilUtil::makeDir($ex_sub_dir);
2139  if(!is_writable($ex_sub_dir))
2140  {
2141  $this->ilias->raiseError("Style data directory (".$ex_sub_dir
2142  .") not writeable.",$this->ilias->error_obj->FATAL);
2143  }
2144  $ex_sub_images_dir = $ex_sub_dir."/images";
2145  ilUtil::makeDir($ex_sub_images_dir);
2146  if(!is_writable($ex_sub_images_dir))
2147  {
2148  $this->ilias->raiseError("Style data directory (".$ex_sub_images_dir
2149  .") not writeable.",$this->ilias->error_obj->FATAL);
2150  }
2151  }
2152 
2156  function setExportSubDir($a_dir)
2157  {
2158  $this->export_sub_dir = $a_dir;
2159  }
2160 
2164  function getExportSubDir()
2165  {
2166  if ($this->export_sub_dir == "")
2167  {
2168  return "sty_".$this->getId();
2169  }
2170  else
2171  {
2172  return $this->export_sub_dir;
2173  }
2174  }
2175 
2181  function export()
2182  {
2183  $this->cleanExportDirectory();
2184  $ex_dir = $this->createExportDirectory();
2185  $this->createExportSubDirectory();
2186  $this->exportXML($ex_dir."/".$this->getExportSubDir());
2187 //echo "-".$this->getImagesDirectory()."-".$ex_dir."/".$this->getExportSubDir()."/images"."-";
2189  $ex_dir."/".$this->getExportSubDir()."/images");
2190  if (is_file($ex_dir."/".$this->getExportSubDir().".zip"))
2191  {
2192  unlink($ex_dir."/".$this->getExportSubDir().".zip");
2193  }
2194  ilUtil::zip($ex_dir."/".$this->getExportSubDir(),
2195  $ex_dir."/".$this->getExportSubDir().".zip");
2196 
2197  return $ex_dir."/".$this->getExportSubDir().".zip";
2198  }
2199 
2203  function exportXML($a_dir)
2204  {
2205  $file = $a_dir."/style.xml";
2206 
2207  // open file
2208  if (!($fp = @fopen($file,"w")))
2209  {
2210  die ("<b>Error</b>: Could not open \"".$file."\" for writing".
2211  " in <b>".__FILE__."</b> on line <b>".__LINE__."</b><br />");
2212  }
2213 
2214  // set file permissions
2215  chmod($file, 0770);
2216 
2217  // write xml data into the file
2218  fwrite($fp, $this->getXML());
2219 
2220  // close file
2221  fclose($fp);
2222 
2223  }
2224 
2229  {
2230  $sty_data_dir = ilUtil::getDataDir()."/sty";
2231  ilUtil::makeDir($sty_data_dir);
2232  if(!is_writable($sty_data_dir))
2233  {
2234  $this->ilias->raiseError("Style data directory (".$sty_data_dir
2235  .") not writeable.",$this->ilias->error_obj->FATAL);
2236  }
2237 
2238  $style_dir = $sty_data_dir."/sty_".$this->getId();
2239  ilUtil::makeDir($style_dir);
2240  if(!@is_dir($style_dir))
2241  {
2242  $this->ilias->raiseError("Creation of style directory failed (".
2243  $style_dir.").",$this->ilias->error_obj->FATAL);
2244  }
2245 
2246  // create import subdirectory
2247  $im_dir = $style_dir."/import";
2248  ilUtil::makeDir($im_dir);
2249  if(!@is_dir($im_dir))
2250  {
2251  $this->ilias->raiseError("Creation of Import Directory failed (".
2252  $im_dir.").",$this->ilias->error_obj->FATAL);
2253  }
2254 
2255  return $im_dir;
2256  }
2257 
2261  function import($a_file)
2262  {
2263  parent::create();
2264 
2265  $im_dir = $this->createImportDirectory();
2266 
2267  // handle uploaded files
2268  if (is_array($a_file))
2269  {
2270  ilUtil::moveUploadedFile($a_file["tmp_name"],
2271  $a_file["name"], $im_dir."/".$a_file["name"]);
2272  $file_name = $a_file["name"];
2273  }
2274  else // handle not directly uploaded files
2275  {
2276  $pi = pathinfo($a_file);
2277  $file_name = $pi["basename"];
2278  copy($a_file, $im_dir."/".$file_name);
2279  }
2280  $file = pathinfo($file_name);
2281 
2282  // unzip file
2283  if (strtolower($file["extension"] == "zip"))
2284  {
2285  ilUtil::unzip($im_dir."/".$file_name);
2286  $subdir = basename($file["basename"],".".$file["extension"]);
2287  if (!is_dir($im_dir."/".$subdir))
2288  {
2289  $subdir = "style"; // check style subdir
2290  }
2291  $xml_file = $im_dir."/".$subdir."/style.xml";
2292  }
2293  else // handle xml file directly (old style)
2294  {
2295  $xml_file = $im_dir."/".$file_name;
2296  }
2297 
2298  // load information from xml file
2299 //echo "-$xml_file-";
2300  $this->createFromXMLFile($xml_file, true);
2301 
2302  // copy images
2303  $this->createImagesDirectory();
2304  if (is_dir($im_dir."/".$subdir."/images"))
2305  {
2306  ilUtil::rCopy($im_dir."/".$subdir."/images",
2307  $this->getImagesDirectory());
2308  }
2309 
2311  $this->read();
2312  $this->writeCSSFile();
2313  }
2314 
2319  function createFromXMLFile($a_file, $a_skip_parent_create = false)
2320  {
2321  global $ilDB;
2322 
2323  $this->is_3_10_skin = false;
2324 
2325  if (!$a_skip_parent_create)
2326  {
2327  parent::create();
2328  }
2329  include_once("./Services/Style/Content/classes/class.ilStyleImportParser.php");
2330  $importParser = new ilStyleImportParser($a_file, $this);
2331  $importParser->startParsing();
2332 
2333  // store style parameter
2334  foreach ($this->style as $style)
2335  {
2336  foreach($style as $tag)
2337  {
2338  $id = $ilDB->nextId("style_parameter");
2339 
2340  // migrate old table PageFrame/PageContainer to div
2341  if (in_array($tag["class"], array("PageFrame", "PageContainer")) &&
2342  $tag["tag"] == "table")
2343  {
2344  $tag["tag"] = "div";
2345  if ($tag["parameter"] == "width" && $tag["value"] == "100%")
2346  {
2347  continue;
2348  }
2349  }
2350 
2351  $q = "INSERT INTO style_parameter (id,style_id, tag, class, parameter, type, value, custom) VALUES ".
2352  "(".
2353  $ilDB->quote($id, "integer").",".
2354  $ilDB->quote($this->getId(), "integer").",".
2355  $ilDB->quote($tag["tag"], "text").",".
2356  $ilDB->quote($tag["class"], "text").",".
2357  $ilDB->quote($tag["parameter"], "text").",".
2358  $ilDB->quote($tag["type"], "text").",".
2359  $ilDB->quote($tag["value"], "text").",".
2360  $ilDB->quote((bool) $tag["custom"], "integer").
2361  ")";
2362  $ilDB->manipulate($q);
2363  }
2364  }
2365 
2366  // store characteristics
2367  $this->is_3_10_skin = true;
2368  if (is_array($this->chars))
2369  {
2370  foreach ($this->chars as $char)
2371  {
2372  if ($char["type"] != "")
2373  {
2374  $s = substr($char["class"], strlen($char["class"]) - 6);
2375  if ($s != ":hover")
2376  {
2377  $q = "INSERT INTO style_char (style_id, type, characteristic) VALUES ".
2378  "(".$ilDB->quote($this->getId(), "integer").",".
2379  $ilDB->quote($char["type"], "text").",".
2380  $ilDB->quote($char["class"], "text").")";
2381  $ilDB->manipulate($q);
2382  $this->is_3_10_skin = false;
2383  }
2384  }
2385  }
2386  }
2387 
2388  // add style_data record
2389  $q = "INSERT INTO style_data (id, uptodate) VALUES ".
2390  "(".$ilDB->quote($this->getId(), "integer").", 0)";
2391  $ilDB->manipulate($q);
2392 
2393  $this->update();
2394  $this->read();
2395 
2396  if ($this->is_3_10_skin)
2397  {
2398  $this->do_3_10_Migration();
2399  }
2400  //$this->writeCSSFile();
2401  }
2402 
2407  {
2408  $groups = array();
2409 
2410  foreach (self::$parameter as $parameter => $props)
2411  {
2412  $groups[$props["group"]][] = $parameter;
2413  }
2414  return $groups;
2415  }
2416 
2417  static function _getStyleParameterInputType($par)
2418  {
2419  $input = self::$parameter[$par]["input"];
2420  return $input;
2421  }
2422 
2423  static function _getStyleParameterSubPar($par)
2424  {
2425  $subpar = self::$parameter[$par]["subpar"];
2426  return $subpar;
2427  }
2428 
2429  static function _getStyleParameters($a_tag = "")
2430  {
2431  if ($a_tag == "")
2432  {
2433  return self::$parameter;
2434  }
2435  $par = array();
2436  foreach (self::$parameter as $k => $v)
2437  {
2438  if (is_array(self::$filtered_groups[$v["group"]]) &&
2439  !in_array($a_tag, self::$filtered_groups[$v["group"]]))
2440  {
2441  continue;
2442  }
2443  $par[$k] = $v;
2444  }
2445  return $par;
2446  }
2447 
2448  static function _getFilteredGroups()
2449  {
2450  return self::$filtered_groups;
2451  }
2452 
2453  static function _getStyleParameterNumericUnits($a_no_percentage = false)
2454  {
2455  if ($a_no_percentage)
2456  {
2457  return self::$num_unit_no_perc;
2458  }
2459  return self::$num_unit;
2460  }
2461 
2462  static function _getStyleParameterValues($par)
2463  {
2464  return self::$parameter[$par]["values"];
2465  }
2466 
2467  /*static function _getStyleTypes()
2468  {
2469  return self::$style_types;
2470  }*/
2471 
2472  static function _getStyleSuperTypes()
2473  {
2474  return self::$style_super_types;
2475  }
2476 
2477  static function _isExpandable($a_type)
2478  {
2479  return in_array($a_type, self::$expandable_types);
2480  }
2481 
2482  static function _isHideable($a_type)
2483  {
2484  return in_array($a_type, self::$hideable_types);
2485  }
2486 
2488  {
2489  foreach (self::$style_super_types as $s => $t)
2490  {
2491  if (in_array($a_type, $t))
2492  {
2493  return $s;
2494  }
2495  if ($a_type == $s)
2496  {
2497  return $s;
2498  }
2499  }
2500  }
2501 
2505  static function _getCoreStyles()
2506  {
2507  $c_styles = array();
2508  foreach (self::$core_styles as $cstyle)
2509  {
2510  $c_styles[$cstyle["type"].".".ilObjStyleSheet::_determineTag($cstyle["type"]).".".$cstyle["class"]]
2511  = array("type" => $cstyle["type"],
2512  "tag" => ilObjStyleSheet::_determineTag($cstyle["type"]),
2513  "class" => $cstyle["class"]);
2514  }
2515  return $c_styles;
2516  }
2517 
2524  static function isCoreStyle($a_type, $a_class)
2525  {
2526  foreach (self::$core_styles as $s)
2527  {
2528  if ($s["type"] == $a_type && $s["class"] == $a_class)
2529  {
2530  return true;
2531  }
2532  }
2533  return false;
2534  }
2535 
2536 
2540  static function _getTemplateClassTypes($a_template_type = "")
2541  {
2542  if ($a_template_type == "")
2543  {
2544  return self::$templates;
2545  }
2546 
2547  return self::$templates[$a_template_type];
2548  }
2549 
2550 
2551  static function _getPseudoClasses($tag)
2552  {
2553  return self::$pseudo_classes[$tag];
2554  }
2555 
2557  {
2558  return self::$templates[$t][$k];
2559  }
2560 
2561  static function _determineTag($a_type)
2562  {
2563  return self::$assigned_tags[$a_type];
2564  }
2565 
2569  static function getAvailableParameters()
2570  {
2571  $pars = array();
2572  foreach(self::$parameter as $p => $v)
2573  {
2574  $pars[$p] = $v["values"];
2575  }
2576 
2577  return $pars;
2578  }
2579 
2580 
2584  static function _addMissingStyleClassesToStyle($a_id)
2585  {
2586  $styles = array(array("id" => $a_id));
2588  }
2589 
2594  static function _addMissingStyleClassesToAllStyles($a_styles = "")
2595  {
2596  global $ilDB;
2597 
2598  if ($a_styles == "")
2599  {
2601  }
2602  else
2603  {
2604  $styles = $a_styles;
2605  }
2608 
2609  // get all core image files
2610  $core_images = array();
2611  $core_dir = self::$basic_style_image_dir;
2612  if (is_dir($core_dir))
2613  {
2614  $dir = opendir($core_dir);
2615  while($file = readdir($dir))
2616  {
2617  if (substr($file, 0, 1) != "." && is_file($core_dir."/".$file))
2618  {
2619  $core_images[] = $file;
2620  }
2621  }
2622  }
2623 
2624  foreach ($styles as $style)
2625  {
2626  $id = $style["id"];
2627 
2628  foreach($core_styles as $cs)
2629  {
2630  // check, whether core style class exists
2631  $set = $ilDB->queryF("SELECT * FROM style_char WHERE style_id = %s ".
2632  "AND type = %s AND characteristic = %s",
2633  array("integer", "text", "text"),
2634  array($id, $cs["type"], $cs["class"]));
2635 
2636  // if not, add core style class
2637  if (!($rec = $ilDB->fetchAssoc($set)))
2638  {
2639  $ilDB->manipulateF(
2640  "INSERT INTO style_char (style_id, type, characteristic) ".
2641  " VALUES (%s,%s,%s) ",
2642  array("integer", "text", "text"),
2643  array($id, $cs["type"], $cs["class"]));
2644 
2645  $xpath = new DOMXPath($bdom);
2646  $par_nodes = $xpath->query("/StyleSheet/Style[@Tag = '".$cs["tag"]."' and @Type='".
2647  $cs["type"]."' and @Class='".$cs["class"]."']/StyleParameter");
2648  foreach ($par_nodes as $par_node)
2649  {
2650  // check whether style parameter exists
2651  $set = $ilDB->queryF("SELECT * FROM style_parameter WHERE style_id = %s ".
2652  "AND type = %s AND class = %s AND tag = %s AND parameter = %s",
2653  array("integer", "text", "text", "text", "text"),
2654  array($id, $cs["type"], $cs["class"],
2655  $cs["tag"], $par_node->getAttribute("Name")));
2656 
2657  // if not, create style parameter
2658  if (!($rec = $ilDB->fetchAssoc($set)))
2659  {
2660  $spid = $ilDB->nextId("style_parameter");
2661  $st = $ilDB->manipulateF("INSERT INTO style_parameter (id, style_id, type, class, tag, parameter, value) ".
2662  " VALUES (%s,%s,%s,%s,%s,%s,%s)",
2663  array("integer", "integer", "text", "text", "text", "text", "text"),
2664  array($spid, $id, $cs["type"], $cs["class"], $cs["tag"],
2665  $par_node->getAttribute("Name"), $par_node->getAttribute("Value")));
2666  }
2667  }
2668  }
2669  }
2670 
2671  // now check, whether some core image files are missing
2674  reset($core_images);
2675  foreach($core_images as $cim)
2676  {
2677  if (!is_file($imdir."/".$cim))
2678  {
2679  copy($core_dir."/".$cim, $imdir."/".$cim);
2680  }
2681  }
2682  }
2683  }
2684 
2685  //
2686  // Color management
2687  //
2688 
2693  {
2694  global $ilDB;
2695 
2696  $this->do_3_9_Migration($this->getId());
2697 
2698  //include_once("./Services/Migration/DBUpdate_1385/classes/class.ilStyleMigration.php");
2699  //ilStyleMigration::addMissingStyleCharacteristics($this->getId());
2700 
2701  $this->do_3_10_CharMigration($this->getId());
2702 
2703  // style_char: type for characteristic
2704  $st = $ilDB->prepareManip("UPDATE style_char SET type = ? WHERE characteristic = ?".
2705  " AND style_id = ? ", array("text", "text", "integer"));
2706  $ilDB->execute($st, array("media_cont", "Media", $this->getId()));
2707  $ilDB->execute($st, array("media_caption", "MediaCaption", $this->getId()));
2708  $ilDB->execute($st, array("page_fn", "Footnote", $this->getId()));
2709  $ilDB->execute($st, array("page_nav", "LMNavigation", $this->getId()));
2710  $ilDB->execute($st, array("page_title", "PageTitle", $this->getId()));
2711  $ilDB->execute($st, array("page_cont", "Page", $this->getId()));
2712 
2713  // style_parameter: type for class
2714  $st = $ilDB->prepareManip("UPDATE style_parameter SET type = ? WHERE class = ?".
2715  " AND style_id = ? ", array("text", "text", "integer"));
2716  $ilDB->execute($st, array("media_cont", "Media", $this->getId()));
2717  $ilDB->execute($st, array("media_caption", "MediaCaption", $this->getId()));
2718  $ilDB->execute($st, array("page_fn", "Footnote", $this->getId()));
2719  $ilDB->execute($st, array("page_nav", "LMNavigation", $this->getId()));
2720  $ilDB->execute($st, array("page_title", "PageTitle", $this->getId()));
2721  $ilDB->execute($st, array("table", "Page", $this->getId()));
2722 
2723  $st = $ilDB->prepareManip("UPDATE style_parameter SET tag = ? WHERE class = ?".
2724  " AND style_id = ? ", array("text", "text", "integer"));
2725  $ilDB->execute($st, array("div", "MediaCaption", $this->getId()));
2726 
2727  // style_char: characteristic for characteristic
2728  $st = $ilDB->prepareManip("UPDATE style_char SET characteristic = ? WHERE characteristic = ?".
2729  " AND style_id = ? ", array("text", "text", "integer"));
2730  $ilDB->execute($st, array("MediaContainer", "Media", $this->getId()));
2731  $ilDB->execute($st, array("PageContainer", "Page", $this->getId()));
2732 
2733  // style_parameter: class for class
2734  $st = $ilDB->prepareManip("UPDATE style_parameter SET class = ? WHERE class = ?".
2735  " AND style_id = ? ", array("text", "text", "integer"));
2736  $ilDB->execute($st, array("MediaContainer", "Media", $this->getId()));
2737  $ilDB->execute($st, array("PageContainer", "Page", $this->getId()));
2738 
2739  // force rewriting of container style
2740  $st = $ilDB->prepareManip("DELETE FROM style_char WHERE type = ?".
2741  " AND style_id = ? ", array("text", "integer"));
2742  $ilDB->execute($st, array("page_cont", $this->getId()));
2743  $st = $ilDB->prepareManip("DELETE FROM style_parameter WHERE type = ?".
2744  " AND style_id = ? ", array("text", "integer"));
2745  $ilDB->execute($st, array("page_cont", $this->getId()));
2746 
2747  }
2748 
2755  function do_3_10_CharMigration($a_id = "")
2756  {
2757  global $ilDB;
2758 
2759  $add_str = "";
2760  if ($a_id != "")
2761  {
2762  $add_str = " AND style_id = ".$ilDB->quote($a_id, "integer");
2763  }
2764 
2765  $set = $ilDB->query($q = "SELECT DISTINCT style_id, tag, class FROM style_parameter WHERE ".
2766  $ilDB->equals("type", "", "text", true)." ".$add_str);
2767 
2768  while ($rec = $ilDB->fetchAssoc($set))
2769  {
2770  // derive types from tag
2771  $types = array();
2772  switch ($rec["tag"])
2773  {
2774  case "div":
2775  case "p":
2776  if (in_array($rec["class"], array("Headline3", "Headline1",
2777  "Headline2", "TableContent", "List", "Standard", "Remark",
2778  "Additional", "Mnemonic", "Citation", "Example")))
2779  {
2780  $types[] = "text_block";
2781  }
2782  if (in_array($rec["class"], array("Block", "Remark",
2783  "Additional", "Mnemonic", "Example", "Excursus", "Special")))
2784  {
2785  $types[] = "section";
2786  }
2787  if (in_array($rec["class"], array("Page", "Footnote", "PageTitle", "LMNavigation")))
2788  {
2789  $types[] = "page";
2790  }
2791  break;
2792 
2793  case "td":
2794  $types[] = "table_cell";
2795  break;
2796 
2797  case "a":
2798  if (in_array($rec["class"], array("ExtLink", "IntLink", "FootnoteLink")))
2799  {
2800  $types[] = "link";
2801  }
2802  break;
2803 
2804  case "span":
2805  $types[] = "text_inline";
2806  break;
2807 
2808  case "table":
2809  $types[] = "table";
2810  break;
2811  }
2812 
2813  // check if style_char set exists
2814  foreach ($types as $t)
2815  {
2816  // check if second type already exists
2817  $set4 = $ilDB->queryF("SELECT * FROM style_char ".
2818  " WHERE style_id = %s AND type = %s AND characteristic = %s",
2819  array("integer", "text", "text"),
2820  array($rec["style_id"], $t, $rec["class"]));
2821  if ($rec4 = $ilDB->fetchAssoc($set4))
2822  {
2823  // ok
2824  }
2825  else
2826  {
2827 //echo "<br>1-".$rec["style_id"]."-".$t."-".$rec["class"]."-";
2828  $ilDB->manipulateF("INSERT INTO style_char ".
2829  " (style_id, type, characteristic) VALUES ".
2830  " (%s,%s,%s) ",
2831  array("integer", "text", "text"),
2832  array($rec["style_id"], $t, $rec["class"]));
2833  }
2834  }
2835 
2836  // update types
2837  if ($rec["type"] == "")
2838  {
2839  if (count($types) > 0)
2840  {
2841  $ilDB->manipulateF("UPDATE style_parameter SET type = %s ".
2842  " WHERE style_id = %s AND class = %s AND ".$ilDB->equals("type", "", "text", true),
2843  array("text", "integer", "text"),
2844  array($types[0], $rec["style_id"], $rec["class"]));
2845 //echo "<br>3-".$types[0]."-".$rec["style_id"]."-".$rec["class"]."-";
2846 
2847  // links extra handling
2848  if ($types[0] == "link")
2849  {
2850  $ilDB->manipulateF("UPDATE style_parameter SET type = %s ".
2851  " WHERE style_id = %s AND (class = %s OR class = %s) AND ".$ilDB->equals("type", "", "text", true),
2852  array("text", "integer", "text", "text"),
2853  array($types[0], $rec["style_id"], $rec["class"].":visited",
2854  $rec["class"].":hover"));
2855  }
2856  }
2857 
2858  if (count($types) == 2)
2859  {
2860  // select all records of first type and add second type
2861  // records if necessary.
2862  $set2 = $ilDB->queryF("SELECT * FROM style_parameter ".
2863  " WHERE style_id = %s AND class = %s AND type = %s",
2864  array("integer", "text", "text"),
2865  array($rec["style_id"], $rec["class"], $types[0]));
2866  while ($rec2 = $ilDB->fetchAssoc($set2))
2867  {
2868  // check if second type already exists
2869  $set3 = $ilDB->queryF("SELECT * FROM style_parameter ".
2870  " WHERE style_id = %s AND tag = %s AND class = %s AND type = %s AND parameter = %s",
2871  array("integer", "text", "text", "text", "text"),
2872  array($rec["style_id"], $rec["tag"], $rec["class"], $types[1], $rec["parameter"]));
2873  if ($rec3 = $ilDB->fetchAssoc($set3))
2874  {
2875  // ok
2876  }
2877  else
2878  {
2879  $nid = $ilDB->nextId("style_parameter");
2880  $ilDB->manipulateF("INSERT INTO style_parameter ".
2881  " (id, style_id, tag, class, parameter, value, type) VALUES ".
2882  " (%s, %s,%s,%s,%s,%s,%s) ",
2883  array("integer", "integer", "text", "text", "text", "text", "text"),
2884  array($nid, $rec2["style_id"], $rec2["tag"], $rec2["class"],
2885  $rec2["parameter"], $rec2["value"], $types[1]));
2886  }
2887  }
2888  }
2889  }
2890  }
2891  }
2892 
2896  function do_3_9_Migration($a_id)
2897  {
2898  global $ilDB;
2899 
2900  $classes = array("Example", "Additional", "Citation", "Mnemonic", "Remark");
2901  $pars = array("margin-top", "margin-bottom");
2902 
2903  foreach ($classes as $curr_class)
2904  {
2905  foreach ($pars as $curr_par)
2906  {
2907  $res2 = $ilDB->queryF("SELECT id FROM style_parameter WHERE style_id = %s".
2908  " AND tag = %s AND class= %s AND parameter = %s",
2909  array("integer", "text", "text", "text"),
2910  array($a_id, "p", $curr_class, $curr_par));
2911  if ($row2 = $ilDB->fetchAssoc($res2))
2912  {
2913  $ilDB->manipulateF("UPDATE style_parameter SET value= %s WHERE id = %s",
2914  array("text", "integer"),
2915  array("10px", $row2["id"]));
2916  }
2917  else
2918  {
2919  $nid = $ilDB->nextId("style_parameter");
2920  $ilDB->manipulateF("INSERT INTO style_parameter ".
2921  "(id, style_id, tag, class, parameter,value) VALUES (%s,%s,%s,%s,%s,%s)",
2922  array("integer", "integer", "text", "text", "text", "text"),
2923  array($nid, $a_id, "div", $curr_class, $curr_par, "10px"));
2924  }
2925  }
2926  }
2927 
2928  $ilDB->manipulateF("UPDATE style_parameter SET tag = %s WHERE tag = %s and style_id = %s",
2929  array("text", "text", "integer"),
2930  array("div", "p", $a_id));
2931 
2932  }
2933 
2937 
2941  function getColors()
2942  {
2943  global $ilDB;
2944 
2945  $set = $ilDB->query("SELECT * FROM style_color WHERE ".
2946  "style_id = ".$ilDB->quote($this->getId(), "integer")." ".
2947  "ORDER BY color_name");
2948 
2949  $colors = array();
2950  while ($rec = $ilDB->fetchAssoc($set))
2951  {
2952  $colors[] = array(
2953  "name" => $rec["color_name"],
2954  "code" => $rec["color_code"]
2955  );
2956  }
2957 
2958  return $colors;
2959  }
2960 
2964  function addColor($a_name, $a_code)
2965  {
2966  global $ilDB;
2967 
2968  $ilDB->manipulate("INSERT INTO style_color (style_id, color_name, color_code)".
2969  " VALUES (".
2970  $ilDB->quote($this->getId(), "integer").",".
2971  $ilDB->quote($a_name, "text").",".
2972  $ilDB->quote($a_code, "text").
2973  ")");
2974  }
2975 
2979  function updateColor($a_name, $a_new_name, $a_code)
2980  {
2981  global $ilDB;
2982 
2983  // todo: update names in parameters as well
2984 
2985  $ilDB->manipulate("UPDATE style_color SET ".
2986  "color_name = ".$ilDB->quote($a_new_name, "text").", ".
2987  "color_code = ".$ilDB->quote($a_code, "text").
2988  " WHERE style_id = ".$ilDB->quote($this->getId(), "integer").
2989  " AND color_name = ".$ilDB->quote($a_name, "text"));
2990  ilObjStyleSheet::_writeUpToDate($this->getId(), false);
2991 
2992  // rename also the name in the style parameter values
2993  if ($a_name != $a_new_name)
2994  {
2995  $set = $ilDB->query("SELECT * FROM style_parameter ".
2996  " WHERE style_id = ".$ilDB->quote($this->getId(), "integer").
2997  " AND (".
2998  " parameter = ".$ilDB->quote("background-color", "text"). " OR ".
2999  " parameter = ".$ilDB->quote("color", "text"). " OR ".
3000  " parameter = ".$ilDB->quote("border-color", "text"). " OR ".
3001  " parameter = ".$ilDB->quote("border-top-color", "text"). " OR ".
3002  " parameter = ".$ilDB->quote("border-bottom-color", "text"). " OR ".
3003  " parameter = ".$ilDB->quote("border-left-color", "text"). " OR ".
3004  " parameter = ".$ilDB->quote("border-right-color", "text").
3005  ")");
3006  while ($rec = $ilDB->fetchAssoc($set))
3007  {
3008  if ($rec["value"] == "!".$a_name ||
3009  is_int(strpos($rec["value"], "!".$a_name."(")))
3010  {
3011  // parameter is based on color -> rename it
3012  $this->replaceStylePar($rec["tag"], $rec["class"],
3013  $rec["parameter"], str_replace($a_name, $a_new_name, $rec["value"]), $rec["type"], $rec["mq_id"], $rec["custom"]);
3014  }
3015  }
3016  }
3017  }
3018 
3022  function removeColor($a_name)
3023  {
3024  global $ilDB;
3025 
3026  $ilDB->manipulate("DELETE FROM style_color WHERE ".
3027  " style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
3028  " color_name = ".$ilDB->quote($a_name, "text"));
3029  }
3030 
3034  function colorExists($a_color_name)
3035  {
3036  global $ilDB;
3037 
3038  $set = $ilDB->query("SELECT * FROM style_color WHERE ".
3039  "style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
3040  "color_name = ".$ilDB->quote($a_color_name, "text"));
3041  if ($rec = $ilDB->fetchAssoc($set))
3042  {
3043  return true;
3044  }
3045  return false;
3046  }
3047 
3051  function getColorCodeForName($a_name)
3052  {
3053  global $ilDB;
3054 
3055  $pos = strpos($a_name, "(");
3056  if ($pos > 0)
3057  {
3058  $a_i = substr($a_name, $pos + 1);
3059  $a_i = str_replace(")", "", $a_i);
3060  $a_name = substr($a_name, 0, $pos);
3061  }
3062 
3063  $set = $ilDB->query("SELECT color_code FROM style_color WHERE ".
3064  " style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
3065  " color_name = ".$ilDB->quote($a_name, "text"));
3066  if ($rec = $ilDB->fetchAssoc($set))
3067  {
3068  if ($a_i == "")
3069  {
3070  return "#".$rec["color_code"];
3071  }
3072  else
3073  {
3074  return "#".ilObjStyleSheet::_getColorFlavor($rec["color_code"],
3075  (int) $a_i);
3076  }
3077  }
3078  }
3079 
3083  static function _getColorFlavor($a_rgb, $a_i)
3084  {
3085  $rgb = ilObjStyleSheet::_explodeRGB($a_rgb, true);
3086  $hls = ilObjStyleSheet::_RGBToHLS($rgb);
3087 
3088  if ($a_i > 0)
3089  {
3090  $hls["l"] = $hls["l"] + ((255 - $hls["l"]) * ($a_i / 100));
3091  }
3092  if ($a_i < 0)
3093  {
3094  $hls["l"] = $hls["l"] - (($hls["l"]) * (-$a_i / 100));
3095  }
3096 
3097  $rgb = ilObjStyleSheet::_HLSToRGB($hls);
3098 
3099  foreach ($rgb as $k => $v)
3100  {
3101  $rgb[$k] = str_pad(dechex($v), 2, "0", STR_PAD_LEFT);
3102  }
3103 
3104  return $rgb["r"].$rgb["g"].$rgb["b"];
3105  }
3106 
3110  static function _explodeRGB($a_rgb, $as_dec = false)
3111  {
3112  $r["r"] = substr($a_rgb, 0, 2);
3113  $r["g"] = substr($a_rgb, 2, 2);
3114  $r["b"] = substr($a_rgb, 4, 2);
3115 
3116  if ($as_dec)
3117  {
3118  $r["r"] = (int) hexdec($r["r"]);
3119  $r["g"] = (int) hexdec($r["g"]);
3120  $r["b"] = (int) hexdec($r["b"]);
3121  }
3122 
3123  return $r;
3124  }
3125 
3129  static function _RGBToHLS($a_rgb)
3130  {
3131  $r = $a_rgb["r"] / 255;
3132  $g = $a_rgb["g"] / 255;
3133  $b = $a_rgb["b"] / 255;
3134 
3135  // max / min
3136  $max = max($r,$g,$b);
3137  $min = min($r,$g,$b);
3138 
3139  //lightness
3140  $l = ($max + $min) / 2;
3141 
3142  if ($max == $min)
3143  {
3144  $s = 0;
3145  $h = 0;
3146  }
3147  else
3148  {
3149  if ($l < 0.5)
3150  {
3151  $s = ($max - $min) / ($max + $min);
3152  }
3153  else
3154  {
3155  $s = ($max - $min) / (2.0 - $max - $min);
3156  }
3157 
3158  if ($r == $max)
3159  {
3160  $h = ($g - $b) / ($max - $min);
3161  }
3162  else if ($g == $max)
3163  {
3164  $h = 2.0 + ($b - $r) / ($max - $min);
3165  }
3166  else if ($b == $max)
3167  {
3168  $h = 4.0 + ($r - $g) / ($max - $min);
3169  }
3170  }
3171 
3172  $hls["h"] = round(($h / 6) * 255);
3173  $hls["l"] = round($l * 255);
3174  $hls["s"] = round($s * 255);
3175 
3176  return $hls;
3177  }
3178 
3182  static function _HLSToRGB($a_hls)
3183  {
3184  $h = $a_hls["h"] / 255;
3185  $l = $a_hls["l"] / 255;
3186  $s = $a_hls["s"] / 255;
3187 
3188  $rgb["r"] = $rgb["g"] = $rgb["b"] = 0;
3189 
3190  // If S=0, define R, G, and B all to L
3191  if ($s == 0)
3192  {
3193  $rgb["r"] = $rgb["g"] = $rgb["b"] = $l;
3194  }
3195  else
3196  {
3197 
3198  if ($l < 0.5)
3199  {
3200  $temp2 = $l * (1.0 + $s);
3201  }
3202  else
3203  {
3204  $temp2 = $l + $s - $l * $s;
3205  }
3206 
3207  $temp1 = 2.0 * $l - $temp2;
3208 
3209 
3210  # For each of R, G, B, compute another temporary value, temp3, as follows:
3211  foreach ($rgb as $k => $v)
3212  {
3213  switch ($k)
3214  {
3215  case "r":
3216  $temp3 = $h + 1.0 / 3.0;
3217  break;
3218 
3219  case "g":
3220  $temp3 = $h;
3221  break;
3222 
3223  case "b":
3224  $temp3 = $h - 1.0/3.0;
3225  break;
3226  }
3227  if ($temp3 < 0)
3228  {
3229  $temp3 = $temp3 + 1.0;
3230  }
3231  if ($temp3 > 1)
3232  {
3233  $temp3 = $temp3 - 1.0;
3234  }
3235 
3236  if (6.0 * $temp3 < 1)
3237  {
3238  $rgb[$k] = $temp1 + ($temp2 - $temp1) * 6.0 * $temp3;
3239  }
3240  else if (2.0 * $temp3 < 1)
3241  {
3242  $rgb[$k] = $temp2;
3243  }
3244  else if (3.0 * $temp3 < 2)
3245  {
3246  $rgb[$k] = $temp1 + ($temp2 - $temp1) * ((2.0/3.0) - $temp3) * 6.0;
3247  }
3248  else
3249  {
3250  $rgb[$k] = $temp1;
3251  }
3252  }
3253  }
3254 
3255  $rgb["r"] = round($rgb["r"] * 255);
3256  $rgb["g"] = round($rgb["g"] * 255);
3257  $rgb["b"] = round($rgb["b"] * 255);
3258 
3259  return $rgb;
3260  }
3261 
3262  //
3263  // Media queries
3264  //
3265 
3269 
3273  function getMediaQueries()
3274  {
3275  global $ilDB;
3276 
3277  $set = $ilDB->query("SELECT * FROM sty_media_query WHERE ".
3278  "style_id = ".$ilDB->quote($this->getId(), "integer")." ".
3279  "ORDER BY order_nr");
3280 
3281  $mq = array();
3282  while ($rec = $ilDB->fetchAssoc($set))
3283  {
3284  $mq[] = $rec;
3285  }
3286 
3287  return $mq;
3288  }
3289 
3294  function addMediaQuery($a_mquery, $order_nr = 0)
3295  {
3296  global $ilDB;
3297 
3298  $id = $ilDB->nextId("sty_media_query");
3299  if ($order_nr == 0)
3300  {
3301  $order_nr = $this->getMaxMQueryOrderNr() + 10;
3302  }
3303 
3304  $ilDB->manipulate("INSERT INTO sty_media_query (id, style_id, mquery, order_nr)".
3305  " VALUES (".
3306  $ilDB->quote($id, "integer").",".
3307  $ilDB->quote($this->getId(), "integer").",".
3308  $ilDB->quote($a_mquery, "text").",".
3309  $ilDB->quote($order_nr, "integer").
3310  ")");
3311 
3312  return $id;
3313  }
3314 
3320  {
3321  global $ilDB;
3322 
3323  $set = $ilDB->query("SELECT max(order_nr) mnr FROM sty_media_query ".
3324  " WHERE style_id = ".$ilDB->quote($this->getId(), "integer")
3325  );
3326  $rec = $ilDB->fetchAssoc($set);
3327 
3328  return (int) $rec["mnr"];
3329  }
3330 
3337  function updateMediaQuery($a_id, $a_mquery)
3338  {
3339  global $ilDB;
3340 
3341  $ilDB->manipulate("UPDATE sty_media_query SET ".
3342  " mquery = ".$ilDB->quote($a_mquery, "text").
3343  " WHERE id = ".$ilDB->quote($a_id, "integer")
3344  );
3345  }
3346 
3353  function getMediaQueryForId($a_id)
3354  {
3355  global $ilDB;
3356 
3357  $set = $ilDB->query("SELECT * FROM sty_media_query ".
3358  " WHERE id = ".$ilDB->quote($a_id, "integer")
3359  );
3360  return $ilDB->fetchAssoc($set);
3361  }
3362 
3368  function deleteMediaQuery($a_id)
3369  {
3370  global $ilDB;
3371 
3372  $ilDB->manipulate("DELETE FROM sty_media_query WHERE ".
3373  " style_id = ".$ilDB->quote($this->getId(), "integer").
3374  " AND id = ".$ilDB->quote($a_id, "integer")
3375  );
3376  $this->saveMediaQueryOrder();
3377  }
3378 
3384  function saveMediaQueryOrder($a_order_nr = null)
3385  {
3386  global $ilDB;
3387 
3388  $mqueries = $this->getMediaQueries();
3389  if (is_array ($a_order_nr))
3390  {
3391  foreach ($mqueries as $k => $mq)
3392  {
3393  $mqueries[$k]["order_nr"] = $a_order_nr[$mq["id"]];
3394  }
3395  $mqueries = ilUtil::sortArray($mqueries, "order_nr", "", true);
3396  }
3397  $cnt = 10;
3398  foreach ($mqueries as $mq)
3399  {
3400  $ilDB->manipulate("UPDATE sty_media_query SET ".
3401  " order_nr = ".$ilDB->quote($cnt, "integer").
3402  " WHERE id = ".$ilDB->quote($mq["id"], "integer")
3403  );
3404  $cnt+= 10;
3405  }
3406  }
3407 
3408 
3409  //
3410  // Table template management
3411  //
3412 
3417  {
3418  global $ilDB;
3419 
3420  $set = $ilDB->query("SELECT * FROM style_template WHERE ".
3421  "style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
3422  "temp_type = ".$ilDB->quote($a_type, "text")." ".
3423  "ORDER BY name");
3424 
3425  $templates = array();
3426  while ($rec = $ilDB->fetchAssoc($set))
3427  {
3428  $rec["classes"] = $this->getTemplateClasses($rec["id"]);
3429  $templates[] = $rec;
3430  }
3431 
3432  return $templates;
3433  }
3434 
3438  function getTemplateClasses($a_tid)
3439  {
3440  global $ilDB;
3441  $set = $ilDB->query("SELECT * FROM style_template_class WHERE ".
3442  "template_id = ".$ilDB->quote($a_tid, "integer"));
3443 
3444  $class = array();
3445  while ($rec = $ilDB->fetchAssoc($set))
3446  {
3447  $key = $rec["class_type"];
3448  $class[$key] = $rec["class"];
3449  }
3450 
3451  return $class;
3452  }
3453 
3454 
3458  function addTemplate($a_type, $a_name, $a_classes)
3459  {
3460  global $ilDB;
3461 
3462  $tid = $ilDB->nextId("style_template");
3463  $ilDB->manipulate($q = "INSERT INTO style_template ".
3464  "(id, style_id, name, temp_type)".
3465  " VALUES (".
3466  $ilDB->quote($tid, "integer").",".
3467  $ilDB->quote($this->getId(), "integer").",".
3468  $ilDB->quote($a_name, "text").",".
3469  $ilDB->quote($a_type, "text").
3470  ")");
3471 
3472  foreach ($a_classes as $t => $c)
3473  {
3474  $ilDB->manipulate($q = "INSERT INTO style_template_class ".
3475  "(template_id, class_type, class)".
3476  " VALUES (".
3477  $ilDB->quote($tid, "integer").",".
3478  $ilDB->quote($t, "text").",".
3479  $ilDB->quote($c, "text").
3480  ")");
3481  }
3482 
3483  include_once("./Services/Style/Content/classes/class.ilObjStyleSheetGUI.php");
3484  $this->writeTemplatePreview($tid,
3485  ilObjStyleSheetGUI::_getTemplatePreview($this, $a_type, $tid, true));
3486 
3487  return $tid;
3488  }
3489 
3493  function updateTemplate($a_t_id, $a_name, $a_classes)
3494  {
3495  global $ilDB;
3496 
3497  $ilDB->manipulate("UPDATE style_template SET ".
3498  "name = ".$ilDB->quote($a_name, "text").
3499  " WHERE id = ".$ilDB->quote($a_t_id, "integer"));
3500 
3501  $ilDB->manipulate("DELETE FROM style_template_class WHERE ".
3502  "template_id = ".$ilDB->quote($a_t_id, "integer")
3503  );
3504  foreach ($a_classes as $t => $c)
3505  {
3506  $ilDB->manipulate($q = "INSERT INTO style_template_class ".
3507  "(template_id, class_type, class)".
3508  " VALUES (".
3509  $ilDB->quote($a_t_id, "integer").",".
3510  $ilDB->quote($t, "text").",".
3511  $ilDB->quote($c, "text").
3512  ")");
3513  }
3514 
3515  }
3516 
3520  function addTemplateClass($a_t_id, $a_type, $a_class)
3521  {
3522  global $ilDB;
3523 
3524  $ilDB->manipulate($q = "INSERT INTO style_template_class ".
3525  "(template_id, class_type, class)".
3526  " VALUES (".
3527  $ilDB->quote($a_t_id, "integer").",".
3528  $ilDB->quote($a_type, "text").",".
3529  $ilDB->quote($a_class, "text").
3530  ")");
3531  }
3532 
3533 
3537  function templateExists($a_template_name)
3538  {
3539  global $ilDB;
3540 
3541  $set = $ilDB->query("SELECT * FROM style_template WHERE ".
3542  "style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
3543  "name = ".$ilDB->quote($a_template_name, "text"));
3544  if ($rec = $ilDB->fetchAssoc($set))
3545  {
3546  return true;
3547  }
3548  return false;
3549  }
3550 
3554  function getTemplate($a_t_id)
3555  {
3556  global $ilDB;
3557 
3558  $set = $ilDB->query("SELECT * FROM style_template WHERE ".
3559  "style_id = ".$ilDB->quote($this->getId(), "integer")." ".
3560  " AND id = ".$ilDB->quote($a_t_id, "integer"));
3561 
3562  if ($rec = $ilDB->fetchAssoc($set))
3563  {
3564  $rec["classes"] = $this->getTemplateClasses($rec["id"]);
3565 
3566  $template = $rec;
3567  return $template;
3568  }
3569  return array();
3570  }
3571 
3575  function lookupTemplateName($a_t_id)
3576  {
3577  return self::_lookupTemplateName($a_t_id);
3578  }
3579 
3583  static function _lookupTemplateName($a_t_id)
3584  {
3585  global $ilDB;
3586 
3587  $set = $ilDB->query("SELECT name FROM style_template WHERE ".
3588  " id = ".$ilDB->quote($a_t_id, "integer"));
3589 
3590  if ($rec = $ilDB->fetchAssoc($set))
3591  {
3592  return $rec["name"];
3593  }
3594 
3595  return false;
3596  }
3597 
3601  function getTemplateXML()
3602  {
3603  global $ilDB;
3604 
3605  $tag = "<StyleTemplates>";
3606 
3607  $ttypes = array("table", "vaccordion", "haccordion", "carousel");
3608 
3609  foreach ($ttypes as $ttype)
3610  {
3611  $ts = $this->getTemplates($ttype);
3612 
3613  foreach($ts as $t)
3614  {
3616  /*$atts = array("table" => "TableClass",
3617  "caption" => "CaptionClass",
3618  "row_head" => "RowHeadClass",
3619  "row_foot" => "RowFootClass",
3620  "col_head" => "ColHeadClass",
3621  "col_foot" => "ColFootClass",
3622  "odd_row" => "OddRowClass",
3623  "even_row" => "EvenRowClass",
3624  "odd_col" => "OddColClass",
3625  "even_col" => "EvenColClass");*/
3626  $c = $t["classes"];
3627 
3628  $tag.= '<StyleTemplate Name="'.$t["name"].'">';
3629 
3630  foreach ($atts as $type => $t)
3631  {
3632  if ($c[$type] != "")
3633  {
3634  $tag.= '<StyleClass Type="'.$type.'" Value="'.$c[$type].'" />';
3635  }
3636  }
3637 
3638  $tag.= "</StyleTemplate>";
3639  }
3640  }
3641 
3642  $tag.= "</StyleTemplates>";
3643 
3644 //echo htmlentities($tag);
3645  return $tag;
3646  }
3647 
3651  function writeTemplatePreview($a_t_id, $a_preview_html)
3652  {
3653  global $ilDB;
3654  $a_preview_html = str_replace(' width=""', "", $a_preview_html);
3655  $a_preview_html = str_replace(' valign="top"', "", $a_preview_html);
3656  $a_preview_html = str_replace('<div class="ilc_text_block_TableContent">', "<div>", $a_preview_html);
3657 //echo "1-".strlen($a_preview_html)."-";
3658 //echo htmlentities($a_preview_html);
3659  if (strlen($a_preview_html) > 4000)
3660  {
3661 //echo "2";
3662  $a_preview_html = "";
3663  }
3664  $ilDB->manipulate("UPDATE style_template SET ".
3665  "preview = ".$ilDB->quote($a_preview_html, "text").
3666  " WHERE id = ".$ilDB->quote($a_t_id, "integer"));
3667  }
3668 
3672  function lookupTemplatePreview($a_t_id)
3673  {
3674  global $ilDB;
3675 
3676  $set = $ilDB->query("SELECT preview FROM style_template ".
3677  " WHERE id = ".$ilDB->quote($a_t_id, "integer"));
3678  if ($rec = $ilDB->fetchAssoc($set))
3679  {
3680  return $rec["preview"];
3681  }
3682 
3683  return "";
3684  }
3685 
3689  static function _lookupTemplateIdByName($a_style_id, $a_name)
3690  {
3691  global $ilDB;
3692 
3693  $set = $ilDB->query("SELECT id FROM style_template ".
3694  " WHERE style_id = ".$ilDB->quote($a_style_id, "integer").
3695  " AND name = ".$ilDB->quote($a_name, "text"));
3696  if ($rec = $ilDB->fetchAssoc($set))
3697  {
3698  return $rec["id"];
3699  }
3700 
3701  return false;
3702  }
3703 
3707  function removeTemplate($a_t_id)
3708  {
3709  global $ilDB;
3710 
3711  $ilDB->manipulate("DELETE FROM style_template WHERE ".
3712  " style_id = ".$ilDB->quote($this->getId(), "integer")." AND ".
3713  " id = ".$ilDB->quote($a_t_id, "integer"));
3714 
3715  $ilDB->manipulate("DELETE FROM style_template_class WHERE ".
3716  "template_id = ".$ilDB->quote($a_t_id, "integer")
3717  );
3718 
3719  }
3720 
3724  function writeStyleSetting($a_name, $a_value)
3725  {
3726  global $ilDB;
3727 
3728  $ilDB->manipulate("DELETE FROM style_setting WHERE ".
3729  " style_id = ".$ilDB->quote($this->getId(), "integer").
3730  " AND name = ".$ilDB->quote($a_name, "text")
3731  );
3732 
3733  $ilDB->manipulate("INSERT INTO style_setting ".
3734  "(style_id, name, value) VALUES (".
3735  $ilDB->quote($this->getId(), "integer").",".
3736  $ilDB->quote($a_name, "text").",".
3737  $ilDB->quote($a_value, "text").
3738  ")");
3739  }
3740 
3744  function lookupStyleSetting($a_name)
3745  {
3746  global $ilDB;
3747 
3748  $set = $ilDB->query("SELECT value FROM style_setting ".
3749  " WHERE style_id = ".$ilDB->quote($this->getId(), "integer").
3750  " AND name = ".$ilDB->quote($a_name, "text")
3751  );
3752  $rec = $ilDB->fetchAssoc($set);
3753 
3754  return $rec["value"];
3755  }
3756 
3760  static function writeStyleUsage($a_obj_id, $a_style_id)
3761  {
3762  global $ilDB;
3763 
3764  $ilDB->replace("style_usage", array(
3765  "obj_id" => array("integer", (int) $a_obj_id)),
3766  array(
3767  "style_id" => array("integer", (int) $a_style_id))
3768  );
3769  }
3770 
3774  static function lookupObjectStyle($a_obj_id)
3775  {
3776  global $ilDB;
3777 
3778  $set = $ilDB->query("SELECT style_id FROM style_usage ".
3779  " WHERE obj_id = ".$ilDB->quote($a_obj_id, "integer")
3780  );
3781  $rec = $ilDB->fetchAssoc($set);
3782 
3783  if (ilObject::_lookupType($rec["style_id"]) == "sty")
3784  {
3785  return (int) $rec["style_id"];
3786  }
3787 
3788  return 0;
3789  }
3790 
3794  static function lookupObjectForStyle($a_style_id)
3795  {
3796  global $ilDB;
3797 
3798  $obj_ids = array();
3799  if (ilObject::_lookupType($a_style_id) == "sty")
3800  {
3801  $set = $ilDB->query("SELECT DISTINCT obj_id FROM style_usage " .
3802  " WHERE style_id = " . $ilDB->quote($a_style_id, "integer")
3803  );
3804 
3805  while ($rec = $ilDB->fetchAssoc($set))
3806  {
3807  $obj_ids[] = $rec["obj_id"];
3808  }
3809  }
3810  return $obj_ids;
3811  }
3812 
3813 
3814 }
3815 ?>
static _lookupTemplateIdByName($a_style_id, $a_name)
Lookup table template preview.
static _lookupContObjIdByStyleId($a_style_id)
lookup style sheet ID
deleteMediaQuery($a_id)
Delete media query.
global $ilErr
Definition: raiseError.php:16
getXML()
get xml representation of style object todo: add mq_id
static _explodeRGB($a_rgb, $as_dec=false)
Explode an RGB string into an array.
$path
Definition: aliased.php:25
static _writeScope($a_id, $a_scope)
Write scope.
static _getTemplateClassTypes($a_template_type="")
Get template class types.
static getContentPrintStyle()
get content print style
getHideStatus($a_type, $a_char)
Get characteristic hide status.
removeColor($a_name)
Remove a color.
characteristicExists($a_char, $a_style_type)
Check whether characteristic exists.
static getPlaceHolderStylePath()
get placeholder style path (for Page Layouts)
exportXML($a_dir)
export style xml file to directory
static _HLSToRGB($a_hls)
HLS to RGB (both arrays, 0..255)
static lookupObjectForStyle($a_style_id)
Lookup object style.
static _lookupTemplateName($a_t_id)
Lookup table template name for template ID.
do_3_10_Migration()
Migrates 3.10 style to 3.11 style.
static _getTemplatePreview($a_style, $a_type, $a_t_id, $a_small_mode=false)
Get table template preview.
setCharacteristics($a_chars)
Set characteristics.
getColors()
Get colors of style.
setRefId($a_ref_id)
Set ref id (show error message, since styles do not use ref ids)
static rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
read()
read style properties
static _determineTag($a_type)
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data
deleteParameter($a_id)
delete style parameter
addTemplate($a_type, $a_name, $a_classes)
Add table template.
$h
do_3_9_Migration($a_id)
Migrate old 3.9 styles.
getRefId()
Get ref id (show error message, since styles do not use ref ids)
Class ilObject Basic functions for all objects.
copyImagesToDir($a_target)
Copy images to directory.
setExportSubDir($a_dir)
Set local directory, that will be included within the zip file.
static _getStandardStyles($a_exclude_default_style=false, $a_include_deactivated=false, $a_scope=0)
Get standard styles.
deleteImage($a_file)
Delete an image.
lookupStyleSetting($a_name)
Lookup style setting.
setScope($a_scope)
Set scope.
updateMediaQuery($a_id, $a_mquery)
Update media query.
"color:#CC0000 style
Definition: example_001.php:92
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
static _getStyleSuperTypeForType($a_type)
writeTemplatePreview($a_t_id, $a_preview_html)
Write table template preview.
static _lookupTitle($a_id)
lookup object title
static _deleteStyleAssignments($a_style_id)
delete all style references to style
deleteStyleParOfChar($a_type, $a_class)
Delete style parameters of characteristic.
deleteCustomStylePars($a_tag, $a_class, $a_type, $a_mq_id=0)
Delete style parameter by tag/class/parameter.
static _lookupUpToDate($a_id)
Looup up to date.
static _getPseudoClasses($tag)
static _getClonableContentStyles()
Get all clonable styles (active standard styles and individual learning module styles with write perm...
writeCSSFile($a_target_file="", $a_image_dir="")
write css file to webspace directory
static sortArray($array, $a_array_sortby, $a_array_sortorder=0, $a_numeric=false, $a_keep_keys=false)
sortArray
static lookupObjectStyle($a_obj_id)
Lookup object style.
& getMetaData()
get meta data object
createExportSubDirectory()
Create export directory.
static _getAllReferences($a_id)
get all reference ids of object
lookupTemplateName($a_t_id)
Lookup table template name for template ID.
do_3_10_CharMigration($a_id="")
This is more or less a copy of Services/Migration/DBUpdate_1385/classes ilStyleMigration->addMissingS...
getThumbnailsDirectory()
Get thumbnails directory.
static _lookupStandard($a_id)
Lookup standard flag.
handleXmlString($a_str)
Handle xml strin.
static writeStyleUsage($a_obj_id, $a_style_id)
Write style usage.
static _writeActive($a_id, $a_active)
Write active flag.
$a_type
Definition: workflow.php:93
addColor($a_name, $a_code)
Add color.
getTemplate($a_t_id)
Get template.
addTemplateClass($a_t_id, $a_type, $a_class)
Update table template.
$r
Definition: example_031.php:79
static _getBasicStyleDom()
Get basic style dom.
getImagesDirectory()
Get images directory.
templateExists($a_template_name)
Check whether template exists.
static resizeImage($a_from, $a_to, $a_width, $a_height, $a_constrain_prop=false)
resize image
static _addMissingStyleClassesToAllStyles($a_styles="")
Add missing style classes to all styles todo: add mq_id and custom handling.
getId()
get object id public
static _isExpandable($a_type)
static moveUploadedFile($a_file, $a_name, $a_target, $a_raise_errors=true, $a_mode="move_uploaded")
move uploaded file
writeStyleSetting($a_name, $a_value)
Write Style Setting.
getTemplateXML()
Get table template xml.
static _getCoreStyles()
Get core styles.
static getEffectiveContentStyleId($a_style_id, $a_type="")
Get effective Style Id.
getTitle()
get object title public
uploadImage($a_file)
Upload image.
getDescription()
get object description
addParameter($a_tag, $a_par, $a_type, $a_mq_id=0, $a_custom=false)
write style parameter to db
redirection script todo: (a better solution should control the processing via a xml file) ...
setUpToDate($a_up_to_date=true)
Set style up to date (false + update will trigger css generation next time)
copyCharacteristic($a_from_style_id, $a_from_type, $a_from_char, $a_to_char)
Copy characteristic.
saveHideStatus($a_type, $a_char, $a_hide)
Save characteristic hide status.
setStyle($a_style)
set styles
static getSyntaxStylePath()
get syntax style path
static signFile($path_to_file)
getParametersOfClass($a_type, $a_class, $a_mq_id=0)
Get parameters of class.
static zip($a_dir, $a_file, $compress_content=false)
zips given directory/file into given zip.file
getType()
get object type public
getCharacteristics($a_type="", $a_no_hidden=false, $a_include_core=true)
Get characteristics.
getStyleParameterGroups()
Get grouped parameter.
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
__construct($a_id=0, $a_call_by_reference=false)
Constructor public.
export()
Create export file.
getTemplates($a_type)
Get table templates of style.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
deleteStylePar($a_tag, $a_class, $a_par, $a_type, $a_mq_id=0, $a_custom=false)
Delete style parameter by tag/class/parameter.
static _getColorFlavor($a_rgb, $a_i)
Get color flavor.
updateColor($a_name, $a_new_name, $a_code)
Update color.
static _createImagesDirectory($a_style_id)
Create images directory <data_dir>/sty/sty_<id>/images.
createExportDirectory()
Create export directory.
getStyle()
todo: bad style! should return array of objects, not multi-dim-arrays
updateStyleParameter($a_id, $a_value)
update style parameter per id
static getContentStylePath($a_style_id)
get content style path
static _addMissingStyleClassesToStyle($a_id)
Add missing style classes to all styles.
createReference()
Create a reference (show error message, since styles do not use ref ids)
static _getImagesDirectory($a_style_id)
Get images directory.
addCharacteristic($a_type, $a_char, $a_hidden=false)
Add characteristic.
static _RGBToHLS($a_rgb)
RGB to HLS (both arrays, 0..255)
getTemplateClasses($a_tid)
Get template classes.
static _getStyleParameterValues($par)
getMaxMQueryOrderNr()
Get maximum media query order nr.
static _writeStandard($a_id, $a_std)
Write standard flag.
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 getDataDir()
get data directory (outside webspace)
colorExists($a_color_name)
Check whether color exists.
deleteCharacteristic($a_type, $a_tag, $a_class)
Delete Characteristic.
global $l
Definition: afr.php:30
static _getStyleParameterNumericUnits($a_no_percentage=false)
create($a_from_style=0, $a_import_mode=false)
Create a new style.
getExportSubDir()
The local directory, that will be included within the zip file.
global $ilSetting
Definition: privfeed.php:17
createImportDirectory()
Create import directory.
getColorCodeForName($a_name)
Remove a color.
updateTemplate($a_t_id, $a_name, $a_classes)
Update table template.
global $ilBench
Definition: ilias.php:18
global $ilDB
Class ilObjStyleSheet.
static _getStyleParameters($a_tag="")
removeTemplate($a_t_id)
Remove table template.
static isCoreStyle($a_type, $a_class)
Is core style.
saveMediaQueryOrder($a_order_nr=null)
Save media query order.
static _isHideable($a_type)
assignMetaData(&$a_meta_data)
assign meta data object
cleanExportDirectory()
Clear export directory.
getImages()
Get images of style.
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file
createFromXMLFile($a_file, $a_skip_parent_create=false)
create style from xml file todo: add mq_id and custom
static _lookupActive($a_id)
Lookup active flag.
static _getStyleParameterInputType($par)
addMediaQuery($a_mquery, $order_nr=0)
Add media query.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static getWebspaceDir($mode="filesystem")
get webspace directory
static _getObjectsDataForType($a_type, $a_omit_trash=false)
get all objects of a certain type
static _replaceStylePar($style_id, $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id=0, $a_custom=false)
static _getStyleParameterSubPar($par)
createImagesDirectory()
Create images directory <data_dir>/sty/sty_<id>/images.
getMediaQueries()
Get colors of style.
ilClone()
clone style sheet (note: styles have no ref ids and return an object id)
getMediaQueryForId($a_id)
Get media query for id.
static getAvailableParameters()
Get available parameters.
static _writeUpToDate($a_id, $a_up_to_date)
Write up to date.
lookupTemplatePreview($a_t_id)
Lookup table template preview.
putInTree($a_parent_ref)
Put in tree (show error message, since styles do not use ref ids)
getUpToDate()
Get up to date.