{"id":738,"date":"2011-06-14T18:24:09","date_gmt":"2011-06-14T16:24:09","guid":{"rendered":"http:\/\/robert.kolatzek.org\/wblog\/?p=738"},"modified":"2011-06-14T18:24:09","modified_gmt":"2011-06-14T16:24:09","slug":"typo3-v-4-5-lust-und-frust","status":"publish","type":"post","link":"https:\/\/blog.kolatzek.org\/wblog\/738\/typo3-v-4-5-lust-und-frust","title":{"rendered":"Typo3 (v 4.5) &#8211; Lust und Frust"},"content":{"rendered":"<p>Seit Neuestem darf ich mich n\u00e4her mit Typo3 besch\u00e4ftigen. Bisher kannte ich es als Systemadministrator (Updates, Dateien und Datenbanken) oder von Vorf\u00fchrungen der Kollegen im Studium. Jetzt kommt das Administrieren bzw. der Aufbau hinzu. Das etwas seltsame TypoScript, Extensions &amp; Co begleiten mich Tag f\u00fcr Tag. Manchmal freut man sich, was alles geht und manchmal ist man der Verzweiflung nahe, weil man die einfachsten Aufgaben nicht &#8222;einfach so&#8220; erledigen kann. F\u00fcr die Leidensgenossen und alle Interessierten stelle ich einige Erkenntnisse hier kurz zusammen.<!--more--><\/p>\n<h2>Die Herausforderung: Men\u00fc selber bauen<\/h2>\n<p>Ich h\u00e4tte auch nicht gedacht, dass die Reihenfolge entscheidend ist&#8230; Aber es ist so &#8211; auch wenn es nicht in der Dokumentation steht&#8230;<br \/>\n<code>### Ein Men\u00fc f\u00fcr alle Kinderelemente von Seite-ID=2 bauen<br \/>\nlib.menu_links = HMENU<br \/>\nlib.menu_links {<br \/>\n special = directory<br \/>\n special.value = 2<br \/>\n expAll = 1<br \/>\n entryLevel = -1<br \/>\n stdWrap.warp = &lt;ul class=\"menublock_soundso\"&gt;&lt;li class=\"normal plus\"&gt; | &lt;\/li&gt;&lt;\/ul&gt;<br \/>\n ## Erste Ebene ##<br \/>\n 1 = TMENU<br \/>\n 1 {<br \/>\n wrap = &lt;ul class=\"menu\"&gt;|&lt;\/ul&gt;<br \/>\n expAll = 1<br \/>\n noBlur = 1<br \/>\n NO.wrapItemAndSub = &lt;li&gt;|&lt;\/li&gt;<br \/>\n ACTIFSUB &lt; .NO<br \/>\n ACTIFSUB = 1<br \/>\n ACTIFSUB.wrapItemAndSub = &lt;liclass=\"active normal minus liopen\"&gt;|&lt;\/li&gt;<br \/>\n IFSUB &lt; .NO<br \/>\n IFSUB = 1<br \/>\n IFSUB.wrapItemAndSub = &lt;li class=\"inactiv minus liclosed\"&gt;|&lt;\/li&gt;<br \/>\n ACT = 1<br \/>\n ACT.wrapItemAndSub = &lt;li class='liactive'&gt;|&lt;\/li&gt;<br \/>\n ACT.ATagParams = class='selected'<br \/>\n }<br \/>\n ## 2., 3. und 4. Ebene wie die erste behandeln<br \/>\n 2 &lt; .1<br \/>\n 3 &lt; .1<br \/>\n 4 &lt; .1<br \/>\n }<br \/>\n}<\/code><br \/>\nJetzt das passende CSS dazu (&#8222;Cousines&#8220; der aktuellen Seiten ab der 3. Ebene nicht anzeigen = per CSS ausblenden). Und das geht so: Aktive Elternelemente, die aktuelle Seite und alle Links beim dar\u00fcber fahren schwarz machen (#000) &#8211; den Rest grau (#999). Abstand bei jeder Hierarchieebene um ein halbes &#8222;x&#8220; nach rechts einr\u00fccken.<br \/>\n<code>ul.menu li<br \/>\n{<br \/>\n padding-bottom: 0.5ex;<br \/>\n}<br \/>\nli.minus<br \/>\n{<br \/>\n color: #000;<br \/>\n}<br \/>\nli.liclosed ul.menu<br \/>\n{<br \/>\n display: none;<br \/>\n}<br \/>\n.menu .inactiv.minus a<br \/>\n{<br \/>\n color: #999;<br \/>\n}<br \/>\nli.active.minus a:hover, li.active.minus a:active<br \/>\n{<br \/>\n color: #000;<br \/>\n}<br \/>\n.liopen .menu li a<br \/>\n{<br \/>\n color: #999;<br \/>\n}<br \/>\n.liopen .menu li.liactive a<br \/>\n{<br \/>\n color: #000;<br \/>\n}<br \/>\n.active.normal.minus.liopen &gt; a<br \/>\n{<br \/>\n color: #000;<br \/>\n}<br \/>\ndiv#menu &gt; ul.menu &gt; li.inactiv &gt; a:hover<br \/>\n{<br \/>\n color: #000;<br \/>\n}<br \/>\nli.active ul.menu li.active &gt; a<br \/>\n{<br \/>\n color: #000;<br \/>\n}<\/code><\/p>\n<h2>Druckversion international:<\/h2>\n<p><code>### Das Wort Druckversion in die Sprachen \u00fcbersetzen ###<br \/>\nlib.print_word = TEXT<br \/>\n[globalVar = GP:L = 0]<br \/>\nlib.print_word.value = Druckversion<br \/>\n[global]<br \/>\n## Wenn englisch die Sprachen-ID = 2 hat, dann schreibt man das so<br \/>\n[globalVar = GP:L = 2]<br \/>\nlib.print_word.value = Printer friendly version<br \/>\n[global]<br \/>\n## usw...<br \/>\n## Printlink: Seiten-ID und Sprachen-ID in den Link aufnehmen und um das \u00fcbersetzte Wort legen<br \/>\nlib.printlink = COA<br \/>\nlib.printlink {<br \/>\n 10 = TEXT<br \/>\n 10{<br \/>\n data = TSFE:id<br \/>\n wrap = index.php?id=|&amp;<br \/>\n }<br \/>\n 20 = TEXT<br \/>\n 20 {<br \/>\n data = TSFE:sys_language_uid<br \/>\n wrap = type=98&amp;no_cache=1&amp;L=|&amp;print=1<br \/>\n }<br \/>\n 30 &lt; lib.print_word<br \/>\n 30 {<br \/>\n wrap = \" target=\"_blank\"&gt;|&lt;\/<br \/>\n }<br \/>\n}<br \/>\nlib.printlink.wrap = &lt;a href=\"|a&gt;<\/p>\n<p>#### Druckversion #####<br \/>\ndruckversion = PAGE<br \/>\ndruckversion {<br \/>\n typeNum = 98<br \/>\n bodyTag = &lt;body onload=\"javascript:window.print()\"&gt;<br \/>\n 10 = HTML<br \/>\n 10.value = &lt;div id='website'&gt;&lt;div id='content'&gt;&lt;div id='content_center'&gt;<br \/>\n 30 &lt; styles.content.get<br \/>\n 40 = HTML<br \/>\n 40.value = &lt;\/div&gt;&lt;\/div&gt;&lt;\/div&gt;<br \/>\n}<br \/>\n## Aus dem Fileadmin die passende CSS-Datei f\u00fcr den Druck wie f\u00fcr die Ansicht einbinden.<br \/>\ndruckversion.includeCSS {<br \/>\n file1 = fileadmin\/templates\/main\/styles\/print.css<br \/>\n file1.title = Standardansicht<br \/>\n file1.media = screen<br \/>\n file2 = fileadmin\/templates\/main\/styles\/print.css<br \/>\n file2.title = Druckversion<br \/>\n file2.media = print<br \/>\n}<\/code><\/p>\n<h2>TW_RSSFeeds-Plugin meckert ab PHP 5.2 (und ab 5.3 st\u00fcrzt sogar ab):<\/h2>\n<p>Der \u00dcbelt\u00e4ter ist schnell gefunden.<\/p>\n<p><em>allow_call_time_pass_reference to true in your INI file in <strong>\/pfad\/zu\/wwwroot \/typo3conf\/ext\/tw_rssfeeds\/pi1\/class.tx_twrssfeeds_pi1.php<\/strong> on line <strong>454<\/strong><\/em><\/p>\n<p>Da hat jemand wohl f\u00fcr PHP4\/5.0-1 programmiert. Um es zu fixen, reicht es, das &#8222;&amp;&#8220; vor $this in eben dieser Datei in der Zeile 454 zu entfernen. (Also <em>xml_set_object($this-&gt;parser, $this);<\/em>)<\/p>\n<p>Die schlimme Erkenntnis in diesem Fall: Die meisten Typo3-Plugins sind entweder veraltet (so dass sie nicht mehr funktionieren) oder sie wurden sehr billig zusammengeschustert. (Ich bin auch kein PHP-Guru aber ich versuche ohne die \u00dcbergabe von Referenzen oder \u00e4hnlichen Tricks auszukommen.)<\/p>\n<p>Auch eine riesige Auswahl an Plugins bringt einem nichts, wenn diese mit der aktuellen (Typo3- oder PHP-) Version nicht laufen.<\/p>\n<h2>Herausforderung: Schriftgr\u00f6\u00dfe mit den drei &#8222;A&#8220;s beliebig skalieren lassen<\/h2>\n<p>Mit &#8222;efafontsize&#8220; (EFA steht f\u00fcr <a title=\"Einfach f\u00fcr alle - Barrierefreies Webdesign: Einfach f\u00fcr Alle (eine Initiative der Aktion Mensch)\" href=\"http:\/\/www.einfach-fuer-alle.de\">Einfach F\u00fcr Alle &#8211; dem Portal f\u00fcr h\u00fcrdenfreies Surfen<\/a>) geht es am sch\u00f6nsten. Man setzt nur statt die Bildchen &#8222;span&#8220;s ein:<br \/>\n<code>### Wir starten bei 80% der Gr\u00f6\u00dfe und springen um 10% rauf und runter<br \/>\nlib.fontsize &lt; plugin.tx_efafontsize_pi1<br \/>\nlib.fontsize {<br \/>\n defaultFontSize = 80<br \/>\n fontSizeIncrement = 10<br \/>\n}<br \/>\n## wichtig: \"page.1\" - da hier der \"BODY\" verarbeitet werden muss, um die \"80%\" einzusetzen<br \/>\npage.1 &lt; plugin.tx_efafontsize_pi1<br \/>\npage.1.userFunc = tx_efafontsize_pi1-&gt;initEfA<\/p>\n<p>lib.fontsize.smaller = 1<br \/>\nlib.fontsize.smaller {<br \/>\n insideHTML = HTML<br \/>\n insideHTML.value = &lt;span style=\"font-size: 80%;\"&gt;A&lt;\/span&gt;<br \/>\n}<br \/>\nlib.fontsize.reset = 1<br \/>\nlib.fontsize.reset {<br \/>\n insideHTML = HTML<br \/>\n insideHTML.value = &lt;span style=\"font-size: 110%;\"&gt; A &lt;\/span&gt;<br \/>\n}<br \/>\nlib.fontsize.bigger = 1<br \/>\nlib.fontsize.bigger {<br \/>\n insideHTML = HTML<br \/>\n insideHTML.value = &lt;span style=\"font-size: 140%;\"&gt;A&lt;\/span&gt;<br \/>\n}<\/code><br \/>\nEines scheint hier nur problematisch zu sein: Die folgende Zeile macht die Gr\u00f6\u00dfenberechnung der Schrift irgendwie &#8222;unberechenbar&#8220;<br \/>\n<code>if (h &lt; this.defPx) this.base = this.defPx\/h;<\/code><br \/>\n(Zeilennummer: 43) Ich komme auch ohne diese wunderbar aus!<\/p>\n<h2>St\u00e4rke von Typo3 &#8211; Includes!<\/h2>\n<p>In einer Installation kann man nicht nur einen Zweig (eine Dom\u00e4ne) fahren. Es ist (begrenzt) mandantenf\u00e4hig. Zwar nicht auf der administrativen Ebene (Templates, Extensions, User &amp; Co) aber man kann einzelnen Zweigen eigene Dom\u00e4nen zuordnen.  Als &#8222;DB-Mounts&#8220; kann man sie einzelnen Personen oder Gruppen zur Bearbeitung freigeben usw&#8230;<\/p>\n<p>Doch die eigentliche St\u00e4rke (in meinen Augen) liegt in den Includes (&#8222;Enth\u00e4lt&#8220;) von Typo3-Templates. (BTW: Diese haben eher wenig mit Layout zu tun &#8211; sie sind vielmehr Verarbeitungsanweisunge, ohne die Typo3 gar nicht l\u00e4uft.) Ein St\u00fcck TypoScript &#8211; nennen wir es &#8222;schriftgroe\u00dfe&#8220; kann im Zweig &#8222;A&#8220; liegen aber zugleich vom Typo3-Template des Zweiges &#8222;B&#8220; verwendet werden. Damit hat man nur einmal die Code-Schnipsel liegen. Sollten Anpassungen f\u00fcr &#8222;B&#8220; n\u00f6tig sein, setzt man sie wie folgt um:<\/p>\n<ol>\n<li>Den Inhalt von &#8222;schriftgroe\u00dfe&#8220; kopieren<\/li>\n<li>&#8222;schriftgroe\u00dfe_B&#8220; im Zweig &#8222;B&#8220; anlegen<\/li>\n<li>Den kopierten Inhalt in &#8222;schriftgroe\u00dfe_B&#8220; einf\u00fcgen<\/li>\n<li>Anpassungen vornehmen (was sich nicht \u00e4ndert so weit es geht rausl\u00f6schen)<\/li>\n<li>Im Reiter &#8222;Enth\u00e4lt&#8220; (Includes) &#8222;schriftgroe\u00dfe&#8220; hinzuf\u00fcgen &amp; speichern<\/li>\n<li>Im Template f\u00fcr den Zweig &#8222;B&#8220; im selben Reiter &#8222;schriftgroe\u00dfe&#8220; rausnehmen und &#8222;schriftgroe\u00dfe_B&#8220; einf\u00fcgen &amp; speichern<\/li>\n<\/ol>\n<p>Mit wenig Code (und vielen Klicks) haben wir die entsprechenden \u00c4nderungen gemacht. Klasse!<\/p>\n<h2>Herausforderung: Austauschbare Hintergrundbilder f\u00fcr bestimmte Bereiche<\/h2>\n<p>Auch das geht (wenn man wei\u00df wie)&#8230; Es ist nicht einfach aber einmal eingearbeitet fast ein Kinderspiel.<\/p>\n<p>Man gibt in den Seiteneigenschaften (die Rechte muss man die Redakteuren doch gestehen) im Tab &#8222;Ressourcen&#8220; ein Bild aus einem bestimmten Pfad im Fileadmin an. Bei uns hei\u00dft es &#8222;Bereichslogos&#8220;. Die Reihenfolge ist auch hier wichtig: wir nehmen das erste Bild aus dieser Liste. Unser Container, der das Hintergrundbild enthalten soll, hei\u00dft &#8222;logo_center&#8220;.<\/p>\n<p>Die L\u00f6sung kann nur im CSS liegen, deshalb definieren wir im Header ein &#8222;style&#8220;-Element und hinterlassen dort die Definitionen f\u00fcr &#8222;#logo_center&#8220;. Wenn kein Bild angegeben wurde, legen wir selber eines fest (2. Zeile).<br \/>\n<code>page.headerData.10 = TEXT<br \/>\npage.headerData.10.value = &lt;style type=\"text\/css\"&gt;#logo_center{background:url(\/fileadmin\/Bereichslogos\/logo.jpg) no-repeat scroll 0 0 #FFFFFF;}&lt;\/style&gt;<br \/>\npage.headerData.10.override {<br \/>\n required = 1<br \/>\n # nimm von dieser Seite - oder wenigstens von den Eltern<br \/>\n data = levelmedia: -1, slide<br \/>\n wrap = &lt;style type=\"text\/css\"&gt;#logo_center{background:url(\/fileadmin\/Bereichslogos\/|) no-repeat scroll 0 0 #FFFFFF;}&lt;\/style&gt;<br \/>\n # wir nehmen das erste Bild - nach Computerz\u00e4hlung die \"0\"<br \/>\n listNum = 0<br \/>\n }<\/code><br \/>\nEinfach oder?<\/p>\n<p>Weitere Erkenntnisse folgen in wenigen Tagen bis Wochen ;-)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seit Neuestem darf ich mich n\u00e4her mit Typo3 besch\u00e4ftigen. Bisher kannte ich es als Systemadministrator (Updates, Dateien und Datenbanken) oder von Vorf\u00fchrungen der Kollegen im Studium. Jetzt kommt das Administrieren bzw. der Aufbau hinzu. Das etwas seltsame TypoScript, Extensions &amp; Co begleiten mich Tag f\u00fcr Tag. Manchmal freut man sich, was alles geht und manchmal [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"","ocean_second_sidebar":"","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"","ocean_custom_header_template":"","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"","ocean_menu_typo_font_family":"","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"","ocean_post_oembed":"","ocean_post_self_hosted_media":"","ocean_post_video_embed":"","ocean_link_format":"","ocean_link_format_target":"self","ocean_quote_format":"","ocean_quote_format_link":"post","ocean_gallery_link_images":"on","ocean_gallery_id":[],"footnotes":""},"categories":[8],"tags":[113,126],"class_list":["post-738","post","type-post","status-publish","format-standard","hentry","category-software","tag-typo3","tag-web","entry"],"_links":{"self":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/posts\/738","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/comments?post=738"}],"version-history":[{"count":0,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/posts\/738\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/media?parent=738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/categories?post=738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kolatzek.org\/wblog\/wp-json\/wp\/v2\/tags?post=738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}