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