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