ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
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"),
249  "text_inline" => array("text_inline", "sub", "sup"),
250  "section" => array("section"),
251  "link" => array("link"),
252  "table" => array("table", "table_cell", "table_caption"),
253  "list" => array("list_o", "list_u", "list_item"),
254  "flist" => array("flist_cont", "flist_head", "flist", "flist_li", "flist_a"),
255  "media" => array("media_cont", "media_caption", "iim", "marker"),
256  "tabs" => array("va_cntr", "va_icntr", "va_ihead", "va_iheada", "va_ihcap", "va_icont",
257  "ha_cntr", "ha_icntr", "ha_ihead", "ha_iheada", "ha_ihcap", "ha_icont", "ca_cntr", "ca_icntr", "ca_ihead", "ca_icont"),
258  "question" => array("question", "qtitle", "qanswer", "qinput", "qlinput", "qsubmit", "qfeedr", "qfeedw",
259  "qimg", "qordul", "qordli", "qimgd", "qetitem", "qetcorr", "qover"),
260  "page" => array("page_frame", "page_cont", "page_title", "page_fn",
261  "page_tnav", "page_bnav", "page_lnav", "page_rnav", "page_lnavlink", "page_rnavlink",
262  "page_lnavimage", "page_rnavimage"),
263  "glo" => array("glo_overlay", "glo_ovtitle", "glo_ovclink", "glo_ovuglink", "glo_ovuglistlink"),
264  "sco" => array("sco_title", "sco_keyw", "sco_desc", "sco_desct", "sco_obj", "sco_objt", "sco_fmess"),
265  "rte" => array("rte_menu", "rte_mlink", "rte_tree", "rte_node", "rte_tlink","rte_status",
266  "rte_tul", "rte_tli", "rte_texp", "rte_tclink", "rte_drag")
267  );
268 
269  // these types are expandable, i.e. the user can define new style classes
270  public static $expandable_types = array(
271  "text_block", "text_inline", "section", "media_cont", "table", "table_cell", "flist_li", "table_caption",
272  "list_o", "list_u",
273  "va_cntr", "va_icntr", "va_ihead", "va_iheada", "va_ihcap", "va_icont",
274  "ha_cntr", "ha_icntr", "ha_ihead", "ha_iheada", "ha_ihcap", "ha_icont",
275  "ca_cntr", "ca_icntr", "ca_ihead", "ca_icont"
276  );
277 
278  // these types can be hidden in the content editor
279  public static $hideable_types = array(
280  "table", "table_cell"
281  );
282 
283  // tag that are used by style types
284  public static $assigned_tags = array(
285  "text_block" => "div",
286  "heading1" => "h1",
287  "heading2" => "h2",
288  "heading3" => "h3",
289  "text_inline" => "span",
290  "sup" => "sup",
291  "sub" => "sub",
292  "section" => "div",
293  "link" => "a",
294  "table" => "table",
295  "table_cell" => "td",
296  "table_caption" => "caption",
297  "media_cont" => "figure",
298  "media_caption" => "div",
299  "iim" => "div",
300  "marker" => "a",
301  "glo_overlay" => "div",
302  "glo_ovtitle" => "h1",
303  "glo_ovclink" => "a",
304  "glo_ovuglink" => "a",
305  "glo_ovuglistlink" => "a",
306  "sco_title" => "div",
307  "sco_keyw" => "div",
308  "sco_desc" => "div",
309  "sco_obj" => "div",
310  "sco_desct" => "div",
311  "sco_objt" => "div",
312  "sco_fmess" => "div",
313  "rte_menu" => "div",
314  "rte_mlink" => "a",
315  "rte_tree" => "div",
316  "rte_tclink" => "a",
317  "rte_drag" => "div",
318  "rte_node" => "div",
319  "rte_status" => "div",
320  "rte_tlink" => "a",
321  "rte_tul" => "div",
322  "rte_tli" => "div",
323  "rte_texp" => "a",
324  "list_o" => "ol",
325  "list_u" => "ul",
326  "list_item" => "li",
327  "flist_cont" => "div",
328  "flist_head" => "div",
329  "flist" => "ul",
330  "flist_li" => "li",
331  "flist_a" => "a",
332  "question" => "div",
333  "qtitle" => "div",
334  "qanswer" => "div",
335  "qimg" => "img",
336  "qimgd" => "a",
337  "qordul" => "ul",
338  "qordli" => "li",
339  "qetitem" => "a",
340  "qetcorr" => "span",
341  "qinput" => "input",
342  "qlinput" => "textarea",
343  "qsubmit" => "input",
344  "qfeedr" => "div",
345  "qfeedw" => "div",
346  "qover" => "div",
347  "page_frame" => "div",
348  "page_cont" => "div",
349  "page_fn" => "div",
350  "page" => "div",
351  "page_tnav" => "div",
352  "page_bnav" => "div",
353  "page_lnav" => "div",
354  "page_rnav" => "div",
355  "page_lnavlink" => "a",
356  "page_rnavlink" => "a",
357  "page_lnavimage" => "img",
358  "page_rnavimage" => "img",
359  "page_title" => "h1",
360  "va_cntr" => "div",
361  "va_icntr" => "div",
362  "va_icont" => "div",
363  "va_ihead" => "div",
364  "va_iheada" => "div",
365  "va_ihcap" => "div",
366  "ha_cntr" => "div",
367  "ha_icntr" => "div",
368  "ha_icont" => "div",
369  "ha_iheada" => "div",
370  "ha_ihcap" => "div",
371  "ha_ihead" => "div",
372  "ca_cntr" => "div",
373  "ca_icntr" => "div",
374  "ca_ihead" => "div",
375  "ca_icont" => "div"
376  );
377 
378  // pseudo classes
379  public static $pseudo_classes =
380  array("a" => array("hover"), "div" => array("hover"), "img" => array("hover"));
381 
382  // core styles these styles MUST exists -> see also basic_style/style.xml
383  public static $core_styles = array(
384  array("type" => "text_block", "class" => "Standard"),
385  array("type" => "text_block", "class" => "List"),
386  array("type" => "text_block", "class" => "TableContent"),
387  array("type" => "heading1", "class" => "Headline1"),
388  array("type" => "heading2", "class" => "Headline2"),
389  array("type" => "heading3", "class" => "Headline3"),
390  array("type" => "text_inline", "class" => "Comment"),
391  array("type" => "text_inline", "class" => "Emph"),
392  array("type" => "text_inline", "class" => "Quotation"),
393  array("type" => "text_inline", "class" => "Strong"),
394  array("type" => "text_inline", "class" => "Accent"),
395  array("type" => "text_inline", "class" => "Important"),
396  array("type" => "sup", "class" => "Sup"),
397  array("type" => "sub", "class" => "Sub"),
398  array("type" => "link", "class" => "IntLink"),
399  array("type" => "link", "class" => "ExtLink"),
400  array("type" => "link", "class" => "FootnoteLink"),
401  array("type" => "link", "class" => "FileLink"),
402  array("type" => "link", "class" => "GlossaryLink"),
403  array("type" => "media_cont", "class" => "MediaContainer"),
404  array("type" => "media_cont", "class" => "MediaContainerMax50"),
405  array("type" => "media_cont", "class" => "MediaContainerFull100"),
406  array("type" => "table", "class" => "StandardTable"),
407  array("type" => "media_caption", "class" => "MediaCaption"),
408  array("type" => "iim", "class" => "ContentPopup"),
409  array("type" => "marker", "class" => "Marker"),
410  array("type" => "page_frame", "class" => "PageFrame"),
411  array("type" => "page_cont", "class" => "PageContainer"),
412  array("type" => "page", "class" => "Page"),
413  array("type" => "page_tnav", "class" => "TopNavigation"),
414  array("type" => "page_bnav", "class" => "BottomNavigation"),
415  array("type" => "page_lnav", "class" => "LeftNavigation"),
416  array("type" => "page_rnav", "class" => "RightNavigation"),
417  array("type" => "page_lnavlink", "class" => "LeftNavigationLink"),
418  array("type" => "page_rnavlink", "class" => "RightNavigationLink"),
419  array("type" => "page_lnavimage", "class" => "LeftNavigationImage"),
420  array("type" => "page_rnavimage", "class" => "RightNavigationImage"),
421  array("type" => "page_fn", "class" => "Footnote"),
422  array("type" => "page_title", "class" => "PageTitle"),
423  array("type" => "glo_overlay", "class" => "GlossaryOverlay"),
424  array("type" => "glo_ovtitle", "class" => "GlossaryOvTitle"),
425  array("type" => "glo_ovclink", "class" => "GlossaryOvCloseLink"),
426  array("type" => "glo_ovuglink", "class" => "GlossaryOvUnitGloLink"),
427  array("type" => "glo_ovuglistlink", "class" => "GlossaryOvUGListLink"),
428  array("type" => "sco_title", "class" => "Title"),
429  array("type" => "sco_desc", "class" => "Description"),
430  array("type" => "sco_desct", "class" => "DescriptionTop"),
431  array("type" => "sco_keyw", "class" => "Keywords"),
432  array("type" => "sco_obj", "class" => "Objective"),
433  array("type" => "sco_objt", "class" => "ObjectiveTop"),
434  array("type" => "sco_fmess", "class" => "FinalMessage"),
435  array("type" => "rte_menu", "class" => "RTEMenu"),
436  array("type" => "rte_menu", "class" => "RTELogo"),
437  array("type" => "rte_menu", "class" => "RTELinkBar"),
438  array("type" => "rte_mlink", "class" => "RTELink"),
439  array("type" => "rte_mlink", "class" => "RTELinkDisabled"),
440  array("type" => "rte_tree", "class" => "RTETree"),
441  array("type" => "rte_node", "class" => "RTECourse"),
442  array("type" => "rte_node", "class" => "RTEChapter"),
443  array("type" => "rte_node", "class" => "RTESco"),
444  array("type" => "rte_node", "class" => "RTEAsset"),
445  array("type" => "rte_node", "class" => "RTECourseDisabled"),
446  array("type" => "rte_node", "class" => "RTEChapterDisabled"),
447  array("type" => "rte_node", "class" => "RTEScoDisabled"),
448  array("type" => "rte_node", "class" => "RTEAssetDisabled"),
449  array("type" => "rte_status", "class" => "RTEAsset"),
450  array("type" => "rte_status", "class" => "RTECompleted"),
451  array("type" => "rte_status", "class" => "RTENotAttempted"),
452  array("type" => "rte_status", "class" => "RTERunning"),
453  array("type" => "rte_status", "class" => "RTEIncomplete"),
454  array("type" => "rte_status", "class" => "RTEPassed"),
455  array("type" => "rte_status", "class" => "RTEFailed"),
456  array("type" => "rte_status", "class" => "RTEBrowsed"),
457  array("type" => "rte_tlink", "class" => "RTETreeLink"),
458  array("type" => "rte_tlink", "class" => "RTETreeLinkDisabled"),
459  array("type" => "rte_tlink", "class" => "RTETreeCurrent"),
460  array("type" => "rte_tul", "class" => "RTETreeList"),
461  array("type" => "rte_tli", "class" => "RTETreeItem"),
462  array("type" => "rte_texp", "class" => "RTETreeExpanded"),
463  array("type" => "rte_texp", "class" => "RTETreeCollapsed"),
464  array("type" => "rte_tree", "class" => "RTETreeControl"),
465  array("type" => "rte_tclink", "class" => "RTETreeControlLink"),
466  array("type" => "rte_drag", "class" => "RTEDragBar"),
467  array("type" => "list_o", "class" => "NumberedList"),
468  array("type" => "list_u", "class" => "BulletedList"),
469  array("type" => "list_item", "class" => "StandardListItem"),
470  array("type" => "question", "class" => "Standard"),
471  array("type" => "question", "class" => "SingleChoice"),
472  array("type" => "question", "class" => "MultipleChoice"),
473  array("type" => "question", "class" => "TextQuestion"),
474  array("type" => "question", "class" => "OrderingQuestion"),
475  array("type" => "question", "class" => "MatchingQuestion"),
476  array("type" => "question", "class" => "ImagemapQuestion"),
477  array("type" => "question", "class" => "ErrorText"),
478  array("type" => "question", "class" => "TextSubset"),
479  array("type" => "question", "class" => "ClozeTest"),
480  array("type" => "qtitle", "class" => "Title"),
481  array("type" => "qanswer", "class" => "Answer"),
482  array("type" => "qimg", "class" => "QuestionImage"),
483  array("type" => "qimgd", "class" => "ImageDetailsLink"),
484  array("type" => "qordul", "class" => "OrderList"),
485  array("type" => "qordli", "class" => "OrderListItem"),
486  array("type" => "qordul", "class" => "OrderListHorizontal"),
487  array("type" => "qordli", "class" => "OrderListItemHorizontal"),
488  array("type" => "qetitem", "class" => "ErrorTextItem"),
489  array("type" => "qetitem", "class" => "ErrorTextSelected"),
490  array("type" => "qetcorr", "class" => "ErrorTextCorrected"),
491  array("type" => "qinput", "class" => "TextInput"),
492  array("type" => "qlinput", "class" => "LongTextInput"),
493  array("type" => "qsubmit", "class" => "Submit"),
494  array("type" => "qfeedr", "class" => "FeedbackRight"),
495  array("type" => "qfeedw", "class" => "FeedbackWrong"),
496  array("type" => "qover", "class" => "Correct"),
497  array("type" => "qover", "class" => "Inorrect"),
498  array("type" => "qover", "class" => "StatusMessage"),
499  array("type" => "qover", "class" => "WrongAnswersMessage"),
500  array("type" => "flist_cont", "class" => "FileListContainer"),
501  array("type" => "flist_head", "class" => "FileListHeading"),
502  array("type" => "flist", "class" => "FileList"),
503  array("type" => "flist_li", "class" => "FileListItem"),
504  array("type" => "flist_a", "class" => "FileListItemLink")
505  );
506 
507  public static $templates = array(
508  "table" => array(
509  "table" => "table",
510  "caption" => "table_caption",
511  "row_head" => "table_cell",
512  "row_foot" => "table_cell",
513  "col_head" => "table_cell",
514  "col_foot" => "table_cell",
515  "odd_row" => "table_cell",
516  "even_row" => "table_cell",
517  "odd_col" => "table_cell",
518  "even_col" => "table_cell"),
519  "vaccordion" => array(
520  "va_cntr" => "va_cntr",
521  "va_icntr" => "va_icntr",
522  "va_ihead" => "va_ihead",
523  "va_iheada" => "va_iheada",
524  "va_ihcap" => "va_ihcap",
525  "va_icont" => "va_icont"
526  ),
527  "haccordion" => array(
528  "ha_cntr" => "ha_cntr",
529  "ha_icntr" => "ha_icntr",
530  "ha_ihead" => "ha_ihead",
531  "ha_iheada" => "ha_iheada",
532  "ha_ihcap" => "ha_ihcap",
533  "ha_icont" => "ha_icont"
534  ),
535  "carousel" => array(
536  "ca_cntr" => "ca_cntr",
537  "ca_icntr" => "ca_icntr",
538  "ca_ihead" => "ca_ihead",
539  "ca_icont" => "ca_icont"
540  )
541  );
542 
543  // basic style xml file, image directory and dom
544  protected static $basic_style_file = "./libs/ilias/Style/basic_style/style.xml";
545  protected static $basic_style_image_dir = "./libs/ilias/Style/basic_style/images";
546  protected static $basic_style_dom;
547 
554  public function __construct($a_id = 0, $a_call_by_reference = false)
555  {
556  global $DIC;
557 
558  $this->db = $DIC->database();
559  $this->lng = $DIC->language();
560  $this->type = "sty";
561  $this->style = array();
562  if ($a_call_by_reference) {
563  $this->ilias->raiseError("Can't instantiate style object via reference id.", $this->ilias->error_obj->FATAL);
564  }
565 
566  parent::__construct($a_id, false);
567  }
568 
572  public function setRefId($a_ref_id)
573  {
574  $this->ilias->raiseError("Operation ilObjStyleSheet::setRefId() not allowed.", $this->ilias->error_obj->FATAL);
575  }
576 
580  public function getRefId()
581  {
582  return "";
583  //$this->ilias->raiseError("Operation ilObjStyleSheet::getRefId() not allowed.",$this->ilias->error_obj->FATAL);
584  }
585 
589  public function putInTree($a_parent_ref)
590  {
591  $this->ilias->raiseError("Operation ilObjStyleSheet::putInTree() not allowed.", $this->ilias->error_obj->FATAL);
592  }
593 
597  public function createReference()
598  {
599  $this->ilias->raiseError("Operation ilObjStyleSheet::createReference() not allowed.", $this->ilias->error_obj->FATAL);
600  }
601 
605  public function setUpToDate($a_up_to_date = true)
606  {
607  $this->up_to_date = $a_up_to_date;
608  }
609 
613  public function getUpToDate()
614  {
615  return $this->up_to_date;
616  }
617 
621  public function setScope($a_scope)
622  {
623  $this->scope = $a_scope;
624  }
625 
629  public function getScope()
630  {
631  return $this->scope;
632  }
633 
637  public static function _writeUpToDate($a_id, $a_up_to_date)
638  {
639  global $DIC;
640 
641  $ilDB = $DIC->database();
642 
643  $q = "UPDATE style_data SET uptodate = " .
644  $ilDB->quote((int) $a_up_to_date, "integer") .
645  " WHERE id = " . $ilDB->quote($a_id, "integer");
646  $ilDB->manipulate($q);
647  }
648 
652  public static function _lookupUpToDate($a_id)
653  {
654  global $DIC;
655 
656  $ilDB = $DIC->database();
657 
658  $q = "SELECT uptodate FROM style_data " .
659  " WHERE id = " . $ilDB->quote($a_id, "integer");
660  $res = $ilDB->query($q);
661  $sty = $ilDB->fetchAssoc($res);
662 
663  return (boolean) $sty["uptodate"];
664  }
665 
669  public static function _writeStandard($a_id, $a_std)
670  {
671  global $DIC;
672 
673  $ilDB = $DIC->database();
674 
675  $q = "UPDATE style_data SET standard = " .
676  $ilDB->quote((int) $a_std, "integer") .
677  " WHERE id = " . $ilDB->quote($a_id, "integer");
678  $ilDB->manipulate($q);
679  }
680 
684  public static function _writeScope($a_id, $a_scope)
685  {
686  global $DIC;
687 
688  $ilDB = $DIC->database();
689 
690  $q = "UPDATE style_data SET category = " .
691  $ilDB->quote((int) $a_scope, "integer") .
692  " WHERE id = " . $ilDB->quote($a_id, "integer");
693  $ilDB->manipulate($q);
694  }
695 
699  public static function _lookupStandard($a_id)
700  {
701  global $DIC;
702 
703  $ilDB = $DIC->database();
704 
705  $q = "SELECT * FROM style_data " .
706  " WHERE id = " . $ilDB->quote($a_id, "integer");
707  $res = $ilDB->query($q);
708  $sty = $ilDB->fetchAssoc($res);
709 
710  return (boolean) $sty["standard"];
711  }
712 
716  public static function _writeActive($a_id, $a_active)
717  {
718  global $DIC;
719 
720  $ilDB = $DIC->database();
721 
722  $q = "UPDATE style_data SET active = " .
723  $ilDB->quote((int) $a_active, "integer") .
724  " WHERE id = " . $ilDB->quote($a_id, "integer");
725  $ilDB->manipulate($q);
726  }
727 
731  public static function _lookupActive($a_id)
732  {
733  global $DIC;
734 
735  $ilDB = $DIC->database();
736 
737  $q = "SELECT * FROM style_data " .
738  " WHERE id = " . $ilDB->quote($a_id, "integer");
739  $res = $ilDB->query($q);
740  $sty = $ilDB->fetchAssoc($res);
741 
742  return (boolean) $sty["active"];
743  }
744 
748  public static function _getStandardStyles(
749  $a_exclude_default_style = false,
750  $a_include_deactivated = false,
751  $a_scope = 0
752  ) {
753  global $DIC;
754 
755  $ilDB = $DIC->database();
756  $ilSetting = $DIC->settings();
757  $tree = $DIC->repositoryTree();
758 
759  $default_style = $ilSetting->get("default_content_style_id");
760 
761  $and_str = "";
762  if (!$a_include_deactivated) {
763  $and_str = " AND active = 1";
764  }
765 
766  $q = "SELECT * FROM style_data " .
767  " WHERE standard = 1" . $and_str;
768  $res = $ilDB->query($q);
769  $styles = array();
770  while ($sty = $ilDB->fetchAssoc($res)) {
771  if (!$a_exclude_default_style || $default_style != $sty["id"]) {
772  // check scope
773  if ($a_scope > 0 && $sty["category"] > 0) {
774  if ($tree->isInTree($sty["category"]) &&
775  $tree->isInTree($a_scope)) {
776  $path = $tree->getPathId($a_scope);
777  if (!in_array($sty["category"], $path)) {
778  continue;
779  }
780  }
781  }
782  $styles[$sty["id"]] = ilObject::_lookupTitle($sty["id"]);
783  }
784  }
785 
786  return $styles;
787  }
788 
789 
794  public static function _getClonableContentStyles()
795  {
796  global $DIC;
797 
798  $ilAccess = $DIC->access();
799  $ilDB = $DIC->database();
800 
801  $clonable_styles = array();
802 
803  $q = "SELECT * FROM style_data";
804  $style_set = $ilDB->query($q);
805  while ($style_rec = $ilDB->fetchAssoc($style_set)) {
806  $clonable = false;
807  if ($style_rec["standard"] == 1) {
808  if ($style_rec["active"] == 1) {
809  $clonable = true;
810  }
811  } else {
812  include_once("./Modules/LearningModule/classes/class.ilObjContentObject.php");
813  $obj_ids = ilObjContentObject::_lookupContObjIdByStyleId($style_rec["id"]);
814  if (count($obj_ids) == 0) {
815  $obj_ids = self::lookupObjectForStyle($style_rec["id"]);
816  }
817  foreach ($obj_ids as $id) {
818  $ref = ilObject::_getAllReferences($id);
819  foreach ($ref as $ref_id) {
820  if ($ilAccess->checkAccess("write", "", $ref_id)) {
821  $clonable = true;
822  }
823  }
824  }
825  }
826  if ($clonable) {
827  $clonable_styles[$style_rec["id"]] =
828  ilObject::_lookupTitle($style_rec["id"]);
829  }
830  }
831 
832  asort($clonable_styles);
833 
834  return $clonable_styles;
835  }
836 
840  public function assignMetaData(&$a_meta_data)
841  {
842  $this->meta_data = $a_meta_data;
843  }
844 
848  public static function _getBasicStyleDom()
849  {
850  if (!is_object(self::$basic_style_dom)) {
851  self::$basic_style_dom = new DOMDocument();
852  self::$basic_style_dom->load(self::$basic_style_file);
853  }
854 
855  return self::$basic_style_dom;
856  }
857 
861  public function &getMetaData()
862  {
863  return $this->meta_data;
864  }
865 
869  public function create($a_from_style = 0, $a_import_mode = false)
870  {
871  $ilDB = $this->db;
872 
873  parent::create();
874 
875  if ($a_from_style == 0) {
876  if (!$a_import_mode) {
877  // copy styles from basic style
878  $this->createFromXMLFile(self::$basic_style_file, true);
879 
880  // copy images from basic style
881  $this->createImagesDirectory();
883  self::$basic_style_image_dir,
884  $this->getImagesDirectory()
885  );
886  } else {
887  // add style_data record
888  $q = "INSERT INTO style_data (id, uptodate, category) VALUES " .
889  "(" . $ilDB->quote($this->getId(), "integer") . ", 0," .
890  $ilDB->quote((int) $this->getScope(), "integer") . ")";
891  $ilDB->manipulate($q);
893  }
894  } else {
895  // get style parameter records
896  $def = array();
897  $q = "SELECT * FROM style_parameter WHERE style_id = " .
898  $ilDB->quote($a_from_style, "integer");
899  $par_set = $ilDB->query($q);
900  while ($par_rec = $ilDB->fetchAssoc($par_set)) {
901  $def[] = array("tag" => $par_rec["tag"], "class" => $par_rec["class"],
902  "parameter" => $par_rec["parameter"], "value" => $par_rec["value"],
903  "type" => $par_rec["type"], "mq_id" => $par_rec["mq_id"], "custom" => $par_rec["custom"]);
904  }
905 
906  // get style characteristics records
907  $chars = array();
908  $q = "SELECT * FROM style_char WHERE style_id = " .
909  $ilDB->quote($a_from_style, "integer");
910  $par_set = $ilDB->query($q);
911  while ($par_rec = $ilDB->fetchAssoc($par_set)) {
912  $chars[] = array("type" => $par_rec["type"], "characteristic" => $par_rec["characteristic"]);
913  }
914 
915 
916  // copy media queries
917  $from_style = new ilObjStyleSheet($a_from_style);
918  $mqs = $from_style->getMediaQueries();
919  $mq_mapping = array();
920  foreach ($mqs as $mq) {
921  $nid = $this->addMediaQuery($mq["mquery"]);
922  $mq_mapping[$mq["id"]] = $nid;
923  }
924 
925  // default style settings
926  foreach ($def as $sty) {
927  $id = $ilDB->nextId("style_parameter");
928  $q = "INSERT INTO style_parameter (id, style_id, tag, class, parameter, value, type, mq_id, custom) VALUES " .
929  "(" .
930  $ilDB->quote($id, "integer") . "," .
931  $ilDB->quote($this->getId(), "integer") . "," .
932  $ilDB->quote($sty["tag"], "text") . "," .
933  $ilDB->quote($sty["class"], "text") . "," .
934  $ilDB->quote($sty["parameter"], "text") . "," .
935  $ilDB->quote($sty["value"], "text") . "," .
936  $ilDB->quote($sty["type"], "text") . "," .
937  $ilDB->quote((int) $mq_mapping[$sty["mq_id"]], "integer") . "," .
938  $ilDB->quote($sty["custom"], "integer") .
939  ")";
940  $ilDB->manipulate($q);
941  }
942 
943  // insert style characteristics
944  foreach ($chars as $char) {
945  $q = "INSERT INTO style_char (style_id, type, characteristic) VALUES " .
946  "(" . $ilDB->quote($this->getId(), "integer") . "," .
947  $ilDB->quote($char["type"], "text") . "," .
948  $ilDB->quote($char["characteristic"], "text") . ")";
949  $ilDB->manipulate($q);
950  }
951 
952  // add style_data record
953  $q = "INSERT INTO style_data (id, uptodate, category) VALUES " .
954  "(" . $ilDB->quote($this->getId(), "integer") . ", 0," .
955  $ilDB->quote((int) $this->getScope(), "integer") . ")";
956  $ilDB->manipulate($q);
957 
958  // copy images
959  $this->createImagesDirectory();
961  $from_style->getImagesDirectory(),
962  $this->getImagesDirectory()
963  );
964 
965  // copy colors
966  $colors = $from_style->getColors();
967  foreach ($colors as $c) {
968  $this->addColor($c["name"], $c["code"]);
969  }
970 
971  // copy templates
973  foreach ($tcts as $tct => $v) {
974  $templates = $from_style->getTemplates($tct);
975  foreach ($templates as $t) {
976  $this->addTemplate($tct, $t["name"], $t["classes"]);
977  }
978  }
979  }
980 
981  $this->read();
982  if (!$a_import_mode) {
983  $this->writeCSSFile();
984  }
985  }
986 
990  public function deleteCharacteristic($a_type, $a_tag, $a_class)
991  {
992  $ilDB = $this->db;
993 
994  // check, if characteristic is not a core style
996  if (empty($core_styles[$a_type . "." . $a_tag . "." . $a_class])) {
997  // delete characteristic record
998  $st = $ilDB->manipulateF(
999  "DELETE FROM style_char WHERE style_id = %s AND type = %s AND characteristic = %s",
1000  array("integer", "text", "text"),
1001  array($this->getId(), $a_type, $a_class)
1002  );
1003 
1004  // delete parameter records
1005  $st = $ilDB->manipulateF(
1006  "DELETE FROM style_parameter WHERE style_id = %s AND tag = %s AND type = %s AND class = %s",
1007  array("integer", "text", "text", "text"),
1008  array($this->getId(), $a_tag, $a_type, $a_class)
1009  );
1010  }
1011 
1012  $this->setUpToDate(false);
1013  $this->_writeUpToDate($this->getId(), false);
1014  }
1015 
1019  public function characteristicExists($a_char, $a_style_type)
1020  {
1021  $ilDB = $this->db;
1022 
1023  $set = $ilDB->queryF(
1024  "SELECT style_id FROM style_char WHERE style_id = %s AND characteristic = %s AND type = %s",
1025  array("integer", "text", "text"),
1026  array($this->getId(), $a_char, $a_style_type)
1027  );
1028  if ($rec = $ilDB->fetchAssoc($set)) {
1029  return true;
1030  }
1031  return false;
1032  }
1033 
1037  public function addCharacteristic($a_type, $a_char, $a_hidden = false)
1038  {
1039  $ilDB = $this->db;
1040 
1041  // delete characteristic record
1042  $ilDB->manipulateF(
1043  "INSERT INTO style_char (style_id, type, characteristic, hide)" .
1044  " VALUES (%s,%s,%s,%s) ",
1045  array("integer", "text", "text", "integer"),
1046  array($this->getId(), $a_type, $a_char, $a_hidden)
1047  );
1048 
1049  $this->setUpToDate(false);
1050  $this->_writeUpToDate($this->getId(), false);
1051  }
1052 
1059  public function copyCharacteristic(
1060  $a_from_style_id,
1061  $a_from_type,
1062  $a_from_char,
1063  $a_to_char
1064  ) {
1065  $ilDB = $this->db;
1066 
1067  if (!$this->characteristicExists($a_to_char, $a_from_type)) {
1068  $this->addCharacteristic($a_from_type, $a_to_char);
1069  }
1070  $this->deleteStyleParOfChar($a_from_type, $a_to_char);
1071 
1072  $from_style = new ilObjStyleSheet($a_from_style_id);
1073 
1074  // todo fix using mq_id
1075  $pars = $from_style->getParametersOfClass($a_from_type, $a_from_char);
1076 
1077  $colors = array();
1078  foreach ($pars as $p => $v) {
1079  if (substr($v, 0, 1) == "!") {
1080  $colors[] = substr($v, 1);
1081  }
1082  $this->replaceStylePar(
1083  ilObjStyleSheet::_determineTag($a_from_type),
1084  $a_to_char,
1085  $p,
1086  $v,
1087  $a_from_type
1088  );
1089  }
1090 
1091  // copy colors
1092  foreach ($colors as $c) {
1093  if (!$this->colorExists($c)) {
1094  $this->addColor($c, $from_style->getColorCodeForName($c));
1095  }
1096  }
1097  }
1098 
1102  public function getCharacteristics($a_type = "", $a_no_hidden = false, $a_include_core = true)
1103  {
1104  $chars = array();
1105 
1106  if ($a_type == "") {
1107  $chars = $this->chars;
1108  }
1109  if (is_array($this->chars_by_type[$a_type])) {
1110  foreach ($this->chars_by_type[$a_type] as $c) {
1111  if ($a_include_core || !self::isCoreStyle($a_type, $c)) {
1112  $chars[] = $c;
1113  }
1114  }
1115  }
1116 
1117  if ($a_no_hidden) {
1118  foreach ($chars as $k => $char) {
1119  if ($a_type == "" && $this->hidden_chars[$char["type"] . ":" . $char["class"]]) {
1120  unset($chars[$k]);
1121  } elseif ($this->hidden_chars[$a_type . ":" . $char]) {
1122  unset($chars[$k]);
1123  }
1124  }
1125  }
1126 
1127  return $chars;
1128  }
1129 
1133  public function setCharacteristics($a_chars)
1134  {
1135  $this->chars = $a_chars;
1136  // $this->chars_by_type[$a_type];
1137  }
1138 
1142  public function saveHideStatus($a_type, $a_char, $a_hide)
1143  {
1144  $ilDB = $this->db;
1145 
1146  $ilDB->manipulate(
1147  "UPDATE style_char SET " .
1148  " hide = " . $ilDB->quote((int) $a_hide, "integer") .
1149  " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1150  " type = " . $ilDB->quote($a_type, "text") . " AND " .
1151  " characteristic = " . $ilDB->quote($a_char, "text")
1152  );
1153  }
1154 
1158  public function getHideStatus($a_type, $a_char)
1159  {
1160  $ilDB = $this->db;
1161 
1162  $set = $ilDB->query(
1163  "SELECT hide FROM style_char " .
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  $rec = $ilDB->fetchAssoc($set);
1169 
1170  return $rec["hide"];
1171  }
1172 
1179  public function ilClone()
1180  {
1181  $lng = $this->lng;
1182 
1183  $lng->loadLanguageModule("style");
1184 
1185  $new_obj = new ilObjStyleSheet();
1186  $new_obj->setTitle($this->getTitle() . " (" . $lng->txt("sty_acopy") . ")");
1187  $new_obj->setType($this->getType());
1188  $new_obj->setDescription($this->getDescription());
1189  $new_obj->create($this->getId());
1190 
1191  $new_obj->writeStyleSetting(
1192  "disable_auto_margins",
1193  $this->lookupStyleSetting("disable_auto_margins")
1194  );
1195 
1196  return $new_obj->getId();
1197  }
1198 
1202  public function copyImagesToDir($a_target)
1203  {
1204  ilUtil::rCopy($this->getImagesDirectory(), $a_target);
1205  }
1206 
1216  public function addParameter($a_tag, $a_par, $a_type, $a_mq_id = 0, $a_custom = false)
1217  {
1218  $ilDB = $this->db;
1219 
1220  $avail_params = $this->getAvailableParameters();
1221  $tag = explode(".", $a_tag);
1222  $value = $avail_params[$a_par][0];
1223  $id = $ilDB->nextId("style_parameter");
1224  $q = "INSERT INTO style_parameter (id,style_id, type, tag, class, parameter, value, mq_id, custom) VALUES " .
1225  "(" .
1226  $ilDB->quote($id, "integer") . "," .
1227  $ilDB->quote($this->getId(), "integer") . "," .
1228  $ilDB->quote($a_type, "text") . "," .
1229  $ilDB->quote($tag[0], "text") . "," .
1230  $ilDB->quote($tag[1], "text") . "," .
1231  $ilDB->quote($a_par, "text") . "," .
1232  $ilDB->quote($value, "text") . "," .
1233  $ilDB->quote($a_mq_id, "integer") . "," .
1234  $ilDB->quote($a_custom, "integer") .
1235  ")";
1236  $ilDB->manipulate($q);
1237  $this->read();
1238  $this->writeCSSFile();
1239  }
1240 
1245  public function createImagesDirectory()
1246  {
1248  }
1249 
1254  public static function _createImagesDirectory($a_style_id)
1255  {
1256  global $DIC;
1257 
1258  $ilErr = $DIC["ilErr"];
1259 
1260  $sty_data_dir = ilUtil::getWebspaceDir() . "/sty";
1261  ilUtil::makeDir($sty_data_dir);
1262  if (!is_writable($sty_data_dir)) {
1263  $ilErr->raiseError("Style data directory (" . $sty_data_dir
1264  . ") not writeable.", $ilErr->FATAL);
1265  }
1266 
1267  $style_dir = $sty_data_dir . "/sty_" . $a_style_id;
1268  ilUtil::makeDir($style_dir);
1269  if (!@is_dir($style_dir)) {
1270  $ilErr->raiseError("Creation of style directory failed (" .
1271  $style_dir . ").", $ilErr->FATAL);
1272  }
1273 
1274  // create images subdirectory
1275  $im_dir = $style_dir . "/images";
1276  ilUtil::makeDir($im_dir);
1277  if (!@is_dir($im_dir)) {
1278  $ilErr->raiseError("Creation of Import Directory failed (" .
1279  $im_dir . ").", $ilErr->FATAL);
1280  }
1281 
1282  // create thumbnails directory
1283  $thumb_dir = $style_dir . "/images/thumbnails";
1284  ilUtil::makeDir($thumb_dir);
1285  if (!@is_dir($thumb_dir)) {
1286  $ilErr->raiseError("Creation of Import Directory failed (" .
1287  $thumb_dir . ").", $ilErr->FATAL);
1288  }
1289  }
1290 
1294  public function getImagesDirectory()
1295  {
1297  }
1298 
1302  public static function _getImagesDirectory($a_style_id)
1303  {
1304  return ilUtil::getWebspaceDir() . "/sty/sty_" . $a_style_id .
1305  "/images";
1306  }
1307 
1311  public function getThumbnailsDirectory()
1312  {
1313  return $this->getImagesDirectory() .
1314  "/thumbnails";
1315  }
1316 
1320  public function getImages()
1321  {
1322  $dir = $this->getImagesDirectory();
1323  $images = array();
1324  if (is_dir($dir)) {
1325  $entries = ilUtil::getDir($dir);
1326  foreach ($entries as $entry) {
1327  if (substr($entry["entry"], 0, 1) == ".") {
1328  continue;
1329  }
1330  if ($entry["type"] != "dir") {
1331  $images[] = $entry;
1332  }
1333  }
1334  }
1335 
1336  return $images;
1337  }
1338 
1342  public function uploadImage($a_file)
1343  {
1344  $this->createImagesDirectory();
1345  @ilUtil::moveUploadedFile(
1346  $a_file["tmp_name"],
1347  $a_file["name"],
1348  $this->getImagesDirectory() . "/" . $a_file["name"]
1349  );
1351  $this->getImagesDirectory() . "/" . $a_file["name"],
1352  $this->getThumbnailsDirectory() . "/" . $a_file["name"],
1353  75,
1354  75
1355  );
1356  }
1357 
1361  public function deleteImage($a_file)
1362  {
1363  if (is_file($this->getImagesDirectory() . "/" . $a_file)) {
1364  unlink($this->getImagesDirectory() . "/" . $a_file);
1365  }
1366  if (is_file($this->getThumbnailsDirectory() . "/" . $a_file)) {
1367  unlink($this->getThumbnailsDirectory() . "/" . $a_file);
1368  }
1369  }
1370 
1376  public function deleteParameter($a_id)
1377  {
1378  $ilDB = $this->db;
1379 
1380  $q = "DELETE FROM style_parameter WHERE id = " .
1381  $ilDB->quote($a_id, "integer");
1382  $ilDB->query($q);
1383  }
1384 
1394  public function deleteStylePar($a_tag, $a_class, $a_par, $a_type, $a_mq_id = 0, $a_custom = false)
1395  {
1396  $ilDB = $this->db;
1397 
1398  $q = "DELETE FROM style_parameter WHERE " .
1399  " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1400  " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1401  " class = " . $ilDB->quote($a_class, "text") . " AND " .
1402  " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1403  " custom = " . $ilDB->quote($a_custom, "integer") . " AND " .
1404  " " . $ilDB->equals("type", $a_type, "text", true) . " AND " .
1405  " parameter = " . $ilDB->quote($a_par, "text");
1406 
1407  $ilDB->manipulate($q);
1408  }
1409 
1419  public function deleteCustomStylePars($a_tag, $a_class, $a_type, $a_mq_id = 0)
1420  {
1421  $ilDB = $this->db;
1422 
1423  $q = "DELETE FROM style_parameter WHERE " .
1424  " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1425  " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1426  " class = " . $ilDB->quote($a_class, "text") . " AND " .
1427  " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1428  " custom = " . $ilDB->quote(1, "integer") . " AND " .
1429  " " . $ilDB->equals("type", $a_type, "text", true);
1430 
1431  $ilDB->manipulate($q);
1432  }
1433 
1442  public function deleteStyleParOfChar($a_type, $a_class)
1443  {
1444  $ilDB = $this->db;
1445 
1446  $q = "DELETE FROM style_parameter WHERE " .
1447  " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
1448  " class = " . $ilDB->quote($a_class, "text") . " AND " .
1449  " " . $ilDB->equals("type", $a_type, "text", true);
1450 
1451  $ilDB->manipulate($q);
1452  }
1453 
1454 
1458  public function delete()
1459  {
1460  $ilDB = $this->db;
1461 
1462  // delete object
1463  parent::delete();
1464 
1465  // check whether this style is global default
1466  $def_style = $this->ilias->getSetting("default_content_style_id");
1467  if ($def_style == $this->getId()) {
1468  $this->ilias->deleteSetting("default_content_style_id");
1469  }
1470 
1471  // check whether this style is global fixed
1472  $fixed_style = $this->ilias->getSetting("fixed_content_style_id");
1473  if ($fixed_style == $this->getId()) {
1474  $this->ilias->deleteSetting("fixed_content_style_id");
1475  }
1476 
1477  // delete style parameter
1478  $q = "DELETE FROM style_parameter WHERE style_id = " .
1479  $ilDB->quote($this->getId(), "integer");
1480  $ilDB->manipulate($q);
1481 
1482  // delete style file
1483  $css_file_name = ilUtil::getWebspaceDir() . "/css/style_" . $this->getId() . ".css";
1484  if (is_file($css_file_name)) {
1485  unlink($css_file_name);
1486  }
1487 
1488  // delete media queries
1489  $ilDB->manipulate(
1490  "DELETE FROM sty_media_query WHERE " .
1491  " style_id = " . $ilDB->quote($this->getId(), "integer")
1492  );
1493 
1494  // delete entries in learning modules
1495  include_once("./Modules/LearningModule/classes/class.ilObjContentObject.php");
1497 
1498  // delete style data record
1499  $q = "DELETE FROM style_data WHERE id = " .
1500  $ilDB->quote($this->getId(), "integer");
1501  $ilDB->manipulate($q);
1502  }
1503 
1504 
1508  public function read()
1509  {
1510  $ilDB = $this->db;
1511 
1512  parent::read();
1513 
1514  $q = "SELECT * FROM style_parameter WHERE style_id = " .
1515  $ilDB->quote($this->getId(), "integer") . " ORDER BY tag, class, type, mq_id ";
1516  $style_set = $ilDB->query($q);
1517  $ctag = "";
1518  $cclass = "";
1519  $ctype = "";
1520  $cmq_id = 0;
1521  $this->style = array();
1522  // workaround for bug #17586, see also http://stackoverflow.com/questions/3066356/multiple-css-classes-properties-overlapping-based-on-the-order-defined
1523  // e.g. ha_iheada must be written after ha_ihead, since they are acting on the same dom node
1524  // styles that must be added at the end
1525  $this->end_styles = array();
1526  while ($style_rec = $ilDB->fetchAssoc($style_set)) {
1527  if ($style_rec["tag"] != $ctag || $style_rec["class"] != $cclass
1528  || $style_rec["type"] != $ctype || $style_rec["mq_id"] != $cmq_id) {
1529  // add current tag array to style array
1530  if (is_array($tag)) {
1531  if (in_array($ctype, array("ha_iheada", "va_iheada"))) {
1532  $this->end_styles[] = $tag;
1533  } else {
1534  $this->style[] = $tag;
1535  }
1536  }
1537  $tag = array();
1538  }
1539  $ctag = $style_rec["tag"];
1540  $cclass = $style_rec["class"];
1541  $ctype = $style_rec["type"];
1542  $cmq_id = $style_rec["mq_id"];
1543  $tag[] = $style_rec;
1544  // added $cmq_id
1545  $this->style_class[$ctype][$cclass][$cmq_id][$style_rec["parameter"]] = $style_rec["value"];
1546  }
1547  if (is_array($tag)) {
1548  $this->style[] = $tag;
1549  }
1550  foreach ($this->end_styles as $s) {
1551  $this->style[] = $s;
1552  }
1553  //var_dump($this->style_class);
1554  $q = "SELECT * FROM style_data WHERE id = " .
1555  $ilDB->quote($this->getId(), "integer");
1556  $res = $ilDB->query($q);
1557  $sty = $ilDB->fetchAssoc($res);
1558  $this->setUpToDate((boolean) $sty["uptodate"]);
1559  $this->setScope($sty["category"]);
1560 
1561  // get style characteristics records
1562  $this->chars = array();
1563  $this->chars_by_type = array();
1564  $q = "SELECT * FROM style_char WHERE style_id = " .
1565  $ilDB->quote($this->getId(), "integer") .
1566  " ORDER BY type ASC, characteristic ASC";
1567  $par_set = $ilDB->query($q);
1568  while ($par_rec = $ilDB->fetchAssoc($par_set)) {
1569  $this->chars[] = array("type" => $par_rec["type"], "class" => $par_rec["characteristic"], "hide" => $par_rec["hide"]);
1570  $this->chars_by_type[$par_rec["type"]][] = $par_rec["characteristic"];
1571  if ($par_rec["hide"]) {
1572  $this->hidden_chars[$par_rec["type"] . ":" . $par_rec["characteristic"]] = true;
1573  }
1574  }
1575  // var_dump($this->style); exit;
1576  }
1577 
1581  public function writeCSSFile($a_target_file = "", $a_image_dir = "")
1582  {
1583  $style = $this->getStyle();
1584 
1585  if ($a_target_file == "") {
1586  $css_file_name = ilUtil::getWebspaceDir() . "/css/style_" . $this->getId() . ".css";
1587  } else {
1588  $css_file_name = $a_target_file;
1589  }
1590  $css_file = fopen($css_file_name, "w");
1591 
1592  $page_background = "";
1593 
1594  $mqs = array(array("mquery" => "", "id" => 0));
1595  foreach ($this->getMediaQueries() as $mq) {
1596  $mqs[] = $mq;
1597  }
1598 
1599  // iterate all media queries
1600  foreach ($mqs as $mq) {
1601  if ($mq["id"] > 0) {
1602  fwrite($css_file, "@media " . $mq["mquery"] . " {\n");
1603  }
1604  reset($style);
1605  foreach ($style as $tag) {
1606  if ($tag[0]["mq_id"] != $mq["id"]) {
1607  continue;
1608  }
1609  fwrite($css_file, $tag[0]["tag"] . ".ilc_" . $tag[0]["type"] . "_" . $tag[0]["class"] . "\n");
1610  // echo "<br>";
1611  // var_dump($tag[0]["type"]);
1612  if ($tag[0]["tag"] == "td") {
1613  fwrite($css_file, ",th" . ".ilc_" . $tag[0]["type"] . "_" . $tag[0]["class"] . "\n");
1614  }
1615  if (in_array($tag[0]["tag"], array("h1", "h2", "h3"))) {
1616  fwrite($css_file, ",div.ilc_text_block_" . $tag[0]["class"] . "\n");
1617  fwrite($css_file, ",body.ilc_text_block_" . $tag[0]["class"] . "\n");
1618  }
1619  if ($tag[0]["type"] == "section") { // sections can use a tags, if links are used
1620  fwrite($css_file, ",a.ilc_" . $tag[0]["type"] . "_" . $tag[0]["class"] . "\n");
1621  }
1622  if ($tag[0]["type"] == "text_block") {
1623  fwrite($css_file, ",body.ilc_text_block_" . $tag[0]["class"] . "\n");
1624  }
1625  fwrite($css_file, "{\n");
1626 
1627  // collect table border attributes
1628  $t_border = array();
1629 
1630  foreach ($tag as $par) {
1631  $cur_par = $par["parameter"];
1632  $cur_val = $par["value"];
1633 
1634  // replace named colors
1635  if (is_int(strpos($cur_par, "color")) && substr(trim($cur_val), 0, 1) == "!") {
1636  $cur_val = $this->getColorCodeForName(substr($cur_val, 1));
1637  }
1638 
1639  if ($tag[0]["type"] == "table" && is_int(strpos($par["parameter"], "border"))) {
1640  $t_border[$cur_par] = $cur_val;
1641  }
1642 
1643  if (in_array($cur_par, array("background-image", "list-style-image"))) {
1644  if (is_int(strpos($cur_val, "/"))) { // external
1645  $cur_val = "url(" . $cur_val . ")";
1646  } else { // internal
1647  if ($a_image_dir == "") {
1648  $cur_val = "url(../sty/sty_" . $this->getId() . "/images/" . $cur_val . ")";
1649  } else {
1650  $cur_val = "url(" . $a_image_dir . "/" . $cur_val . ")";
1651  }
1652  }
1653  }
1654 
1655  if ($cur_par == "opacity") {
1656  $cur_val = ((int) $cur_val) / 100;
1657  }
1658 
1659  fwrite($css_file, "\t" . $cur_par . ": " . $cur_val . ";\n");
1660 
1661  // IE6 fix for minimum height
1662  if ($cur_par == "min-height") {
1663  fwrite($css_file, "\t" . "height" . ": " . "auto !important" . ";\n");
1664  fwrite($css_file, "\t" . "height" . ": " . $cur_val . ";\n");
1665  }
1666 
1667  // opacity fix
1668  if ($cur_par == "opacity") {
1669  fwrite($css_file, "\t" . '-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=' . ($cur_val * 100) . ')"' . ";\n");
1670  fwrite($css_file, "\t" . 'filter: alpha(opacity=' . ($cur_val * 100) . ')' . ";\n");
1671  fwrite($css_file, "\t" . '-moz-opacity: ' . $cur_val . ";\n");
1672  }
1673 
1674  // transform fix
1675  if ($cur_par == "transform") {
1676  fwrite($css_file, "\t" . '-webkit-transform: ' . $cur_val . ";\n");
1677  fwrite($css_file, "\t" . '-moz-transform: ' . $cur_val . ";\n");
1678  fwrite($css_file, "\t" . '-ms-transform: ' . $cur_val . ";\n");
1679  }
1680 
1681  // transform-origin fix
1682  if ($cur_par == "transform-origin") {
1683  fwrite($css_file, "\t" . '-webkit-transform-origin: ' . $cur_val . ";\n");
1684  fwrite($css_file, "\t" . '-moz-transform-origin: ' . $cur_val . ";\n");
1685  fwrite($css_file, "\t" . '-ms-transform-origin: ' . $cur_val . ";\n");
1686  }
1687 
1688  // save page background
1689  if ($tag[0]["tag"] == "div" && $tag[0]["class"] == "Page"
1690  && $cur_par == "background-color") {
1691  $page_background = $cur_val;
1692  }
1693  }
1694  fwrite($css_file, "}\n");
1695  fwrite($css_file, "\n");
1696 
1697  // use table border attributes for th td as well
1698  /* if ($tag[0]["type"] == "table")
1699  {
1700  if (count($t_border) > 0)
1701  {
1702  fwrite ($css_file, $tag[0]["tag"].".ilc_".$tag[0]["type"]."_".$tag[0]["class"]." th,".
1703  $tag[0]["tag"].".ilc_".$tag[0]["type"]."_".$tag[0]["class"]." td\n");
1704  fwrite ($css_file, "{\n");
1705  foreach ($t_border as $p => $v)
1706  {
1707  // fwrite ($css_file, "\t".$p.": ".$v.";\n");
1708  }
1709  fwrite ($css_file, "}\n");
1710  fwrite ($css_file, "\n");
1711  }
1712  }*/
1713  }
1714 
1715  if ($page_background != "") {
1716  fwrite($css_file, "td.ilc_Page\n");
1717  fwrite($css_file, "{\n");
1718  fwrite($css_file, "\t" . "background-color: " . $page_background . ";\n");
1719  fwrite($css_file, "}\n");
1720  }
1721  if ($mq["id"] > 0) {
1722  fwrite($css_file, "}\n");
1723  }
1724  }
1725  fclose($css_file);
1726  // exit;
1727  $this->setUpToDate(true);
1728  $this->_writeUpToDate($this->getId(), true);
1729  }
1730 
1737  public static function getEffectiveContentStyleId($a_style_id, $a_type = "")
1738  {
1739  global $DIC;
1740 
1741  $ilSetting = $DIC->settings();
1742 
1743  // check global fixed content style
1744  $fixed_style = $ilSetting->get("fixed_content_style_id");
1745  if ($fixed_style > 0) {
1746  $a_style_id = $fixed_style;
1747  }
1748 
1749  // check global default style
1750  if ($a_style_id <= 0) {
1751  $a_style_id = $ilSetting->get("default_content_style_id");
1752  }
1753 
1754  if ($a_style_id > 0 && ilObject::_lookupType($a_style_id) == "sty") {
1755  return $a_style_id;
1756  }
1757 
1758  return 0;
1759  }
1760 
1767  public function getParametersOfClass($a_type, $a_class, $a_mq_id = 0)
1768  {
1769  if (is_array($this->style_class[$a_type][$a_class][$a_mq_id])) {
1770  return $this->style_class[$a_type][$a_class][$a_mq_id];
1771  }
1772  return array();
1773  }
1774 
1780  public static function getContentStylePath($a_style_id, $add_random = true)
1781  {
1782  global $DIC;
1783 
1784  $ilSetting = $DIC->settings();
1785 
1786  $random = new \ilRandom();
1787  $rand = $random->int(1, 999999);
1788 
1789 
1790  // check global fixed content style
1791  $fixed_style = $ilSetting->get("fixed_content_style_id");
1792  if ($fixed_style > 0) {
1793  $a_style_id = $fixed_style;
1794  }
1795 
1796  // check global default style
1797  if ($a_style_id <= 0) {
1798  $a_style_id = $ilSetting->get("default_content_style_id");
1799  }
1800 
1801  if ($a_style_id > 0 && ilObject::_exists($a_style_id)) {
1802  // check whether file is up to date
1803  if (!ilObjStyleSheet::_lookupUpToDate($a_style_id)) {
1804  $style = new ilObjStyleSheet($a_style_id);
1805  $style->writeCSSFile();
1806  }
1807 
1808  $path = ilUtil::getWebspaceDir("output") . "/css/style_" . $a_style_id . ".css";
1809  if ($add_random) {
1810  $path .= "?dummy=$rand";
1811  }
1812  require_once('./Services/WebAccessChecker/classes/class.ilWACSignedPath.php');
1814 
1815  return $path;
1816  } else { // todo: work this out
1817  return "./Services/COPage/css/content.css";
1818  }
1819  }
1820 
1826  public static function getContentPrintStyle()
1827  {
1828  return "./Services/COPage/css/print_content.css";
1829  }
1830 
1836  public static function getSyntaxStylePath()
1837  {
1838  return "./Services/COPage/css/syntaxhighlight.css";
1839  }
1840 
1846  public static function getPlaceHolderStylePath()
1847  {
1848  return "./Services/COPage/css/placeholder.css";
1849  }
1850 
1851  public function update()
1852  {
1853  $ilDB = $this->db;
1854 
1855  parent::update();
1856  $this->read(); // this could be done better
1857  $this->writeCSSFile();
1858 
1859  $q = "UPDATE style_data " .
1860  "SET category = " . $ilDB->quote((int) $this->getScope(), "integer") .
1861  " WHERE id = " . $ilDB->quote($this->getId(), "integer");
1862  $ilDB->manipulate($q);
1863  }
1864 
1871  public function updateStyleParameter($a_id, $a_value)
1872  {
1873  $ilDB = $this->db;
1874 
1875  $q = "UPDATE style_parameter SET VALUE = " .
1876  $ilDB->quote($a_value, "text") . " WHERE id = " .
1877  $ilDB->quote($a_id, "integer");
1878  $style_set = $ilDB->manipulate($q);
1879  }
1880 
1885  // todo: search for usages, add mq_id
1886  public function replaceStylePar($a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id = 0, $a_custom = false)
1887  {
1888  ilObjStyleSheet::_replaceStylePar($this->getId(), $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id, $a_custom);
1889  }
1890 
1891  public static function _replaceStylePar($style_id, $a_tag, $a_class, $a_par, $a_val, $a_type, $a_mq_id = 0, $a_custom = false)
1892  {
1893  global $DIC;
1894 
1895  $ilDB = $DIC->database();
1896 
1897  $q = "SELECT * FROM style_parameter WHERE " .
1898  " style_id = " . $ilDB->quote($style_id, "integer") . " AND " .
1899  " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1900  " class = " . $ilDB->quote($a_class, "text") . " AND " .
1901  " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1902  " custom = " . $ilDB->quote($a_custom, "integer") . " AND " .
1903  " " . $ilDB->equals("type", $a_type, "text", true) . " AND " .
1904  " parameter = " . $ilDB->quote($a_par, "text");
1905 
1906  $set = $ilDB->query($q);
1907 
1908  if ($rec = $set->fetchRow()) {
1909  $q = "UPDATE style_parameter SET " .
1910  " value = " . $ilDB->quote($a_val, "text") . " WHERE " .
1911  " style_id = " . $ilDB->quote($style_id, "integer") . " AND " .
1912  " tag = " . $ilDB->quote($a_tag, "text") . " AND " .
1913  " class = " . $ilDB->quote($a_class, "text") . " AND " .
1914  " mq_id = " . $ilDB->quote($a_mq_id, "integer") . " AND " .
1915  " custom = " . $ilDB->quote($a_custom, "integer") . " AND " .
1916  " " . $ilDB->equals("type", $a_type, "text", true) . " AND " .
1917  " parameter = " . $ilDB->quote($a_par, "text");
1918 
1919  $ilDB->manipulate($q);
1920  } else {
1921  $id = $ilDB->nextId("style_parameter");
1922  $q = "INSERT INTO style_parameter (id, value, style_id, tag, class, type, parameter, mq_id, custom) VALUES " .
1923  " (" .
1924  $ilDB->quote($id, "integer") . "," .
1925  $ilDB->quote($a_val, "text") . "," .
1926  " " . $ilDB->quote($style_id, "integer") . "," .
1927  " " . $ilDB->quote($a_tag, "text") . "," .
1928  " " . $ilDB->quote($a_class, "text") . "," .
1929  " " . $ilDB->quote($a_type, "text") . "," .
1930  " " . $ilDB->quote($a_par, "text") . "," .
1931  " " . $ilDB->quote($a_mq_id, "integer") . "," .
1932  " " . $ilDB->quote($a_custom, "integer") .
1933  ")";
1934 
1935  $ilDB->manipulate($q);
1936  }
1937  }
1938 
1939 
1943  public function getStyle()
1944  {
1945  return $this->style;
1946  }
1947 
1951  public function setStyle($a_style)
1952  {
1953  $this->style = $a_style;
1954  }
1955 
1956 
1963  public function handleXmlString($a_str)
1964  {
1965  return str_replace("&", "&amp;", $a_str);
1966  }
1967 
1972  public function getXML()
1973  {
1974  $xml.= "<StyleSheet>\n";
1975 
1976  // title and description
1977  $xml.= "<Title>" . $this->handleXmlString($this->getTitle()) . "</Title>";
1978  $xml.= "<Description>" . $this->handleXmlString($this->getDescription()) . "</Description>\n";
1979 
1980  // style classes
1981  foreach ($this->chars as $char) {
1982  $xml.= "<Style Tag=\"" . ilObjStyleSheet::_determineTag($char["type"]) .
1983  "\" Type=\"" . $char["type"] . "\" Class=\"" . $char["class"] . "\">\n";
1984  foreach ($this->style as $style) {
1985  if ($style[0]["type"] == $char["type"] && $style[0]["class"] == $char["class"]) {
1986  foreach ($style as $tag) {
1987  $xml.="<StyleParameter Name=\"" . $tag["parameter"] . "\" Value=\"" . $tag["value"] . "\" Custom=\"" . $tag["custom"] . "\" />\n";
1988  }
1989  }
1990  }
1991  $xml.= "</Style>\n";
1992  }
1993 
1994  // colors
1995  foreach ($this->getColors() as $color) {
1996  $xml.="<StyleColor Name=\"" . $color["name"] . "\" Code=\"" . $color["code"] . "\"/>\n";
1997  }
1998 
1999  // templates
2001  foreach ($tcts as $tct => $v) {
2002  $ts = $this->getTemplates($tct);
2003 
2004  foreach ($ts as $t) {
2005  $xml.="<StyleTemplate Type=\"" . $tct . "\" Name=\"" . $t["name"] . "\">\n";
2006  foreach ($t["classes"] as $ct => $c) {
2007  if ($c != "") {
2008  $xml.="<StyleTemplateClass ClassType=\"" . $ct . "\" Class=\"" . $c . "\"/>\n";
2009  }
2010  }
2011  $xml.="</StyleTemplate>\n";
2012  }
2013  }
2014 
2015 
2016  $xml.= "</StyleSheet>";
2017  //echo "<pre>".htmlentities($xml)."</pre>"; exit;
2018  return $xml;
2019  }
2020 
2021 
2025  public function createExportDirectory()
2026  {
2027  $sty_data_dir = ilUtil::getDataDir() . "/sty";
2028  ilUtil::makeDir($sty_data_dir);
2029  if (!is_writable($sty_data_dir)) {
2030  $this->ilias->raiseError("Style data directory (" . $sty_data_dir
2031  . ") not writeable.", $this->ilias->error_obj->FATAL);
2032  }
2033 
2034  $style_dir = $sty_data_dir . "/sty_" . $this->getId();
2035  ilUtil::makeDir($style_dir);
2036  if (!@is_dir($style_dir)) {
2037  $this->ilias->raiseError("Creation of style directory failed (" .
2038  $style_dir . ").", $this->ilias->error_obj->FATAL);
2039  }
2040 
2041  // create export subdirectory
2042  $ex_dir = $style_dir . "/export";
2043  ilUtil::makeDir($ex_dir);
2044  if (!@is_dir($ex_dir)) {
2045  $this->ilias->raiseError("Creation of Import Directory failed (" .
2046  $ex_dir . ").", $this->ilias->error_obj->FATAL);
2047  }
2048 
2049  return $ex_dir;
2050  }
2051 
2055  public function cleanExportDirectory()
2056  {
2057  $sty_data_dir = ilUtil::getDataDir() . "/sty";
2058  $style_dir = $sty_data_dir . "/sty_" . $this->getId();
2059  // create export subdirectory
2060  $ex_dir = $style_dir . "/export";
2061 
2062  if (is_dir($ex_dir)) {
2063  ilUtil::delDir($ex_dir, true);
2064  }
2065  }
2066 
2067 
2071  public function createExportSubDirectory()
2072  {
2073  $ex_dir = $this->createExportDirectory();
2074  $ex_sub_dir = $ex_dir . "/" . $this->getExportSubDir();
2075  ilUtil::makeDir($ex_sub_dir);
2076  if (!is_writable($ex_sub_dir)) {
2077  $this->ilias->raiseError("Style data directory (" . $ex_sub_dir
2078  . ") not writeable.", $this->ilias->error_obj->FATAL);
2079  }
2080  $ex_sub_images_dir = $ex_sub_dir . "/images";
2081  ilUtil::makeDir($ex_sub_images_dir);
2082  if (!is_writable($ex_sub_images_dir)) {
2083  $this->ilias->raiseError("Style data directory (" . $ex_sub_images_dir
2084  . ") not writeable.", $this->ilias->error_obj->FATAL);
2085  }
2086  }
2087 
2091  public function setExportSubDir($a_dir)
2092  {
2093  $this->export_sub_dir = $a_dir;
2094  }
2095 
2099  public function getExportSubDir()
2100  {
2101  if ($this->export_sub_dir == "") {
2102  return "sty_" . $this->getId();
2103  } else {
2104  return $this->export_sub_dir;
2105  }
2106  }
2107 
2113  public function export()
2114  {
2115  $this->cleanExportDirectory();
2116  $ex_dir = $this->createExportDirectory();
2117  $this->createExportSubDirectory();
2118  $this->exportXML($ex_dir . "/" . $this->getExportSubDir());
2119  //echo "-".$this->getImagesDirectory()."-".$ex_dir."/".$this->getExportSubDir()."/images"."-";
2120  ilUtil::rCopy(
2121  $this->getImagesDirectory(),
2122  $ex_dir . "/" . $this->getExportSubDir() . "/images"
2123  );
2124  if (is_file($ex_dir . "/" . $this->getExportSubDir() . ".zip")) {
2125  unlink($ex_dir . "/" . $this->getExportSubDir() . ".zip");
2126  }
2127  ilUtil::zip(
2128  $ex_dir . "/" . $this->getExportSubDir(),
2129  $ex_dir . "/" . $this->getExportSubDir() . ".zip"
2130  );
2131 
2132  return $ex_dir . "/" . $this->getExportSubDir() . ".zip";
2133  }
2134 
2138  public function exportXML($a_dir)
2139  {
2140  $file = $a_dir . "/style.xml";
2141 
2142  // open file
2143  if (!($fp = @fopen($file, "w"))) {
2144  die("<b>Error</b>: Could not open \"" . $file . "\" for writing" .
2145  " in <b>" . __FILE__ . "</b> on line <b>" . __LINE__ . "</b><br />");
2146  }
2147 
2148  // set file permissions
2149  chmod($file, 0770);
2150 
2151  // write xml data into the file
2152  fwrite($fp, $this->getXML());
2153 
2154  // close file
2155  fclose($fp);
2156  }
2157 
2161  public function createImportDirectory()
2162  {
2163  $sty_data_dir = ilUtil::getDataDir() . "/sty";
2164  ilUtil::makeDir($sty_data_dir);
2165  if (!is_writable($sty_data_dir)) {
2166  $this->ilias->raiseError("Style data directory (" . $sty_data_dir
2167  . ") not writeable.", $this->ilias->error_obj->FATAL);
2168  }
2169 
2170  $style_dir = $sty_data_dir . "/sty_" . $this->getId();
2171  ilUtil::makeDir($style_dir);
2172  if (!@is_dir($style_dir)) {
2173  $this->ilias->raiseError("Creation of style directory failed (" .
2174  $style_dir . ").", $this->ilias->error_obj->FATAL);
2175  }
2176 
2177  // create import subdirectory
2178  $im_dir = $style_dir . "/import";
2179  ilUtil::makeDir($im_dir);
2180  if (!@is_dir($im_dir)) {
2181  $this->ilias->raiseError("Creation of Import Directory failed (" .
2182  $im_dir . ").", $this->ilias->error_obj->FATAL);
2183  }
2184 
2185  return $im_dir;
2186  }
2187 
2191  public function import($a_file)
2192  {
2193  parent::create();
2194 
2195  $im_dir = $this->createImportDirectory();
2196 
2197  // handle uploaded files
2198  if (is_array($a_file)) {
2199  ilUtil::moveUploadedFile(
2200  $a_file["tmp_name"],
2201  $a_file["name"],
2202  $im_dir . "/" . $a_file["name"]
2203  );
2204  $file_name = $a_file["name"];
2205  } else { // handle not directly uploaded files
2206  $pi = pathinfo($a_file);
2207  $file_name = $pi["basename"];
2208  copy($a_file, $im_dir . "/" . $file_name);
2209  }
2210  $file = pathinfo($file_name);
2211 
2212  // unzip file
2213  if (strtolower($file["extension"] == "zip")) {
2214  ilUtil::unzip($im_dir . "/" . $file_name);
2215  $subdir = basename($file["basename"], "." . $file["extension"]);
2216  if (!is_dir($im_dir . "/" . $subdir)) {
2217  $subdir = "style"; // check style subdir
2218  }
2219  $xml_file = $im_dir . "/" . $subdir . "/style.xml";
2220  } else { // handle xml file directly (old style)
2221  $xml_file = $im_dir . "/" . $file_name;
2222  }
2223 
2224  // load information from xml file
2225  //echo "-$xml_file-";
2226  $this->createFromXMLFile($xml_file, true);
2227 
2228  // copy images
2229  $this->createImagesDirectory();
2230  if (is_dir($im_dir . "/" . $subdir . "/images")) {
2231  ilUtil::rCopy(
2232  $im_dir . "/" . $subdir . "/images",
2233  $this->getImagesDirectory()
2234  );
2235  }
2236 
2238  $this->read();
2239  $this->writeCSSFile();
2240  }
2241 
2246  public function createFromXMLFile($a_file, $a_skip_parent_create = false)
2247  {
2248  $ilDB = $this->db;
2249 
2250  $this->is_3_10_skin = false;
2251 
2252  if (!$a_skip_parent_create) {
2253  parent::create();
2254  }
2255  include_once("./Services/Style/Content/classes/class.ilStyleImportParser.php");
2256  $importParser = new ilStyleImportParser($a_file, $this);
2257  $importParser->startParsing();
2258 
2259  // store style parameter
2260  foreach ($this->style as $style) {
2261  foreach ($style as $tag) {
2262  $id = $ilDB->nextId("style_parameter");
2263 
2264  // migrate old table PageFrame/PageContainer to div
2265  if (in_array($tag["class"], array("PageFrame", "PageContainer")) &&
2266  $tag["tag"] == "table") {
2267  $tag["tag"] = "div";
2268  if ($tag["parameter"] == "width" && $tag["value"] == "100%") {
2269  continue;
2270  }
2271  }
2272 
2273  $q = "INSERT INTO style_parameter (id,style_id, tag, class, parameter, type, value, custom) VALUES " .
2274  "(" .
2275  $ilDB->quote($id, "integer") . "," .
2276  $ilDB->quote($this->getId(), "integer") . "," .
2277  $ilDB->quote($tag["tag"], "text") . "," .
2278  $ilDB->quote($tag["class"], "text") . "," .
2279  $ilDB->quote($tag["parameter"], "text") . "," .
2280  $ilDB->quote($tag["type"], "text") . "," .
2281  $ilDB->quote($tag["value"], "text") . "," .
2282  $ilDB->quote((bool) $tag["custom"], "integer") .
2283  ")";
2284  $ilDB->manipulate($q);
2285  }
2286  }
2287 
2288  // store characteristics
2289  $this->is_3_10_skin = true;
2290  if (is_array($this->chars)) {
2291  foreach ($this->chars as $char) {
2292  if ($char["type"] != "") {
2293  $s = substr($char["class"], strlen($char["class"]) - 6);
2294  if ($s != ":hover") {
2295  $ilDB->replace(
2296  "style_char",
2297  array(
2298  "style_id" => array("integer", $this->getId()),
2299  "type" => array("text", $char["type"]),
2300  "characteristic" => array("text", $char["class"])),
2301  array("hide" => array("integer", 0))
2302  );
2303  /*
2304  $q = "INSERT INTO style_char (style_id, type, characteristic) VALUES ".
2305  "(".$ilDB->quote($this->getId(), "integer").",".
2306  $ilDB->quote($char["type"], "text").",".
2307  $ilDB->quote($char["class"], "text").")";
2308  $ilDB->manipulate($q);*/
2309  $this->is_3_10_skin = false;
2310  }
2311  }
2312  }
2313  }
2314 
2315  // add style_data record
2316  $q = "INSERT INTO style_data (id, uptodate) VALUES " .
2317  "(" . $ilDB->quote($this->getId(), "integer") . ", 0)";
2318  $ilDB->manipulate($q);
2319 
2320  $this->update();
2321  $this->read();
2322 
2323  if ($this->is_3_10_skin) {
2324  $this->do_3_10_Migration();
2325  }
2326  //$this->writeCSSFile();
2327  }
2328 
2332  public function getStyleParameterGroups()
2333  {
2334  $groups = array();
2335 
2336  foreach (self::$parameter as $parameter => $props) {
2337  $groups[$props["group"]][] = $parameter;
2338  }
2339  return $groups;
2340  }
2341 
2342  public static function _getStyleParameterInputType($par)
2343  {
2344  $input = self::$parameter[$par]["input"];
2345  return $input;
2346  }
2347 
2348  public static function _getStyleParameterSubPar($par)
2349  {
2350  $subpar = self::$parameter[$par]["subpar"];
2351  return $subpar;
2352  }
2353 
2354  public static function _getStyleParameters($a_tag = "")
2355  {
2356  if ($a_tag == "") {
2357  return self::$parameter;
2358  }
2359  $par = array();
2360  foreach (self::$parameter as $k => $v) {
2361  if (is_array(self::$filtered_groups[$v["group"]]) &&
2362  !in_array($a_tag, self::$filtered_groups[$v["group"]])) {
2363  continue;
2364  }
2365  $par[$k] = $v;
2366  }
2367  return $par;
2368  }
2369 
2370  public static function _getFilteredGroups()
2371  {
2372  return self::$filtered_groups;
2373  }
2374 
2375  public static function _getStyleParameterNumericUnits($a_no_percentage = false)
2376  {
2377  if ($a_no_percentage) {
2378  return self::$num_unit_no_perc;
2379  }
2380  return self::$num_unit;
2381  }
2382 
2383  public static function _getStyleParameterValues($par)
2384  {
2385  return self::$parameter[$par]["values"];
2386  }
2387 
2388  /*static function _getStyleTypes()
2389  {
2390  return self::$style_types;
2391  }*/
2392 
2393  public static function _getStyleSuperTypes()
2394  {
2395  return self::$style_super_types;
2396  }
2397 
2398  public static function _isExpandable($a_type)
2399  {
2400  return in_array($a_type, self::$expandable_types);
2401  }
2402 
2403  public static function _isHideable($a_type)
2404  {
2405  return in_array($a_type, self::$hideable_types);
2406  }
2407 
2408  public static function _getStyleSuperTypeForType($a_type)
2409  {
2410  foreach (self::$style_super_types as $s => $t) {
2411  if (in_array($a_type, $t)) {
2412  return $s;
2413  }
2414  if ($a_type == $s) {
2415  return $s;
2416  }
2417  }
2418  }
2419 
2423  public static function _getCoreStyles()
2424  {
2425  $c_styles = array();
2426  foreach (self::$core_styles as $cstyle) {
2427  $c_styles[$cstyle["type"] . "." . ilObjStyleSheet::_determineTag($cstyle["type"]) . "." . $cstyle["class"]]
2428  = array("type" => $cstyle["type"],
2429  "tag" => ilObjStyleSheet::_determineTag($cstyle["type"]),
2430  "class" => $cstyle["class"]);
2431  }
2432  return $c_styles;
2433  }
2434 
2441  public static function isCoreStyle($a_type, $a_class)
2442  {
2443  foreach (self::$core_styles as $s) {
2444  if ($s["type"] == $a_type && $s["class"] == $a_class) {
2445  return true;
2446  }
2447  }
2448  return false;
2449  }
2450 
2451 
2455  public static function _getTemplateClassTypes($a_template_type = "")
2456  {
2457  if ($a_template_type == "") {
2458  return self::$templates;
2459  }
2460 
2461  return self::$templates[$a_template_type];
2462  }
2463 
2464 
2465  public static function _getPseudoClasses($tag)
2466  {
2467  return self::$pseudo_classes[$tag];
2468  }
2469 
2471  {
2472  return self::$templates[$t][$k];
2473  }
2474 
2475  public static function _determineTag($a_type)
2476  {
2477  return self::$assigned_tags[$a_type];
2478  }
2479 
2483  public static function getAvailableParameters()
2484  {
2485  $pars = array();
2486  foreach (self::$parameter as $p => $v) {
2487  $pars[$p] = $v["values"];
2488  }
2489 
2490  return $pars;
2491  }
2492 
2493 
2497  public static function _addMissingStyleClassesToStyle($a_id)
2498  {
2499  $styles = array(array("id" => $a_id));
2501  }
2502 
2507  public static function _addMissingStyleClassesToAllStyles($a_styles = "")
2508  {
2509  global $DIC;
2510 
2511  $ilDB = $DIC->database();
2512 
2513  if ($a_styles == "") {
2515  } else {
2516  $styles = $a_styles;
2517  }
2520 
2521  // get all core image files
2522  $core_images = array();
2523  $core_dir = self::$basic_style_image_dir;
2524  if (is_dir($core_dir)) {
2525  $dir = opendir($core_dir);
2526  while ($file = readdir($dir)) {
2527  if (substr($file, 0, 1) != "." && is_file($core_dir . "/" . $file)) {
2528  $core_images[] = $file;
2529  }
2530  }
2531  }
2532 
2533  foreach ($styles as $style) {
2534  $id = $style["id"];
2535 
2536  foreach ($core_styles as $cs) {
2537  // check, whether core style class exists
2538  $set = $ilDB->queryF(
2539  "SELECT * FROM style_char WHERE style_id = %s " .
2540  "AND type = %s AND characteristic = %s",
2541  array("integer", "text", "text"),
2542  array($id, $cs["type"], $cs["class"])
2543  );
2544 
2545  // if not, add core style class
2546  if (!($rec = $ilDB->fetchAssoc($set))) {
2547  $ilDB->manipulateF(
2548  "INSERT INTO style_char (style_id, type, characteristic) " .
2549  " VALUES (%s,%s,%s) ",
2550  array("integer", "text", "text"),
2551  array($id, $cs["type"], $cs["class"])
2552  );
2553 
2554  $xpath = new DOMXPath($bdom);
2555  $par_nodes = $xpath->query("/StyleSheet/Style[@Tag = '" . $cs["tag"] . "' and @Type='" .
2556  $cs["type"] . "' and @Class='" . $cs["class"] . "']/StyleParameter");
2557  foreach ($par_nodes as $par_node) {
2558  // check whether style parameter exists
2559  $set = $ilDB->queryF(
2560  "SELECT * FROM style_parameter WHERE style_id = %s " .
2561  "AND type = %s AND class = %s AND tag = %s AND parameter = %s",
2562  array("integer", "text", "text", "text", "text"),
2563  array($id, $cs["type"], $cs["class"],
2564  $cs["tag"], $par_node->getAttribute("Name"))
2565  );
2566 
2567  // if not, create style parameter
2568  if (!($rec = $ilDB->fetchAssoc($set))) {
2569  $spid = $ilDB->nextId("style_parameter");
2570  $st = $ilDB->manipulateF(
2571  "INSERT INTO style_parameter (id, style_id, type, class, tag, parameter, value) " .
2572  " VALUES (%s,%s,%s,%s,%s,%s,%s)",
2573  array("integer", "integer", "text", "text", "text", "text", "text"),
2574  array($spid, $id, $cs["type"], $cs["class"], $cs["tag"],
2575  $par_node->getAttribute("Name"), $par_node->getAttribute("Value"))
2576  );
2577  }
2578  }
2579  }
2580  }
2581 
2582  // now check, whether some core image files are missing
2585  reset($core_images);
2586  foreach ($core_images as $cim) {
2587  if (!is_file($imdir . "/" . $cim)) {
2588  copy($core_dir . "/" . $cim, $imdir . "/" . $cim);
2589  }
2590  }
2591  }
2592  }
2593 
2594  //
2595  // Color management
2596  //
2597 
2601  public function do_3_10_Migration()
2602  {
2603  $ilDB = $this->db;
2604 
2605  $this->do_3_9_Migration($this->getId());
2606 
2607  //include_once("./Services/Migration/DBUpdate_1385/classes/class.ilStyleMigration.php");
2608  //ilStyleMigration::addMissingStyleCharacteristics($this->getId());
2609 
2610  $this->do_3_10_CharMigration($this->getId());
2611 
2612  // style_char: type for characteristic
2613  $st = $ilDB->prepareManip("UPDATE style_char SET type = ? WHERE characteristic = ?" .
2614  " AND style_id = ? ", array("text", "text", "integer"));
2615  $ilDB->execute($st, array("media_cont", "Media", $this->getId()));
2616  $ilDB->execute($st, array("media_caption", "MediaCaption", $this->getId()));
2617  $ilDB->execute($st, array("page_fn", "Footnote", $this->getId()));
2618  $ilDB->execute($st, array("page_nav", "LMNavigation", $this->getId()));
2619  $ilDB->execute($st, array("page_title", "PageTitle", $this->getId()));
2620  $ilDB->execute($st, array("page_cont", "Page", $this->getId()));
2621 
2622  // style_parameter: type for class
2623  $st = $ilDB->prepareManip("UPDATE style_parameter SET type = ? WHERE class = ?" .
2624  " AND style_id = ? ", array("text", "text", "integer"));
2625  $ilDB->execute($st, array("media_cont", "Media", $this->getId()));
2626  $ilDB->execute($st, array("media_caption", "MediaCaption", $this->getId()));
2627  $ilDB->execute($st, array("page_fn", "Footnote", $this->getId()));
2628  $ilDB->execute($st, array("page_nav", "LMNavigation", $this->getId()));
2629  $ilDB->execute($st, array("page_title", "PageTitle", $this->getId()));
2630  $ilDB->execute($st, array("table", "Page", $this->getId()));
2631 
2632  $st = $ilDB->prepareManip("UPDATE style_parameter SET tag = ? WHERE class = ?" .
2633  " AND style_id = ? ", array("text", "text", "integer"));
2634  $ilDB->execute($st, array("div", "MediaCaption", $this->getId()));
2635 
2636  // style_char: characteristic for characteristic
2637  $st = $ilDB->prepareManip("UPDATE style_char SET characteristic = ? WHERE characteristic = ?" .
2638  " AND style_id = ? ", array("text", "text", "integer"));
2639  $ilDB->execute($st, array("MediaContainer", "Media", $this->getId()));
2640  $ilDB->execute($st, array("PageContainer", "Page", $this->getId()));
2641 
2642  // style_parameter: class for class
2643  $st = $ilDB->prepareManip("UPDATE style_parameter SET class = ? WHERE class = ?" .
2644  " AND style_id = ? ", array("text", "text", "integer"));
2645  $ilDB->execute($st, array("MediaContainer", "Media", $this->getId()));
2646  $ilDB->execute($st, array("PageContainer", "Page", $this->getId()));
2647 
2648  // force rewriting of container style
2649  $st = $ilDB->prepareManip("DELETE FROM style_char WHERE type = ?" .
2650  " AND style_id = ? ", array("text", "integer"));
2651  $ilDB->execute($st, array("page_cont", $this->getId()));
2652  $st = $ilDB->prepareManip("DELETE FROM style_parameter WHERE type = ?" .
2653  " AND style_id = ? ", array("text", "integer"));
2654  $ilDB->execute($st, array("page_cont", $this->getId()));
2655  }
2656 
2663  public function do_3_10_CharMigration($a_id = "")
2664  {
2665  $ilDB = $this->db;
2666 
2667  $add_str = "";
2668  if ($a_id != "") {
2669  $add_str = " AND style_id = " . $ilDB->quote($a_id, "integer");
2670  }
2671 
2672  $set = $ilDB->query($q = "SELECT DISTINCT style_id, tag, class FROM style_parameter WHERE " .
2673  $ilDB->equals("type", "", "text", true) . " " . $add_str);
2674 
2675  while ($rec = $ilDB->fetchAssoc($set)) {
2676  // derive types from tag
2677  $types = array();
2678  switch ($rec["tag"]) {
2679  case "div":
2680  case "p":
2681  if (in_array($rec["class"], array("Headline3", "Headline1",
2682  "Headline2", "TableContent", "List", "Standard", "Remark",
2683  "Additional", "Mnemonic", "Citation", "Example"))) {
2684  $types[] = "text_block";
2685  }
2686  if (in_array($rec["class"], array("Block", "Remark",
2687  "Additional", "Mnemonic", "Example", "Excursus", "Special"))) {
2688  $types[] = "section";
2689  }
2690  if (in_array($rec["class"], array("Page", "Footnote", "PageTitle", "LMNavigation"))) {
2691  $types[] = "page";
2692  }
2693  break;
2694 
2695  case "td":
2696  $types[] = "table_cell";
2697  break;
2698 
2699  case "a":
2700  if (in_array($rec["class"], array("ExtLink", "IntLink", "FootnoteLink"))) {
2701  $types[] = "link";
2702  }
2703  break;
2704 
2705  case "span":
2706  $types[] = "text_inline";
2707  break;
2708 
2709  case "table":
2710  $types[] = "table";
2711  break;
2712  }
2713 
2714  // check if style_char set exists
2715  foreach ($types as $t) {
2716  // check if second type already exists
2717  $set4 = $ilDB->queryF(
2718  "SELECT * FROM style_char " .
2719  " WHERE style_id = %s AND type = %s AND characteristic = %s",
2720  array("integer", "text", "text"),
2721  array($rec["style_id"], $t, $rec["class"])
2722  );
2723  if ($rec4 = $ilDB->fetchAssoc($set4)) {
2724  // ok
2725  } else {
2726  //echo "<br>1-".$rec["style_id"]."-".$t."-".$rec["class"]."-";
2727  $ilDB->manipulateF(
2728  "INSERT INTO style_char " .
2729  " (style_id, type, characteristic) VALUES " .
2730  " (%s,%s,%s) ",
2731  array("integer", "text", "text"),
2732  array($rec["style_id"], $t, $rec["class"])
2733  );
2734  }
2735  }
2736 
2737  // update types
2738  if ($rec["type"] == "") {
2739  if (count($types) > 0) {
2740  $ilDB->manipulateF(
2741  "UPDATE style_parameter SET type = %s " .
2742  " WHERE style_id = %s AND class = %s AND " . $ilDB->equals("type", "", "text", true),
2743  array("text", "integer", "text"),
2744  array($types[0], $rec["style_id"], $rec["class"])
2745  );
2746  //echo "<br>3-".$types[0]."-".$rec["style_id"]."-".$rec["class"]."-";
2747 
2748  // links extra handling
2749  if ($types[0] == "link") {
2750  $ilDB->manipulateF(
2751  "UPDATE style_parameter SET type = %s " .
2752  " WHERE style_id = %s AND (class = %s OR class = %s) AND " . $ilDB->equals("type", "", "text", true),
2753  array("text", "integer", "text", "text"),
2754  array($types[0], $rec["style_id"], $rec["class"] . ":visited",
2755  $rec["class"] . ":hover")
2756  );
2757  }
2758  }
2759 
2760  if (count($types) == 2) {
2761  // select all records of first type and add second type
2762  // records if necessary.
2763  $set2 = $ilDB->queryF(
2764  "SELECT * FROM style_parameter " .
2765  " WHERE style_id = %s AND class = %s AND type = %s",
2766  array("integer", "text", "text"),
2767  array($rec["style_id"], $rec["class"], $types[0])
2768  );
2769  while ($rec2 = $ilDB->fetchAssoc($set2)) {
2770  // check if second type already exists
2771  $set3 = $ilDB->queryF(
2772  "SELECT * FROM style_parameter " .
2773  " WHERE style_id = %s AND tag = %s AND class = %s AND type = %s AND parameter = %s",
2774  array("integer", "text", "text", "text", "text"),
2775  array($rec["style_id"], $rec["tag"], $rec["class"], $types[1], $rec["parameter"])
2776  );
2777  if ($rec3 = $ilDB->fetchAssoc($set3)) {
2778  // ok
2779  } else {
2780  $nid = $ilDB->nextId("style_parameter");
2781  $ilDB->manipulateF(
2782  "INSERT INTO style_parameter " .
2783  " (id, style_id, tag, class, parameter, value, type) VALUES " .
2784  " (%s, %s,%s,%s,%s,%s,%s) ",
2785  array("integer", "integer", "text", "text", "text", "text", "text"),
2786  array($nid, $rec2["style_id"], $rec2["tag"], $rec2["class"],
2787  $rec2["parameter"], $rec2["value"], $types[1])
2788  );
2789  }
2790  }
2791  }
2792  }
2793  }
2794  }
2795 
2799  public function do_3_9_Migration($a_id)
2800  {
2801  $ilDB = $this->db;
2802 
2803  $classes = array("Example", "Additional", "Citation", "Mnemonic", "Remark");
2804  $pars = array("margin-top", "margin-bottom");
2805 
2806  foreach ($classes as $curr_class) {
2807  foreach ($pars as $curr_par) {
2808  $res2 = $ilDB->queryF(
2809  "SELECT id FROM style_parameter WHERE style_id = %s" .
2810  " AND tag = %s AND class= %s AND parameter = %s",
2811  array("integer", "text", "text", "text"),
2812  array($a_id, "p", $curr_class, $curr_par)
2813  );
2814  if ($row2 = $ilDB->fetchAssoc($res2)) {
2815  $ilDB->manipulateF(
2816  "UPDATE style_parameter SET value= %s WHERE id = %s",
2817  array("text", "integer"),
2818  array("10px", $row2["id"])
2819  );
2820  } else {
2821  $nid = $ilDB->nextId("style_parameter");
2822  $ilDB->manipulateF(
2823  "INSERT INTO style_parameter " .
2824  "(id, style_id, tag, class, parameter,value) VALUES (%s,%s,%s,%s,%s,%s)",
2825  array("integer", "integer", "text", "text", "text", "text"),
2826  array($nid, $a_id, "div", $curr_class, $curr_par, "10px")
2827  );
2828  }
2829  }
2830  }
2831 
2832  $ilDB->manipulateF(
2833  "UPDATE style_parameter SET tag = %s WHERE tag = %s and style_id = %s",
2834  array("text", "text", "integer"),
2835  array("div", "p", $a_id)
2836  );
2837  }
2838 
2842 
2846  public function getColors()
2847  {
2848  $ilDB = $this->db;
2849 
2850  $set = $ilDB->query("SELECT * FROM style_color WHERE " .
2851  "style_id = " . $ilDB->quote($this->getId(), "integer") . " " .
2852  "ORDER BY color_name");
2853 
2854  $colors = array();
2855  while ($rec = $ilDB->fetchAssoc($set)) {
2856  $colors[] = array(
2857  "name" => $rec["color_name"],
2858  "code" => $rec["color_code"]
2859  );
2860  }
2861 
2862  return $colors;
2863  }
2864 
2868  public function addColor($a_name, $a_code)
2869  {
2870  $ilDB = $this->db;
2871 
2872  $ilDB->manipulate("INSERT INTO style_color (style_id, color_name, color_code)" .
2873  " VALUES (" .
2874  $ilDB->quote($this->getId(), "integer") . "," .
2875  $ilDB->quote($a_name, "text") . "," .
2876  $ilDB->quote($a_code, "text") .
2877  ")");
2878  }
2879 
2883  public function updateColor($a_name, $a_new_name, $a_code)
2884  {
2885  $ilDB = $this->db;
2886 
2887  // todo: update names in parameters as well
2888 
2889  $ilDB->manipulate("UPDATE style_color SET " .
2890  "color_name = " . $ilDB->quote($a_new_name, "text") . ", " .
2891  "color_code = " . $ilDB->quote($a_code, "text") .
2892  " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") .
2893  " AND color_name = " . $ilDB->quote($a_name, "text"));
2894  ilObjStyleSheet::_writeUpToDate($this->getId(), false);
2895 
2896  // rename also the name in the style parameter values
2897  if ($a_name != $a_new_name) {
2898  $set = $ilDB->query("SELECT * FROM style_parameter " .
2899  " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") .
2900  " AND (" .
2901  " parameter = " . $ilDB->quote("background-color", "text") . " OR " .
2902  " parameter = " . $ilDB->quote("color", "text") . " OR " .
2903  " parameter = " . $ilDB->quote("border-color", "text") . " OR " .
2904  " parameter = " . $ilDB->quote("border-top-color", "text") . " OR " .
2905  " parameter = " . $ilDB->quote("border-bottom-color", "text") . " OR " .
2906  " parameter = " . $ilDB->quote("border-left-color", "text") . " OR " .
2907  " parameter = " . $ilDB->quote("border-right-color", "text") .
2908  ")");
2909  while ($rec = $ilDB->fetchAssoc($set)) {
2910  if ($rec["value"] == "!" . $a_name ||
2911  is_int(strpos($rec["value"], "!" . $a_name . "("))) {
2912  // parameter is based on color -> rename it
2913  $this->replaceStylePar(
2914  $rec["tag"],
2915  $rec["class"],
2916  $rec["parameter"],
2917  str_replace($a_name, $a_new_name, $rec["value"]),
2918  $rec["type"],
2919  $rec["mq_id"],
2920  $rec["custom"]
2921  );
2922  }
2923  }
2924  }
2925  }
2926 
2930  public function removeColor($a_name)
2931  {
2932  $ilDB = $this->db;
2933 
2934  $ilDB->manipulate("DELETE FROM style_color WHERE " .
2935  " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
2936  " color_name = " . $ilDB->quote($a_name, "text"));
2937  }
2938 
2942  public function colorExists($a_color_name)
2943  {
2944  $ilDB = $this->db;
2945 
2946  $set = $ilDB->query("SELECT * FROM style_color WHERE " .
2947  "style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
2948  "color_name = " . $ilDB->quote($a_color_name, "text"));
2949  if ($rec = $ilDB->fetchAssoc($set)) {
2950  return true;
2951  }
2952  return false;
2953  }
2954 
2958  public function getColorCodeForName($a_name)
2959  {
2960  $ilDB = $this->db;
2961 
2962  $pos = strpos($a_name, "(");
2963  if ($pos > 0) {
2964  $a_i = substr($a_name, $pos + 1);
2965  $a_i = str_replace(")", "", $a_i);
2966  $a_name = substr($a_name, 0, $pos);
2967  }
2968 
2969  $set = $ilDB->query("SELECT color_code FROM style_color WHERE " .
2970  " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
2971  " color_name = " . $ilDB->quote($a_name, "text"));
2972  if ($rec = $ilDB->fetchAssoc($set)) {
2973  if ($a_i == "") {
2974  return "#" . $rec["color_code"];
2975  } else {
2976  return "#" . ilObjStyleSheet::_getColorFlavor(
2977  $rec["color_code"],
2978  (int) $a_i
2979  );
2980  }
2981  }
2982  }
2983 
2987  public static function _getColorFlavor($a_rgb, $a_i)
2988  {
2989  $rgb = ilObjStyleSheet::_explodeRGB($a_rgb, true);
2990  $hls = ilObjStyleSheet::_RGBToHLS($rgb);
2991 
2992  if ($a_i > 0) {
2993  $hls["l"] = $hls["l"] + ((255 - $hls["l"]) * ($a_i / 100));
2994  }
2995  if ($a_i < 0) {
2996  $hls["l"] = $hls["l"] - (($hls["l"]) * (-$a_i / 100));
2997  }
2998 
2999  $rgb = ilObjStyleSheet::_HLSToRGB($hls);
3000 
3001  foreach ($rgb as $k => $v) {
3002  $rgb[$k] = str_pad(dechex($v), 2, "0", STR_PAD_LEFT);
3003  }
3004 
3005  return $rgb["r"] . $rgb["g"] . $rgb["b"];
3006  }
3007 
3011  public static function _explodeRGB($a_rgb, $as_dec = false)
3012  {
3013  $r["r"] = substr($a_rgb, 0, 2);
3014  $r["g"] = substr($a_rgb, 2, 2);
3015  $r["b"] = substr($a_rgb, 4, 2);
3016 
3017  if ($as_dec) {
3018  $r["r"] = (int) hexdec($r["r"]);
3019  $r["g"] = (int) hexdec($r["g"]);
3020  $r["b"] = (int) hexdec($r["b"]);
3021  }
3022 
3023  return $r;
3024  }
3025 
3029  public static function _RGBToHLS($a_rgb)
3030  {
3031  $r = $a_rgb["r"] / 255;
3032  $g = $a_rgb["g"] / 255;
3033  $b = $a_rgb["b"] / 255;
3034 
3035  // max / min
3036  $max = max($r, $g, $b);
3037  $min = min($r, $g, $b);
3038 
3039  //lightness
3040  $l = ($max + $min) / 2;
3041 
3042  if ($max == $min) {
3043  $s = 0;
3044  $h = 0;
3045  } else {
3046  if ($l < 0.5) {
3047  $s = ($max - $min) / ($max + $min);
3048  } else {
3049  $s = ($max - $min) / (2.0 - $max - $min);
3050  }
3051 
3052  if ($r == $max) {
3053  $h = ($g - $b) / ($max - $min);
3054  } elseif ($g == $max) {
3055  $h = 2.0 + ($b - $r) / ($max - $min);
3056  } elseif ($b == $max) {
3057  $h = 4.0 + ($r - $g) / ($max - $min);
3058  }
3059  }
3060 
3061  $hls["h"] = round(($h / 6) * 255);
3062  $hls["l"] = round($l * 255);
3063  $hls["s"] = round($s * 255);
3064 
3065  return $hls;
3066  }
3067 
3071  public static function _HLSToRGB($a_hls)
3072  {
3073  $h = $a_hls["h"] / 255;
3074  $l = $a_hls["l"] / 255;
3075  $s = $a_hls["s"] / 255;
3076 
3077  $rgb["r"] = $rgb["g"] = $rgb["b"] = 0;
3078 
3079  // If S=0, define R, G, and B all to L
3080  if ($s == 0) {
3081  $rgb["r"] = $rgb["g"] = $rgb["b"] = $l;
3082  } else {
3083  if ($l < 0.5) {
3084  $temp2 = $l * (1.0 + $s);
3085  } else {
3086  $temp2 = $l + $s - $l * $s;
3087  }
3088 
3089  $temp1 = 2.0 * $l - $temp2;
3090 
3091 
3092  # For each of R, G, B, compute another temporary value, temp3, as follows:
3093  foreach ($rgb as $k => $v) {
3094  switch ($k) {
3095  case "r":
3096  $temp3 = $h + 1.0 / 3.0;
3097  break;
3098 
3099  case "g":
3100  $temp3 = $h;
3101  break;
3102 
3103  case "b":
3104  $temp3 = $h - 1.0/3.0;
3105  break;
3106  }
3107  if ($temp3 < 0) {
3108  $temp3 = $temp3 + 1.0;
3109  }
3110  if ($temp3 > 1) {
3111  $temp3 = $temp3 - 1.0;
3112  }
3113 
3114  if (6.0 * $temp3 < 1) {
3115  $rgb[$k] = $temp1 + ($temp2 - $temp1) * 6.0 * $temp3;
3116  } elseif (2.0 * $temp3 < 1) {
3117  $rgb[$k] = $temp2;
3118  } elseif (3.0 * $temp3 < 2) {
3119  $rgb[$k] = $temp1 + ($temp2 - $temp1) * ((2.0/3.0) - $temp3) * 6.0;
3120  } else {
3121  $rgb[$k] = $temp1;
3122  }
3123  }
3124  }
3125 
3126  $rgb["r"] = round($rgb["r"] * 255);
3127  $rgb["g"] = round($rgb["g"] * 255);
3128  $rgb["b"] = round($rgb["b"] * 255);
3129 
3130  return $rgb;
3131  }
3132 
3133  //
3134  // Media queries
3135  //
3136 
3140 
3144  public function getMediaQueries()
3145  {
3146  $ilDB = $this->db;
3147 
3148  $set = $ilDB->query("SELECT * FROM sty_media_query WHERE " .
3149  "style_id = " . $ilDB->quote($this->getId(), "integer") . " " .
3150  "ORDER BY order_nr");
3151 
3152  $mq = array();
3153  while ($rec = $ilDB->fetchAssoc($set)) {
3154  $mq[] = $rec;
3155  }
3156 
3157  return $mq;
3158  }
3159 
3164  public function addMediaQuery($a_mquery, $order_nr = 0)
3165  {
3166  $ilDB = $this->db;
3167 
3168  $id = $ilDB->nextId("sty_media_query");
3169  if ($order_nr == 0) {
3170  $order_nr = $this->getMaxMQueryOrderNr() + 10;
3171  }
3172 
3173  $ilDB->manipulate("INSERT INTO sty_media_query (id, style_id, mquery, order_nr)" .
3174  " VALUES (" .
3175  $ilDB->quote($id, "integer") . "," .
3176  $ilDB->quote($this->getId(), "integer") . "," .
3177  $ilDB->quote($a_mquery, "text") . "," .
3178  $ilDB->quote($order_nr, "integer") .
3179  ")");
3180 
3181  return $id;
3182  }
3183 
3188  public function getMaxMQueryOrderNr()
3189  {
3190  $ilDB = $this->db;
3191 
3192  $set = $ilDB->query(
3193  "SELECT max(order_nr) mnr FROM sty_media_query " .
3194  " WHERE style_id = " . $ilDB->quote($this->getId(), "integer")
3195  );
3196  $rec = $ilDB->fetchAssoc($set);
3197 
3198  return (int) $rec["mnr"];
3199  }
3200 
3207  public function updateMediaQuery($a_id, $a_mquery)
3208  {
3209  $ilDB = $this->db;
3210 
3211  $ilDB->manipulate(
3212  "UPDATE sty_media_query SET " .
3213  " mquery = " . $ilDB->quote($a_mquery, "text") .
3214  " WHERE id = " . $ilDB->quote($a_id, "integer")
3215  );
3216  }
3217 
3224  public function getMediaQueryForId($a_id)
3225  {
3226  $ilDB = $this->db;
3227 
3228  $set = $ilDB->query(
3229  "SELECT * FROM sty_media_query " .
3230  " WHERE id = " . $ilDB->quote($a_id, "integer")
3231  );
3232  return $ilDB->fetchAssoc($set);
3233  }
3234 
3240  public function deleteMediaQuery($a_id)
3241  {
3242  $ilDB = $this->db;
3243 
3244  $ilDB->manipulate(
3245  "DELETE FROM sty_media_query WHERE " .
3246  " style_id = " . $ilDB->quote($this->getId(), "integer") .
3247  " AND id = " . $ilDB->quote($a_id, "integer")
3248  );
3249  $this->saveMediaQueryOrder();
3250  }
3251 
3257  public function saveMediaQueryOrder($a_order_nr = null)
3258  {
3259  $ilDB = $this->db;
3260 
3261  $mqueries = $this->getMediaQueries();
3262  if (is_array($a_order_nr)) {
3263  foreach ($mqueries as $k => $mq) {
3264  $mqueries[$k]["order_nr"] = $a_order_nr[$mq["id"]];
3265  }
3266  $mqueries = ilUtil::sortArray($mqueries, "order_nr", "", true);
3267  }
3268  $cnt = 10;
3269  foreach ($mqueries as $mq) {
3270  $ilDB->manipulate(
3271  "UPDATE sty_media_query SET " .
3272  " order_nr = " . $ilDB->quote($cnt, "integer") .
3273  " WHERE id = " . $ilDB->quote($mq["id"], "integer")
3274  );
3275  $cnt+= 10;
3276  }
3277  }
3278 
3279 
3280  //
3281  // Table template management
3282  //
3283 
3287  public function getTemplates($a_type)
3288  {
3289  $ilDB = $this->db;
3290 
3291  $set = $ilDB->query("SELECT * FROM style_template WHERE " .
3292  "style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
3293  "temp_type = " . $ilDB->quote($a_type, "text") . " " .
3294  "ORDER BY name");
3295 
3296  $templates = array();
3297  while ($rec = $ilDB->fetchAssoc($set)) {
3298  $rec["classes"] = $this->getTemplateClasses($rec["id"]);
3299  $templates[] = $rec;
3300  }
3301 
3302  return $templates;
3303  }
3304 
3308  public function getTemplateClasses($a_tid)
3309  {
3310  $ilDB = $this->db;
3311  $set = $ilDB->query("SELECT * FROM style_template_class WHERE " .
3312  "template_id = " . $ilDB->quote($a_tid, "integer"));
3313 
3314  $class = array();
3315  while ($rec = $ilDB->fetchAssoc($set)) {
3316  $key = $rec["class_type"];
3317  $class[$key] = $rec["class"];
3318  }
3319 
3320  return $class;
3321  }
3322 
3323 
3327  public function addTemplate($a_type, $a_name, $a_classes)
3328  {
3329  $ilDB = $this->db;
3330 
3331  $tid = $ilDB->nextId("style_template");
3332  $ilDB->manipulate($q = "INSERT INTO style_template " .
3333  "(id, style_id, name, temp_type)" .
3334  " VALUES (" .
3335  $ilDB->quote($tid, "integer") . "," .
3336  $ilDB->quote($this->getId(), "integer") . "," .
3337  $ilDB->quote($a_name, "text") . "," .
3338  $ilDB->quote($a_type, "text") .
3339  ")");
3340 
3341  foreach ($a_classes as $t => $c) {
3342  $ilDB->manipulate($q = "INSERT INTO style_template_class " .
3343  "(template_id, class_type, class)" .
3344  " VALUES (" .
3345  $ilDB->quote($tid, "integer") . "," .
3346  $ilDB->quote($t, "text") . "," .
3347  $ilDB->quote($c, "text") .
3348  ")");
3349  }
3350 
3351  include_once("./Services/Style/Content/classes/class.ilObjStyleSheetGUI.php");
3352  $this->writeTemplatePreview(
3353  $tid,
3355  );
3356 
3357  return $tid;
3358  }
3359 
3363  public function updateTemplate($a_t_id, $a_name, $a_classes)
3364  {
3365  $ilDB = $this->db;
3366 
3367  $ilDB->manipulate("UPDATE style_template SET " .
3368  "name = " . $ilDB->quote($a_name, "text") .
3369  " WHERE id = " . $ilDB->quote($a_t_id, "integer"));
3370 
3371  $ilDB->manipulate(
3372  "DELETE FROM style_template_class WHERE " .
3373  "template_id = " . $ilDB->quote($a_t_id, "integer")
3374  );
3375  foreach ($a_classes as $t => $c) {
3376  $ilDB->manipulate($q = "INSERT INTO style_template_class " .
3377  "(template_id, class_type, class)" .
3378  " VALUES (" .
3379  $ilDB->quote($a_t_id, "integer") . "," .
3380  $ilDB->quote($t, "text") . "," .
3381  $ilDB->quote($c, "text") .
3382  ")");
3383  }
3384  }
3385 
3389  public function addTemplateClass($a_t_id, $a_type, $a_class)
3390  {
3391  $ilDB = $this->db;
3392 
3393  $ilDB->manipulate($q = "INSERT INTO style_template_class " .
3394  "(template_id, class_type, class)" .
3395  " VALUES (" .
3396  $ilDB->quote($a_t_id, "integer") . "," .
3397  $ilDB->quote($a_type, "text") . "," .
3398  $ilDB->quote($a_class, "text") .
3399  ")");
3400  }
3401 
3402 
3406  public function templateExists($a_template_name)
3407  {
3408  $ilDB = $this->db;
3409 
3410  $set = $ilDB->query("SELECT * FROM style_template WHERE " .
3411  "style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
3412  "name = " . $ilDB->quote($a_template_name, "text"));
3413  if ($rec = $ilDB->fetchAssoc($set)) {
3414  return true;
3415  }
3416  return false;
3417  }
3418 
3422  public function getTemplate($a_t_id)
3423  {
3424  $ilDB = $this->db;
3425 
3426  $set = $ilDB->query("SELECT * FROM style_template WHERE " .
3427  "style_id = " . $ilDB->quote($this->getId(), "integer") . " " .
3428  " AND id = " . $ilDB->quote($a_t_id, "integer"));
3429 
3430  if ($rec = $ilDB->fetchAssoc($set)) {
3431  $rec["classes"] = $this->getTemplateClasses($rec["id"]);
3432 
3433  $template = $rec;
3434  return $template;
3435  }
3436  return array();
3437  }
3438 
3442  public function lookupTemplateName($a_t_id)
3443  {
3444  return self::_lookupTemplateName($a_t_id);
3445  }
3446 
3450  public static function _lookupTemplateName($a_t_id)
3451  {
3452  global $DIC;
3453 
3454  $ilDB = $DIC->database();
3455 
3456  $set = $ilDB->query("SELECT name FROM style_template WHERE " .
3457  " id = " . $ilDB->quote($a_t_id, "integer"));
3458 
3459  if ($rec = $ilDB->fetchAssoc($set)) {
3460  return $rec["name"];
3461  }
3462 
3463  return false;
3464  }
3465 
3469  public function getTemplateXML()
3470  {
3471  $ilDB = $this->db;
3472 
3473  $tag = "<StyleTemplates>";
3474 
3475  $ttypes = array("table", "vaccordion", "haccordion", "carousel");
3476 
3477  foreach ($ttypes as $ttype) {
3478  $ts = $this->getTemplates($ttype);
3479 
3480  foreach ($ts as $t) {
3482  /*$atts = array("table" => "TableClass",
3483  "caption" => "CaptionClass",
3484  "row_head" => "RowHeadClass",
3485  "row_foot" => "RowFootClass",
3486  "col_head" => "ColHeadClass",
3487  "col_foot" => "ColFootClass",
3488  "odd_row" => "OddRowClass",
3489  "even_row" => "EvenRowClass",
3490  "odd_col" => "OddColClass",
3491  "even_col" => "EvenColClass");*/
3492  $c = $t["classes"];
3493 
3494  $tag.= '<StyleTemplate Name="' . $t["name"] . '">';
3495 
3496  foreach ($atts as $type => $t) {
3497  if ($c[$type] != "") {
3498  $tag.= '<StyleClass Type="' . $type . '" Value="' . $c[$type] . '" />';
3499  }
3500  }
3501 
3502  $tag.= "</StyleTemplate>";
3503  }
3504  }
3505 
3506  $tag.= "</StyleTemplates>";
3507 
3508  //echo htmlentities($tag);
3509  return $tag;
3510  }
3511 
3515  public function writeTemplatePreview($a_t_id, $a_preview_html)
3516  {
3517  $ilDB = $this->db;
3518  $a_preview_html = str_replace(' width=""', "", $a_preview_html);
3519  $a_preview_html = str_replace(' valign="top"', "", $a_preview_html);
3520  $a_preview_html = str_replace('<div class="ilc_text_block_TableContent">', "<div>", $a_preview_html);
3521  //echo "1-".strlen($a_preview_html)."-";
3522  //echo htmlentities($a_preview_html);
3523  if (strlen($a_preview_html) > 4000) {
3524  //echo "2";
3525  $a_preview_html = "";
3526  }
3527  $ilDB->manipulate("UPDATE style_template SET " .
3528  "preview = " . $ilDB->quote($a_preview_html, "text") .
3529  " WHERE id = " . $ilDB->quote($a_t_id, "integer"));
3530  }
3531 
3535  public function lookupTemplatePreview($a_t_id)
3536  {
3537  $ilDB = $this->db;
3538 
3539  $set = $ilDB->query("SELECT preview FROM style_template " .
3540  " WHERE id = " . $ilDB->quote($a_t_id, "integer"));
3541  if ($rec = $ilDB->fetchAssoc($set)) {
3542  return $rec["preview"];
3543  }
3544 
3545  return "";
3546  }
3547 
3551  public static function _lookupTemplateIdByName($a_style_id, $a_name)
3552  {
3553  global $DIC;
3554 
3555  $ilDB = $DIC->database();
3556 
3557  $set = $ilDB->query("SELECT id FROM style_template " .
3558  " WHERE style_id = " . $ilDB->quote($a_style_id, "integer") .
3559  " AND name = " . $ilDB->quote($a_name, "text"));
3560  if ($rec = $ilDB->fetchAssoc($set)) {
3561  return $rec["id"];
3562  }
3563 
3564  return false;
3565  }
3566 
3570  public function removeTemplate($a_t_id)
3571  {
3572  $ilDB = $this->db;
3573 
3574  $ilDB->manipulate("DELETE FROM style_template WHERE " .
3575  " style_id = " . $ilDB->quote($this->getId(), "integer") . " AND " .
3576  " id = " . $ilDB->quote($a_t_id, "integer"));
3577 
3578  $ilDB->manipulate(
3579  "DELETE FROM style_template_class WHERE " .
3580  "template_id = " . $ilDB->quote($a_t_id, "integer")
3581  );
3582  }
3583 
3587  public function writeStyleSetting($a_name, $a_value)
3588  {
3589  $ilDB = $this->db;
3590 
3591  $ilDB->manipulate(
3592  "DELETE FROM style_setting WHERE " .
3593  " style_id = " . $ilDB->quote($this->getId(), "integer") .
3594  " AND name = " . $ilDB->quote($a_name, "text")
3595  );
3596 
3597  $ilDB->manipulate("INSERT INTO style_setting " .
3598  "(style_id, name, value) VALUES (" .
3599  $ilDB->quote($this->getId(), "integer") . "," .
3600  $ilDB->quote($a_name, "text") . "," .
3601  $ilDB->quote($a_value, "text") .
3602  ")");
3603  }
3604 
3608  public function lookupStyleSetting($a_name)
3609  {
3610  $ilDB = $this->db;
3611 
3612  $set = $ilDB->query(
3613  "SELECT value FROM style_setting " .
3614  " WHERE style_id = " . $ilDB->quote($this->getId(), "integer") .
3615  " AND name = " . $ilDB->quote($a_name, "text")
3616  );
3617  $rec = $ilDB->fetchAssoc($set);
3618 
3619  return $rec["value"];
3620  }
3621 
3625  public static function writeStyleUsage($a_obj_id, $a_style_id)
3626  {
3627  global $DIC;
3628 
3629  $ilDB = $DIC->database();
3630 
3631  $ilDB->replace(
3632  "style_usage",
3633  array(
3634  "obj_id" => array("integer", (int) $a_obj_id)),
3635  array(
3636  "style_id" => array("integer", (int) $a_style_id))
3637  );
3638  }
3639 
3643  public static function lookupObjectStyle($a_obj_id)
3644  {
3645  global $DIC;
3646 
3647  $ilDB = $DIC->database();
3648 
3649  $set = $ilDB->query(
3650  "SELECT style_id FROM style_usage " .
3651  " WHERE obj_id = " . $ilDB->quote($a_obj_id, "integer")
3652  );
3653  $rec = $ilDB->fetchAssoc($set);
3654 
3655  if (ilObject::_lookupType($rec["style_id"]) == "sty") {
3656  return (int) $rec["style_id"];
3657  }
3658 
3659  return 0;
3660  }
3661 
3665  public static function lookupObjectForStyle($a_style_id)
3666  {
3667  global $DIC;
3668 
3669  $ilDB = $DIC->database();
3670 
3671  $obj_ids = array();
3672  if (ilObject::_lookupType($a_style_id) == "sty") {
3673  $set = $ilDB->query(
3674  "SELECT DISTINCT obj_id FROM style_usage " .
3675  " WHERE style_id = " . $ilDB->quote($a_style_id, "integer")
3676  );
3677 
3678  while ($rec = $ilDB->fetchAssoc($set)) {
3679  $obj_ids[] = $rec["obj_id"];
3680  }
3681  }
3682  return $obj_ids;
3683  }
3684 }
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.
global $ilErr
Definition: raiseError.php:16
getXML()
get xml representation of style object todo: add mq_id
static _explodeRGB($a_rgb, $as_dec=false)
Explode an RGB string into an array.
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.
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
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
$xml
Definition: metadata.php:240
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.
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
__construct($a_id=0, $a_call_by_reference=false)
Constructor public.
export()
Create export file.
getTemplates($a_type)
Get table templates of style.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
deleteStylePar($a_tag, $a_class, $a_par, $a_type, $a_mq_id=0, $a_custom=false)
Delete style parameter by tag/class/parameter.
static _getColorFlavor($a_rgb, $a_i)
Get color flavor.
updateColor($a_name, $a_new_name, $a_code)
Update color.
static _createImagesDirectory($a_style_id)
Create images directory <data_dir>/sty/sty_<id>/images.
createExportDirectory()
Create export directory.
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.
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file
createFromXMLFile($a_file, $a_skip_parent_create=false)
create style from xml file todo: add mq_id and custom
static _lookupActive($a_id)
Lookup active flag.
static _getStyleParameterInputType($par)
addMediaQuery($a_mquery, $order_nr=0)
Add media query.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static getWebspaceDir($mode="filesystem")
get webspace directory
$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.