<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		
		<title>T3node - TYPO3 blog by Steffen Müller</title>
		<link>http://www.t3node.com/</link>
		<description>Blog about TYPO3, LAMP, HTML, CSS and other web topics</description>
		<language>en</language>
		<image>
			<title>T3node - TYPO3 blog by Steffen Müller</title>
			<url>http://www.t3node.com/fileadmin/template/rssicon.gif</url>
			<link>http://www.t3node.com/</link>
			<width>32</width>
			<height>32</height>
			<description>Blog about TYPO3, LAMP, HTML, CSS and other web topics</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Sat, 20 Jun 2009 18:11:00 +0200</lastBuildDate>
		
		
		<item>
			<title>Conditions and dynamic values in TCA fields of TYPO3 </title>
			<link>http://www.t3node.com/blog/conditions-and-dynamic-values-in-tca-fields-of-typo3/</link>
			<description>TYPO3 backend and TCA simetimes appear a bit old school. Fields and values are less flexible like you are used to in recent AJAX applications. How to make them more flexible without heavy JS frameworks like ExtJS?</description>
			<content:encoded><![CDATA[<p> The first thing that I found was the dynaflex extension. It allows to add new fields dynamically based on conditions. Anyway I found a quick&amp;dirty solution, which looked more confident for the tiny task I had to solve:</p>
<p>The problem was to have dynamic values in the frames (section_frame)  field of content elements, depending on the value of the column (colPos) field. If normal column was choosen, frames should offer value 80 and 81. If right column was choosen, frames should offer 82 and 83.</p>
<p>The first thing I did was to add colPos to the list of fields, which trigger saving and reloading&nbsp;the content element on change. I kickstarted a new extension and added these lines to extTables.php:</p>
<pre>$updateFields = t3lib_div::trimExplode(<br />  ',',<br />  $TCA['tt_content']['ctrl']['requestUpdate']<br />);<br />if (in_array('colPos', $updateFields)) {<br />  $TCA['tt_content']['ctrl']['requestUpdate'] .= ',colPos';<br />} </pre>
<p>Then I changed the TCA of section_frame to use itemsProcFunc to customize its items:</p>
<pre>$TCA['tt_content']['columns']['section_frame']['config']['items'] = array();<br />$TCA['tt_content']['columns']['section_frame']['config']['itemsProcFunc'] = 'tx_myext_setsectionframeitems-&gt;main';<br />if (TYPO3_MODE == 'BE') {<br />&nbsp; include_once(t3lib_extMgm::extPath($_EXTKEY).'class.tx_myext_setsectionframeitems.php');<br />} </pre>
<p>Next step was to implement the class, which controls the items. The class itself was stored in a seperate file called class.tx_myext_setsectionframeitems.php:</p>
<pre>class tx_myext_setsectionframeitems {<br />&nbsp; function main(&amp;$params, &amp;$pObj)&nbsp;{<br />&nbsp;&nbsp;&nbsp; global $LANG;<br />&nbsp;&nbsp;&nbsp; $selectOptions = array();<br /><br />&nbsp;&nbsp; // Allowed fields for normal column<br />&nbsp;&nbsp;&nbsp; $normalFields = array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $LANG-&gt;sL(&quot;LLL:EXT:myext/locallang_tca.xml:tt_content.section_frame.I.80&quot;) =&gt; 80,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $LANG-&gt;sL(&quot;LLL:EXT:myext/locallang_tca.xml:tt_content.section_frame.I.81&quot;) =&gt; 81<br />&nbsp; &nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp; // Allowed fields for right column<br />&nbsp;&nbsp;&nbsp; $rightFields = array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $LANG-&gt;sL(&quot;LLL:EXT:myext/locallang_tca.xml:tt_content.section_frame.I.82&quot;) =&gt; 82,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $LANG-&gt;sL(&quot;LLL:EXT:myext/locallang_tca.xml:tt_content.section_frame.I.83&quot;) =&gt; 83<br />&nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp; // Get value of tt_content.colPos<br />&nbsp;&nbsp;&nbsp; $key = key($pObj-&gt;cachedTSconfig);<br />&nbsp;&nbsp;&nbsp; $colPos = $pObj-&gt;cachedTSconfig[$key]['_THIS_ROW']['colPos'];<br />&nbsp;&nbsp;&nbsp; // Add items<br />&nbsp;&nbsp;&nbsp; if ($colPos == 2) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $selectOptions = $rightFields;<br />&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $selectOptions = $normalFields;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; foreach ($selectOptions as $key =&gt; $value) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $params['items'][] = array(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $key,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br />}<br /><br />if (defined('TYPO3_MODE') &amp;&amp; $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/myext/class.tx_myext_setsectionframeitems.php'])&nbsp; {<br />&nbsp; include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/myext/class.tx_myext_setsectionframeitems.php']);<br />} </pre>
<p>The custom labels were stored in a usual locallang file.</p>
<p>Finally, I did some TSconfig tuning in extTables.php to prevent invalid field values:</p>
<pre>t3lib_extMgm::addPageTSConfig('<br /> &nbsp;&nbsp;TCEFORM.tt_content.section_frame.disableNoMatchingValueElement = 1<br />'); </pre>
<p>That's it. The whole stuff looks a bit ugly to me. So if you know a smarter solution, I'd be glad if you leave a comment.</p>]]></content:encoded>
			
			
			<pubDate>Sat, 20 Jun 2009 18:11:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>FLOW3 first alpha version released</title>
			<link>http://www.t3node.com/blog/flow3-first-alpha-version-released/</link>
			<description>Robert Lemke just announced that the first public alpha version of FLOW3 has been released. A reason to celebrate!</description>
			<content:encoded><![CDATA[<p><a href="http://flow3.typo3.org/news/0/1/" title="Official news article about the FLOW3 aplha 1 release" class="external-link" >FLOW3</a> is meant as the next generation PHP application  framework, which will be the basis for the forthcoming TYPO3 version 5. It has now been developed for 2.5 years and finally reached an alpha state. You can find a <a href="http://flow3.typo3.org/about/features/" title="Main features of FLOW3" class="external-link" >feature list at the FLOW3 website</a>. </p>
<p> I already got in contact with FLOW3 at <a href="http://t3dd09.typo3.org" title="T3DD09 - the official TYPO3 Developer Days 2009" class="external-link" >T3DD09</a>, listening to <a href="http://t3dd09.typo3.org/recordings.html" title="Some recordings of talks at T3DD09" class="external-link" >several talks</a> about its architecture and components and playing a bit with the code. This milestone release comes just in time with&nbsp;<a href="blog/extbase-presentation-at-t3dd09/" >Extbase</a>, the forthcoming <a href="http://forge.typo3.org/wiki/typo3v4-mvc/MVC_Concept" title="Extbase project website at TYPO3 forge" class="external-link" >backport of the MVC pattern</a> of FLOW3 for TYPO3 version 4.x.</p>
<p>I am very curious about the progress of these projects, since I am already infected by the new&nbsp;design patterns and programming paradigms. I also see  more and more people testing and writing FLOW3 and Extbase stuff which makes me confident about its success. Still there is a lot of criticism and scepticism about FLOW3, especially the question of performance. Anyway this is a first alpha release and there's still enough time and code left to solve these problems.</p>
<p>Keep on&nbsp;with your good work!</p>]]></content:encoded>
			
			
			<pubDate>Tue, 02 Jun 2009 19:41:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Tiny introduction to heatmaps</title>
			<link>http://www.t3node.com/blog/tiny-introduction-to-heatmaps/</link>
			<description>Heatmaps can be used for website usage analysis. They appear to be very easy to read and comfortable to understand. But in fact it's not that easy to assure a proper environment and to get reliable results.</description>
			<content:encoded><![CDATA[<p>My TYPO3 agenda today was hit by heatmaps, when a click-heatmap extension was published in TER and a german blog posting about heatmaps was published by <a href="http://typo3blogger.de/heatmap-fur-typo3/" title="Blog posting about heatmaps" class="external-link" >Tim Lochmüller</a>. At the time of writing this post I will not&nbsp;refer to the extension as it did not meet my personal quality requirements. Well, so what about heatmaps?</p>
<h3>What are heatmaps and how are they generated?</h3>
<p>There are different ways of heatmap data generation. I will explain two of them in context of website usage analysis.&nbsp;<img alt="Image of a Heatmap" title="IMage by Jason Morrison http://www.flickr.com/photos/jason-morrison/" style="padding-top: 8px; padding-right: 8px; padding-bottom: 8px; float: left;" src="fileadmin/user_upload/images/heatmap2.jpg" height="220" width="255" /> The first one is a click-heatmap which tracks the coordinates of all mouse clicks users perform on a website. The second one is an eyetracking-heatmap, which tracks the eye movement of a user when he looks at a website. Both methods use colorization to visualize those areas where user clicked or looked at. The more clicks an area has or the more time was spend for watching an area, the more reddish&nbsp;the area is colorized. The visualization follows&nbsp;assumptions of the <a href="http://en.wikipedia.org/wiki/Color_theory#Warm_vs._cool_colors" title="Opens external link in current windowWikipedai article about color temperature in color theory" class="external-link" >color theory</a>, which associate red colors more hot than blue ones. So hot areas on heatmaps&nbsp;reveal more user attention than cold ones. </p>
<h3>Click-heatmap usecase</h3>
<p>A click-heatmap gives an impression about the regions of a website users click - no matter if there's anything to click or not. Heatmaps therefore are very useful to identify usability flaws. They reveal those parts of a website, where users expect something to click, but in fact nothing exists to click. A popular example are those hugh&nbsp;logo images at the top of a website, where you could expect a link to the root page. In fact you often click in vain.</p>
<h3>Eyetracking-heatmap usecase</h3>
<p>Heatmaps also can be used to describe&nbsp;users' eye movement and favorite coordinates on a website. Jakob Nielson demonstrated this by&nbsp;creating heatmaps which proof the&nbsp;so called <a href="http://www.useit.com/alertbox/reading_pattern.html" title="Blog posting about a survey of Jakob Nielson which describes the F-Pattern" class="external-link" >F-pattern</a>. He describes the F-Pattern as a dominant scheme how users track a website. His heatmaps revealed a F-shaped area, where users looked most frequently at.</p>
<p><img alt="Heatmap on google search results" title="Image by labnol: http://www.flickr.com/photos/amit-agarwal/" style="padding-top: 8px; padding-bottom: 8px;" src="fileadmin/user_upload/images/heatmap.jpg" height="273" width="330" /></p>
<p>The image shows an  F-Pattern heatmap on a google search result page.</p>
<h3>Why not simply install a heatmap software to find out what users behave like...</h3>
<p>You need to be sceptical about the obvious nature of a visual representation like a  heatmap:</p><ul><li>In the wild, websites users have different tools and interfaces which render your wesbite differently. Screen resolutions or size and browser rendering  can vary and bias the results of a heatmap survey. The more diverse user&nbsp;environments are, the more bias your results will have. And in most cases it is hard  to estimate the&nbsp;bias. </li><li>Content changes, especially on dynamic root pages with latest news. The quality of&nbsp;heatmap results declines the more frequent content changes or the longer a survey takes on a dynamic website.</li></ul><h3>Conclusion</h3>
<p>A heatmap is a handy&nbsp;tool to visualize website usage. It's results&nbsp;are real eyecatcher. The reliability of the results can suffer very much if you are not in full control of the users environment. The perfect usecase would be a website usability pretest with controlled laboratory conditions.&nbsp;Heatmaps are no substitution to visitor or website traffic statistics, but can cast light on some hidden aspects.</p>]]></content:encoded>
			
			
			<pubDate>Fri, 29 May 2009 00:33:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Writing a basic Fluid ViewHelper</title>
			<link>http://www.t3node.com/blog/writing-a-basic-fluid-viewhelper/</link>
			<description>After listening to Sebastians talk today about the new templating engine Fluid, I felt inspired to give it a try. I am really surprised how easy it is to extend Fluid by writing an own view helper.</description>
			<content:encoded><![CDATA[<p>My goal was to add a <a href="http://forge.typo3.org/projects/show/package-fluid" title="Fluid project page on forge" class="external-link" >Fluid</a> ViewHelper to the blog_example extension. This extension&nbsp;is&nbsp;backported from FLOW3 to&nbsp;TYPO3 v.4 as a demonstration for&nbsp;extBase. Read more about blog_example, extBase and Fluid in v.4 in the <a href="http://forge.typo3.org/projects/show/typo3v4-mvc" title="Project page of the MVC framework in forge" class="external-link" >MVC framework project page</a>. I will not explain details here but concentrate on the view helper stuff. My view helper should add a new template marker which creates a dummy text &quot;Lorem Ipsum&quot;. The marker expects an integer value, which is used for&nbsp;cropping the dummy text.</p>
<p>After installing and setting up extBase, Fluid and the blog_example extensions, I added a new view helper folder&nbsp;in the blog_example extension:</p>
<pre>mkdir typo3conf/ext/blog_example/Classes/ViewHelpers</pre>
<p>This folder is generally used as a container for view helpers which are shipped with extensions. In the next step, I created a new which contains the helper itself:</p>
<pre>touch typo3conf/ext/blog_example/Classes/ViewHelpers/LoremIpsumViewHelper.php</pre>
<p>It's important to stick to this naming scheme, because otherwise Fluid will not find the view helper. Let's have a closer look at it. Beside the .php extension at the end of the filename, it  contains two main parts: <i>LoremIpsum</i> and <i>ViewHelper</i>. <i>LoremIpsum</i> is the very name of the view helper and <i>ViewHelper</i> is a constant which is a mandatory part. The filename reflects the naming scheme of the class name of the view helper. So let's see what the file content looks like. I removed some comments to increase readability:</p>
<pre>&lt;?php<br /><br />/**<br />&nbsp;* This class is a demo view helper for the Fluid templating engine.<br />&nbsp;*<br />&nbsp;* @package TYPO3<br />&nbsp;* @subpackage Fluid<br />&nbsp;* @version<br />&nbsp;*/<br />class Tx_BlogExample_ViewHelpers_LoremIpsumViewHelper extends Tx_Fluid_Core_AbstractViewHelper {<br /><br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp; &nbsp;* Renders some classic dummy content: Lorem Ipsum...<br />&nbsp;&nbsp;&nbsp; &nbsp;*<br />&nbsp;&nbsp;&nbsp; &nbsp;* @param int $lenght The number of characters of the dummy content<br />&nbsp;&nbsp;&nbsp; &nbsp;* @return string dummy content, cropped after the given number of characters<br />&nbsp;&nbsp;&nbsp; &nbsp;* @author Lorem Ipsum &lt;lorem@example.com&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;*/<br />&nbsp;&nbsp;&nbsp; public function render($lenght) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $dummyContent = 'Lorem ipsum dolor sit amet.';<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return substr($dummyContent, 0, $lenght);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />?&gt;</pre>
<p>This is a very basic example. My&nbsp;class extends the abstract view helper class of Fluid. I will not explain the Fluid API here. Let's concentrate on the example. The only method of my class is <i>render()</i> which is used to render the content of my&nbsp;marker. It crops a &quot;Lorem Ipsum&quot; string to a given lenght by using the substr() function. Some PHPDOC parts in the comments of the render() method are&nbsp;mandatory to get the view helper working. For example the @param part defines the argument type (int). The argument is being checked by the framework to ensure that the render() method always gets integer values. That's all for now in this file.</p>
<p>In a next step, I added the view helper to the Fluid template of blog_example:</p>
<pre># vi typo3conf/ext/blog_example/Resources/Private/Templates/Blog/index.html<p></p>{namespace blog = Tx_BlogExample_ViewHelpers} <p>&lt;h1&gt;<br />&nbsp; &lt;blog:loremIpsum lenght=&quot;5&quot; /&gt;<br />&lt;/h1&gt;</p></pre>
<p>First I had to declare a namespace for my view helpers. I chose to use <i>blog</i>, to be used as a shortcut to all the view helpers of the blog_example extension. Next is the marker itself. The syntax is easy to spot: The namespace and the viewhelper name is seperated by a : The lenght arguments is given afterwards </p>
<p>The result of using this template marker is a level 1 header with &quot;Lorem&quot; as the text:</p>
<pre>&lt;h1&gt;Lorem&lt;/h1&gt;</pre>
<p>That's all. I am really exited about how easy it is to write own view helpers. I hope this article could demonstrate that and motivate you to get into the FLOW3/Fluid/extBase universe.</p>]]></content:encoded>
			
			
			<pubDate>Sat, 16 May 2009 01:27:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Extbase presentation at T3DD09</title>
			<link>http://www.t3node.com/blog/extbase-presentation-at-t3dd09/</link>
			<description>The TYPO3 Developer Days have started yesterday. Today, the first talk is about Extbase by Jochen Rau and Sebastian Kurfürst. Extbase is meant to be a transition path from TYPO3 version 4 to FLOW3.</description>
			<content:encoded><![CDATA[<p>The MVC part of FLOW3 seems to be in a state with stable basic structures&nbsp;and ready-to-test implementations. Of course that does not mean that it is already usable in a production environment. But the ongoing activity on backporting the MVC aspects&nbsp;to Version 4 with Extbase is a promising sign.</p>
<p>Jochen and Sebastian have just introduced the basic principles which are realized in Extbase. Extbase is meant to be a new basis to create frontend extensions, which yet has been handled by pibase</p>
<p>Extbase promises to end writing&nbsp;spaghetti code which was common and sometimes unavoidable in&nbsp;pibase extensions. It tries to implement MVC pattern, dividing things into several logical layers.</p>
<p>The presentation is very inspiring, the concepts sound understandable and things are well visualized. Also Jochen is a great speaker who not only seems to know one's stuff but is also a very skilled teacher. The audience seems to be very interested, since a lot of discussion is going on.</p>
<p>The Extbase session will be follwed by an introduction to Fluid, the new templating engine which is going to be released wth Extbase. So far it looks very promising, making templating much more flexible and powerful than the marker based approach.</p>]]></content:encoded>
			
			
			<pubDate>Fri, 15 May 2009 10:49:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Thinking about UTF-8 character set conversion in TYPO3</title>
			<link>http://www.t3node.com/blog/thinking-about-utf-8-character-set-conversion-in-typo3/</link>
			<description>UTF-8 seems to become more and more popular as a character set used with TYPO3. Changing the charset of a system can be tricky and there are a lot of traps. Lots of mailing list requests prove that. Here's are some general thoughts about the subject (no howto!).</description>
			<content:encoded><![CDATA[<p> If you have ever tried to convert your character set to UTF-8 and end up with strange charcters like <img src="fileadmin/user_upload/images/questionmark.gif" width="12" height="15" alt="" />, then you are not alone. I was trapped in that jungle more than once.</p>
<p>There are lots of tutorials, howtos, blog postings and documentations around which&nbsp;aim to help you converting a character set to UTF-8. Some are more helpful, some are less. But all have something in common: They have been written without&nbsp;considering how <i>your</i>&nbsp;system is configured. Analyzing your individual environment paired with a deep understanding of your components will probably serve much better than trial-and-error snippets. I'll try to give you an impression what that could mean.</p>
<h3>Taking all components and their interaction into account</h3>
<p>The architecture of a TYPO3 system is complex, since it consists of independent components, which are even interchangeable. The following questions are essentials  when thinking about character set conversion:</p><ul><li><b>Operating system</b> (Win, Linux, *BSD, ...): What's the default charset of your OS?&nbsp;Does it support UTF-8?</li><li><b>Filesystem</b>: What charset do the files have? Is it used consistently or mixed?</li><li><b>Webserver</b>: Which charset is used for serving static files?</li><li><b>Database</b>: This one is the most complex. The DB has various components, which can come with different charsets:<br /><br /><ul><li>Client: Which charset does the client use to display/process data?</li><li>Server: How does the server store the data?</li><li>Connection: What charset is used for data transfer?</li><li>...</li></ul></li><li><b>PHP</b>: There is a bunch of modules, which try to help with on-the-fly charset conversion: recode, mbstring, iconv, ... Which one you have, depends if the module is available for your&nbsp;PHP version and if it's enabled.</li><li><b>TYPO3</b>: What version do you use? What charset configuration?</li><li><b>The whole stuff mixed together</b>:&nbsp;What charset do the components use to interact with each other?</li><li>...</li></ul><p>Uff, much stuff! But this is just a loose and incomplete collection of items. I stopped brainstorming after a few minutes. I am sure there's much more to think (and write) about. I will not give you advices what things to do or not to do. As I already mentioned, there's a lot of writing out there in the web.</p>
<h3>Demonstrating&nbsp;my favorite issue</h3>
<p>This one was&nbsp;really tricky to find out. And it serves as a great example, how complex things can be:</p>
<h4>Updating from TYPO3&nbsp;4.1 (and earlier versions)  to 4.2 (and later)</h4>
<p>Some DB fields in 4.1 are of type BLOB (for example the TS templates). Most of these fields get converted to TEXT in 4.2. Now think about the following scenario, which seems to be&nbsp;common. The template was&nbsp;saved using TYPO3 4.1 and a DB using latin1 (ISO-8859-X) as charset. Then the DB converted to UTF-8 and TYPO3 was configured accordingly. You think you're finished because everything works will. But in most cases, there's still some latin1 formatted data in the BLOB fields. You just don't see. Once&nbsp;you upgrade TYPO3 to 4.2, these BLOBs get converted to TEXT, assuming the data is UTF-8. But it's latin1, because BLOB was not converted before. The result is a broken template. Lots of people in the mailing lists complain about whole parts missing. The reason is invalid non ascii characters (like umlauts äöüé¢ etc), which break&nbsp;the template view.</p>
<h4>How to avoid that?</h4>
<p>If you change the charset of TYPO3 and/or your DB, convert the BLOB fields&nbsp;to TEXT before charset conversion or make sure to convert the BLOB data otherwise.</p>
<h3>Lessons learned?</h3><ul><li>Don't believe that using snippets from the web will fit your needs 100%. Even if they are&nbsp;written by someone with good reputation and rated well, chances are that your system behaves different.</li><li>Structured Analysis&nbsp;paired with sufficient knowledge about CMS components are the best basis for successful administration. Trial-and-error will not always lead to a lucky punch and can be very disappointing.</li><li>Character set conversion is a complex task, even for the experienced administrators. Complex tasks are time-consuming, so calculate generously.</li><li>Design flaws can cause a disaster which might come up at a point you can't foresee. Using BLOB for text in databases is such a design flaw.</li></ul><h3>Finaly,&nbsp;a tiny helper extension</h3>
<p>Sometimes it's not easy to find out what charset TYPO3 uses when connecting to MySQL. Asking for help, you probably will be advised to provide the output of</p>
<pre>SHOW VARIABLES LIKE '%CHARACTER_SET%'</pre>
<p>But if you do that on the command line (using the mysql client) or in phpmyadmin, you might get a different result than TYPO3 would produce.</p>
<p>I have written a tiny <a href="http://typo3.org/extensions/repository/view/sm_charsethelper/current/" title="Extension in TER at typo3.org" class="external-link" >charset helper extension</a>, which shows the results from a true TYPO3 point-of-view (by using standard TYPO3 DB functions). It's available from TER and does not need any configuration. just install it and navigate to the&nbsp;module:</p>
<p><a href="http://typo3.org/extensions/repository/view/sm_charsethelper/current/" title="Charset helper extension in TER on typo3.org" class="external-link" >http://typo3.org/extensions/repository/view/sm_charsethelper/current/</a></p>]]></content:encoded>
			
			
			<pubDate>Thu, 23 Apr 2009 10:45:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Book review of &quot;TYPO Extension Development&quot; by Dmitry Dulepov</title>
			<link>http://www.t3node.com/blog/book-review-of-typo-extension-development-by-dmitry-dulepov/</link>
			<description>The market for english books on TYPO3 is still very thin - compared to german books. This possibly depends on the great popularity TYPO3 enjoys in germany. Unfortunately a lot of these german books are oversized. Few of them are concentrating on one audience (editors, administrators, developers) and their specific task, but covering the full range of topics on TYPO3. For a TYPO3 extension developer that meant to skip 3/4 of the content of most books. In contrast, &quot;TYPO3 Extension Development&quot; by Dmitry Dulepov, recently published by Packt Publishing has chosen a different approach.</description>
			<content:encoded><![CDATA[<p><a href="http://www.packtpub.com/typo3-extension-development" title="Book presentation by Packt publishing" class="external-link" >Dulepov, Dmitry (2008): TYPO3 Extension Development : Developer's guide to creating feature rich extensions using the TYPO3 API. Birmingham: Packt Publishing</a></p>
<h3>First impression</h3>
<p>The first positive impression when unpacking the book was that it covered only 217 pages.&nbsp;<img alt="Book cover image" style="padding-top: 16px; padding-bottom: 16px; padding-left: 16px; float: right;" src="uploads/RTEmagicC_dmitry_book_cover_01.jpg.jpg" width="120" height="148" /> It was looking like a book, which can be read entirely without getting tired of stuff you don't want to read anyway. As  the title implies, the book addresses TYPO3 extension developers, especially those without much experience in extension development.<br />It guides the reader through the complete process of extension development, covering both frontend plugins and backend  modules with well-chosen real world examples. <br />Although I feel quite familiar with the task of extension development, I was surprised that the book still revealed some gems of extension development for me, especially the in-depth study of frontend plugins (chapter 5). But more on that later.</p>
<h3>Book structure</h3>
<p> The <a href="http://www.packtpub.com/article/typo3-extension-development-table-of-contents" title="Table of contents of the book" class="external-link" >book is well structured</a>, starting with general topics on hacking with TYPO3 and getting more and more specific to the end. This reminded me of the <a href="http://dmitry-dulepov.com/article/slides-from-productivity-session.html" title="Slides of the productivity session on TYPO3 developer days 2008" class="external-link" >talks Dmitry held at T3DD08</a>, which were also very well organized and easy to follow. </p>
<h3>Chapter 1 (&quot;About TYPO3 API&quot;)</h3>
<p>The first chapter&nbsp;concentrates on TYPO3 API. Since the API is very huge, the chapter concentrates on the some relevant topics, leaving out unnecessary details which anyway could be found on the <a href="http://typo3.org/documentation/document-library/" title="Documentation section on typo3.org" class="external-link" >official documentation on typo3.org</a> or any <a href="typo3api/trunk/" title="TYPO3 API documentation hosted on this website" >doxygen created API docs</a>. It's flavored with some code examples which helps to understand the use of the discussed items. Since this is the first chapter of the book, I would have expected a more general introduction in the task of extending TYPO3, especially for the unexperienced user. </p>
<h3>Chapter 2 (&quot;Anatomy of a TYPO3 extension&quot;)</h3>
<p>The second chapter discusses the usual files inside an extension. It rather addresses people which are new to TYPO3 extension development, giving an overview about the purposes and uses of extension files and directories. Nevertheless it covers the mandatory knowledge for the following chapters. </p>
<h3>Chapter 3  (&quot;Planning Extensions&quot;)</h3>
<p>If you have already heard about the author <a href="http://dmitry-dulepov.com/" title="Personal blog by Dmitry Dulepov" class="external-link" >Dmitry Dulepov</a> and follow his blog, you'll probably won't be surprised about chapter 3. Dmitry doesn't hide his passion for elaborate planning. Consequently, this topic got a separate chapter. It guides you through general and TYPO3 specific planning questions, which need some thinking before starting to code. In practice the chapter describes the goals of the example extension, which will be coded in the following chapters. So don't fear to be confronted with boring theoretical stuff, but with tips which help to code standard-compliant extensions. </p>
<h3> Chapter 4 (&quot;Generating Extensions&quot;)</h3>
<p>This chapter is a guide on how to use the <a href="http://typo3.org/extensions/repository/view/kickstarter/current/" title="Kickstarter in the extension repository on typo3.org" class="external-link" >extension kickstarter</a> for generating the base structure of an extension. Like chapter 2 it also addresses people without or with less experience in extension development. Screenshots and their description explain the main sections of the kickstarter. Unfortunately only some parts of the kickstarter are discussed. Creating services and clickmenu items for example are not, which personally left me with a mixed feeling. If you depend on these kind of extension features, you'll have to search elsewhere for the necessary information. Fortunately, <a href="http://buzz.typo3.org/people/francois-suter/" title="Blog by Francois Suter" class="external-link" >François Suter</a> has recently published a completely rewritten <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_services/current/" title="Official documentation of TYPO services" class="external-link" >manual about TYPO3 services</a>.</p>
<h3> Chapter 5 (&quot;Frontend-Plugin: An In-Depth Study&quot;)</h3>
<p>Chapter 5 focuses on some particular parts of a TYPO3 extensions. These are plugin configuration, templating, localizing and caching, which are essential for frontend plugins. Each part and its particular difficulties are explained and demonstrated with code examples. Some of you probably got in contact with the deep jungle of TYPO3 caching, especially when reading the article <a href="http://typo3.org/development/articles/the-mysteries-of-chash/" title="Article about cHash by Kasper Skårhøj" class="external-link-new-window" >&quot;Mysteries of cHash&quot;</a> again and again, trying to finaly understand it. Dmitry manages to blaze a trail through that jungle with concise explanations and best practice examples. The only drawback in the caching chapter is a mistake in the noncached plugin example on page 111: it comes with <a href="http://typo3.org/documentation/document-library/references/doc_core_tsref/4.2.0/view/1/8/#id4292524" title="Chapter about USER and USER_INT object in TSref" class="external-link" >USER instead of USER_INT</a>. The alert reader will notice.</p>
<h3> Chapter 6 (&quot;Programming Frontend Plugins&quot;)</h3>
<p>This section is the longest part of the book and discusses the coding of crucial parts of a plugin. It does so by using an example extension which presents website users. The reader learns how to create single and list views by writing and linking together PHP code, HTML templates, TS and FlexForm configuration and a simple (but very cool) AJAX portion. It's amazing to see how Dmitry manages to code rich features with that few lines of code. My favorite part is the use of stdWrap inside PHP.</p>
<h3> Chapter 7 (&quot;Programming Backend Plugins&quot;)</h3>
<p>Chapter 7 is divided into two parts: database access by <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/4/1/" title="Chapter about TCA in the official TYPO3 core API documenation" class="external-link" >TCA (TYPO3 configuration array)</a> and backend modules. Since most of the TCA parts are created by the kickstarter, the first part is accordingly thin. It describes only the essential parts of TCA. If you are interested in more details, the official <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/" title="TYPO3 core API documentation on typo3.org" class="external-link" >core API documentation</a> might be a better place to browse. Well, back to Dmitrys book: The second part begins with a short excursion on essential functions for backend modules, followed by a step-by-step howto about implementing a full featured BE module. The example which is used here displays user and page statistics. For my taste this part contains too much code and not enough explanation.</p>
<h3>Chapter 8 (&quot;Finalizing Extensions&quot;)</h3>
<p>The last chapter leads the user through the documentation and publication process of an extension. A checklist helps to increase the overall quality of the extension.</p>
<h3>Index</h3>
<p> The book closes with an index, which is far too short. My first impression was that a page was missing in the book, but then I realized that the letters G, H, I, J, K, M, N ,O simply don't have any record in the index. That was very disappointing!</p>
<h3>Conclusion</h3>
<p>My overall impression of the book is that it contains many best practices in extension programming. It covers essential knowledge for coding a frontend extension with various features. Unfortunately the backend module part is too thin. Considering that the TYPO3 backend code is ugly and the API is hard to understand, this part should have deserved more attention. But altogether the book leaves the impression of a solid guide for extension developers. It was quite amusing to read because of its real-world examples. Finaly, don't forget to have a look at the various <a href="http://typo3.org/extensions/repository/?tx_terfe_pi1%5Bview%5D=search&amp;no_cache=1&amp;tx_terfe_pi1%5Bsword%5D=dulepov" title="List of Dmitrys extensions" class="external-link" >extensions Dmitry published and maintains</a>.</p>]]></content:encoded>
			
			
			<pubDate>Fri, 27 Mar 2009 23:19:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Added doxygen code documentation of TYPO3 trunk</title>
			<link>http://www.t3node.com/blog/added-doxygen-code-documentation-of-typo3-trunk/</link>
			<description>I have added a page with code documentation of TYPO3, generated with doxygen. It provides a nice overview of the latest code from trunk and allows to search for classes, functions and properties in the bleeding edge TYPO3 core.</description>
			<content:encoded><![CDATA[<p><a href="http://www.stack.nl/%7Edimitri/doxygen/" title="Homepage of the doxygen project" class="external-link" >Doxygen</a> scans the source code of your project and generates well structured overview of it. It extracts code comments, method signatures and method/class dependencies and merges them to form easy-to-read&nbsp;items:</p>
<p><img alt="Screenshot of the TYPO3API generated with doxygen" style="padding-top: 4px;" src="fileadmin/user_upload/images/doxygen-example.jpg" width="530" height="285" /></p>
<p>After searching a while for an existing version of TYPO3 trunk without success, I decided to generate my own. You can find the <a href="typo3api/trunk/" title="TYPO3 core API of trunk" >TYPO3 core API of trunk</a> on a seperate page of this website.</p>
<p>The search form allows you to find any function in the TYPO3 core within a few seconds and get all&nbsp;facts of its use,&nbsp;parameters and dependencies to other classes/functions. It gets updates on a regular basis via cron.&nbsp;If you like it, you can use it:</p>
<p><a href="typo3api/trunk/" title="TYPO3 core API of trunk" >http://www.t3node.com/typo3api/trunk/</a> </p>]]></content:encoded>
			
			
			<pubDate>Wed, 11 Mar 2009 15:53:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Is SQL injection possible in TypoScript objects?</title>
			<link>http://www.t3node.com/blog/is-sql-injection-possible-in-typoscript-objects/</link>
			<description>Using GET/POST vars in SQL queries involves the risk of SQL injection if the parameter is not properly sanitized. There are lots of warnings and documents around in the web on how to prevent this in PHP scripts. But what about TypoScript?</description>
			<content:encoded><![CDATA[<p>The&nbsp;<a href="http://typo3.org/documentation/document-library/references/doc_core_tsref/4.2.0/view/1/8/#id4251042" title="The CONTENT object section TSref" class="external-link" >TypoScript object&nbsp;CONTENT</a> allows you to build SQL queries without the use of PHP. Have a look at the following (nonsense) example:</p>
<pre>page = PAGE<br />page.10 = CONTENT<br />page.10 {<br />&nbsp; table = tt_content<br />&nbsp; select {<br />&nbsp;&nbsp;&nbsp; pidInList = 123<br />&nbsp;&nbsp;&nbsp; where = deleted=0<br />&nbsp;&nbsp;&nbsp; andWhere.data = GP:my_test|uid<br />&nbsp;&nbsp;&nbsp; andWhere.wrap = uid=|<br />&nbsp; }<br />}</pre>
<p>The content of page.10 is a content element of page 123. To choose a certain&nbsp;content element, you can use a GET/POST parameter as the uid.</p>
<h3>See it working</h3>
<p>To see the example working, add some content elements to a page. We use page 123 in this example. Then note the uid of one of these content elements. In the example we use 42. Go to the frontend page in your browser and query the page:</p>
<pre>http: //yourdomain.tld/index.php?id=123&amp;my_test[uid]=<i>42</i></pre>
<p>This will output&nbsp;the content element with uid 42 on any page.</p>
<h3>See the SQL injection working</h3>
<p>What's the matter with this? The GET variable <i>my_test[uid]</i> is used inside a SQL query without being sanitized, open for SQL injection! Just try this URL:</p>
<pre>http: //yourdomain.tld/index.php?id=123&amp;my_test[uid]=<i>42 OR 1=1</i></pre>
<p>You should now see ALL content elements of your website. This is because <i>OR 1=1</i> is injected and processed in the SQL WHERE clause.</p>
<h3>How to prevent this?</h3>
<p>The GP parameter <i>my_test[uid]</i> should only accept integer values. In PHP one could use the <a href="http://www.php.net/intval" title="intval() function reference on www.php.net" class="external-link" >function intval()</a> to make sure the given value gets converted to type integer. Luckily, there is an equialent in TypoScript for that. select.andWhere has <a href="http://typo3.org/documentation/document-library/references/doc_core_tsref/4.2.0/view/1/5/#id4149585" title="stdWrap section in TSref" class="external-link" >stdWrap properties</a>, so we&nbsp;can use the intval property inside andWhere. The above TypoScript snippet would then look like this: </p>
<pre>page = PAGE<br />page.10 = CONTENT<br />page.10 {<br />&nbsp; table = tt_content<br />&nbsp; select {<br />&nbsp;&nbsp;&nbsp; pidInList = 123<br />&nbsp;&nbsp;&nbsp; where = deleted=0<br />&nbsp;&nbsp;&nbsp; andWhere.data = GP:my_test|uid<br />&nbsp;&nbsp;&nbsp; andWhere.wrap = uid=|<br />&nbsp;&nbsp;&nbsp; <b>andWhere.intval = 1</b><br /> &nbsp; }<br />}</pre>
<p>Be careful, whenever you create SQL queries which processes GET/POST parameters. Using TypoScript solely does not avoid the danger of SQL injection.</p>]]></content:encoded>
			
			
			<pubDate>Thu, 05 Mar 2009 13:24:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Add CSH to TYPO3 FlexForm fields</title>
			<link>http://www.t3node.com/blog/add-csh-to-typo3-flexform-fields/</link>
			<description>In the previous article I came up with a short introduction to adding context sensitive help to backend modules of TYPO3. Now let's have a look at FlexForms.</description>
			<content:encoded><![CDATA[<p>As already shown in the <a href="blog/how-to-add-context-sensitive-help-csh-items-to-typo3-extension/" >previous article about context sensitive help</a> (CSH), adding CSH to backend modules does not mean much effort. What about FlexForms?</p>
<p>Since TYPO3 4.2 CSH is also supported for FlexForm fields. Integration is very easy since you only have to create a file with the CSH content and add a line to your FlexForm pointing to that file. Have a look at the following example.</p>
<p>As always the FlexForm is configured in XML. The item which points  to the location of the CSH content must be placed inside the &lt;ROOT&gt;&lt;TCEforms&gt; tags. The name of the element is cshFile (and it's case sensitive!).</p>
<p>The FlexForm file&nbsp;<i>your_extkey/pi1/flexform_ds.xml</i> looks like this:</p>
<pre>&lt;T3DataStructure&gt;<br />  &lt;meta&gt;<br />&nbsp;   &lt;langDisable&gt;1&lt;/langDisable&gt;<br />&nbsp; &lt;/meta&gt;<br />&nbsp; &lt;sheets&gt;<br />&nbsp;   &lt;sDEF&gt;<br />&nbsp;&nbsp;&nbsp;   &lt;ROOT&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &lt;TCEforms&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &lt;sheetTitle&gt;The title of the sheet&lt;/sheetTitle&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>&lt;cshFile&gt;LLL:EXT:your_extkey/pi1/locallang_csh_flexform.xml&lt;/cshFile&gt;</b><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/TCEforms&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &lt;type&gt;array&lt;/type&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;el&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &lt;yourField&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &lt;TCEforms&gt;<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;  &lt;label&gt;Label of the the field&lt;/label&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;config&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ... field configuration ...<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/config&gt;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/TCEforms&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/yourField&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/el&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ROOT&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/sDEF&gt;<br /> &nbsp;&lt;/sheets&gt;<br />&lt;/T3DataStructure&gt;</pre>
<p>The significant line is marked in strong letters. Next step is to add the CSH content as already shown in the previous article.</p>
<p>The file should be named <i>your_extkey/pi1/locallang_csh_flexform.xml</i></p>
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot; ?&gt;<br />&lt;T3locallang&gt;<br />&nbsp; &lt;meta type=&quot;array&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;description&gt;CSH labels for FlexForm fields&lt;/description&gt;<br />&nbsp;&nbsp;&nbsp; &lt;type&gt;CSH&lt;/type&gt;<br />&nbsp;&nbsp;&nbsp; &lt;csh_table&gt;&lt;/csh_table&gt;<br />&nbsp;&nbsp;&nbsp; &lt;fileId&gt;EXT:your_extkey/pi1/locallang_csh_flexform.xml&lt;/fileId&gt;<br />&nbsp;&nbsp;&nbsp; &lt;labelContext type=&quot;array&quot;&gt;&lt;/labelContext&gt;<br />&nbsp; &lt;/meta&gt;<br />&nbsp; &lt;data type=&quot;array&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;languageKey index=&quot;default&quot; type=&quot;array&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;yourField.alttitle&quot;&gt;alternative title&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;yourField.description&quot;&gt;description&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;yourField.details&quot;&gt;details&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;yourField.syntax&quot;&gt;syntax&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;yourField.image_descr&quot;&gt;image caption&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;yourField.image&quot;&gt;gfx/i/pages.gif&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;yourField.seeAlso&quot;&gt;pages:starttime&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/languageKey&gt;<br />&nbsp; &lt;/data&gt;<br />&lt;/T3locallang&gt;</pre>
<p>That's even more simple than adding CSH to a BE module. At the time of writing this article, one features does not yet work as it does for TCA fields. Hovering the mouse pointer over a field title should trigger a popup which shows the title and description of the field. This does not work in FlexForms. I have <a href="http://bugs.typo3.org/view.php?id=10575" title="Feature request to add the missing CSH hover popup to FlexForm fields" class="external-link" >opened a bug</a> and submitted a patch to the core list to fix this issue and hope it will be resolved in the forthcoming 4.3 release. In the context of the bugreport you can also find a <a href="http://bugs.typo3.org/file_download.php?file_id=6898&amp;type=bug" title="Extension download as .t3x file" class="external-link" >test extension</a>, which serves as a showcase for FlexForm CSH integration.</p>]]></content:encoded>
			
			
			<pubDate>Wed, 04 Mar 2009 00:02:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>How to add context sensitive help (CSH) items to TYPO3 extension modules</title>
			<link>http://www.t3node.com/blog/how-to-add-context-sensitive-help-csh-items-to-typo3-extension/</link>
			<description>Software documentation is often rare and developers are lazy, when writing manuals instead of code. TYPO3 comes with a built-in help system which can easily be used to explain items directly in the backend. Dear lazy coder, let's have a look at it!</description>
			<content:encoded><![CDATA[<p>I guess CSH is one of the most obvious but yet overseen feature of the backend. That's no surprise given the large quantity of icons. But the backend has been cleaned up very much with the release of 4.2. So there's no more excuse to omit CSH in your extension.&nbsp;I recently added CSH to  the <a href="http://typo3.org/extensions/repository/view/devlog/current/" title="devlog extension in TER on typo3.org" class="external-link" >Developer's Log extension</a> and would like to demonstrate some of the main techniques to add CSH to a BE module.</p>
<p>All you need to have is:</p><ol><li>the content itself, put into a classic locallang file called locallang_csh_txYOUREXTKEY.xml</li><li>the item, placed in mod/index.php</li><li>a reference to tell the extension manager about the  locallang file</li></ol><p>Let's start with the first one. I prepared a skeleton file, which explains the most significant fields:</p>
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;yes&quot; ?&gt;<br />&lt;T3locallang&gt;<br />&nbsp;&nbsp; &lt;meta type=&quot;array&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;CSH contents of myextkey module&lt;/description&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type&gt;CSH&lt;/type&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;csh_table&gt;_MOD_tools_txmyextkeyM1&lt;/csh_table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileId&gt;EXT:myextkey/locallang_csh_txmyextkey.xml&lt;/fileId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;labelContext type=&quot;array&quot;&gt;&lt;/labelContext&gt;<br />&nbsp;&nbsp; &lt;/meta&gt;<br />&nbsp;&nbsp; &lt;data type=&quot;array&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;languageKey index=&quot;default&quot; type=&quot;array&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;.alttitle&quot;&gt;Module title&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;.description&quot;&gt;<br />            This part describes the module and is also shown<br />            when hovering over the CSH icon [hover]<br />         &lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;.syntax&quot;&gt;<br />            This part is a predefined section and<br />            can be used to demonstrate coding syntax.<br />         &lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;mod_itemname.alttitle&quot;&gt;Item title&lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;mod_itemname.description&quot;&gt;<br />            This part describes a certain item [hover]<br />         &lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;mod_itemname.details&quot;&gt;<br />            This part gives more details of the item<br />         &lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label index=&quot;mod_itemname.image&quot;&gt;<br />           EXT:myextkey/res/imagefile.png<br />         &lt;/label&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/languageKey&gt;<br />&nbsp;&nbsp; &lt;/data&gt;<br />&lt;/T3locallang&gt;</pre>
<p>Next, add a CSH item to the content of the module. Of course you can have more than one item:</p>
<pre>$content .= t3lib_BEfunc::cshItem(<br />&nbsp;&nbsp; '_MOD_'.$GLOBALS['MCONF']['name'],<br />&nbsp;&nbsp; 'mod_'.$str,<br />&nbsp;&nbsp; $GLOBALS['BACK_PATH'],<br />&nbsp;&nbsp; '|',<br />&nbsp;&nbsp; FALSE,<br />&nbsp;&nbsp; 'margin-bottom:0px;'<br />);</pre>
<p>The function <a href="http://www.typo3-unleashed.net/typo3apidocs/typo3api_4.2.5/html/d9/de0/classt3lib__BEfunc.html#0367d1b87897e560e62bbb843f56c865" title="Source code documentation of the TYPO3 API" class="external-link" >cshItem() is well documented inside the source code</a>. I was lazy and simply copied the descriptions from the sources:</p>
<pre>string &nbsp; Table name ('_MOD_'+module name)<br />string&nbsp;&nbsp; Field name (CSH locallang main key)<br />string &nbsp; Back path<br />string &nbsp; Wrap code for icon-mode, splitted by &quot;|&quot;.<br />         Not used for full-text mode.<br />boolean &nbsp;If set, the full text will never be shown (only icon).<br />         Useful for places where it will break the page<br />         if the table with full text is shown.<br />string &nbsp; Additional style-attribute content<br />         for wrapping table (full text mode only) </pre>
<p>Finally add a reference to ext_tables.php to tell the extension manager about the CSH:</p>
<pre>t3lib_extMgm::addLLrefForTCAdescr(<br />   '_MOD_tools_txmyextkeyM1',<br />   'EXT:myextkey/locallang_csh_txmyextkey.xml'<br />);</pre>
<p>That's all you need to do for a backend module. You can find out more about CSH in the <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_inside/4.2.0/view/2/9/" title="Chapter about CSH in Inside TYPO3 (Core Architecture) at typo3.org" class="external-link" >Inside TYPO3</a> documentation.</p>]]></content:encoded>
			
			
			<pubDate>Thu, 26 Feb 2009 00:22:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Added some Description in german</title>
			<link>http://www.t3node.com/blog/added-some-description-in-german/</link>
			<description>People sometimes ask me about a german version of this website. Although I am a native german speaker I do not plan to translate this blog to german. Nevertheless, I added a page with descriptions about me and this site in german.</description>
			<content:encoded><![CDATA[<p>The new <a href="steffen-mueller/" title="Opens internal link in current window" class="internal-link" >page with german comments</a> should not only give non-english users an impression about my work, but also  improve  the website ranking in the german google index.&nbsp;</p>]]></content:encoded>
			
			
			<pubDate>Sun, 15 Feb 2009 21:56:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Why OpenOffice.org and Zotero are not communicating</title>
			<link>http://www.t3node.com/blog/why-openofficeorg-and-zotero-are-not-communicating/</link>
			<description>For my thesis I use OpenOffice.org in combination with Zotero (Firefox) to manage my references. (I already posted an article about Zotero over a year ago.) Both are powerful tools, but sometimes they are troublemakers...</description>
			<content:encoded><![CDATA[<p><a href="http://www.zotero.org/" title="Zotero Homepage" class="external-link" >Zotero</a> provides its services via HTTP, using TCP port 50001 on localhost. <a href="http://www.openoffice.org/" title="OpenOffice.org Homepage" class="external-link" >OpenOffice.org</a> on the other side uses an Extension to build a bridge to Zotero by connecting to that service. To be able to access my bibliography from OpenOffice.org, Firefox/Zotero has to be running all the time.</p>
<p>To get a quick impression about what services are listening on what socket (IP/port), I use netstat:</p>
<pre>spock@cayenne:~$ netstat -ltpn<br /><br />Proto Recv-Q Send-Q Local Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foreign Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PID/Program name<br />tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:3690&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:50001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11201/firefox&nbsp;&nbsp; <br />tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:631&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;</pre>
<p>Whenever I am at home, OpenOffice.org and Zotero are running as expected. As soon as I leave home (e.g. to spend a day in the library) OpenOffice.org refuses to connect to Zotero, complaining that Zotero might not be running:</p>
<p class="align-center"><img alt="OpenOffice.org / Zotero error message" src="fileadmin/user_upload/zotero/ErrorZoteroOpenoffice.png" width="502" height="106" /></p>
<p>But Zotero was up and running?! I remembered I had this error before, when updating Zotero to a new version without updating the OpenOffice.org extension. But this time there was no update.</p>
<p>After some investigation, I found out that one can turn on the logging of Zotero using <a href="http://www.mozillazine.org/misc/about:config/" title="Read more on about:config in MozillaZine knowledge base" class="external-link" >about:config</a> in Firefox (extensions.zotero.debug.log = true). The logs revealed that Zotero wasn't able to to offer it's HTTP service, because Firefox is in offline mode:</p>
<pre>(...)<br />Browser is offline -- not initializing integration HTTP server<br />(...)</pre>
<p>netstat could also not find Firefox listening on port 50001:</p>
<pre>spock@cayenne:~$ netstat -ltpn<br /><br />Proto Recv-Q Send-Q Local Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foreign Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PID/Program name<br />tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:3690&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:631&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - </pre>
<p>The laptop I use for writing is always online at home. In the library it is usually offline except for the localhost dummy interface (127.0.0.1). Firefox on Ubuntu Intrepid seems to switch to offline mode, if no outbound network connection can be found. In offline mode, Zotero does not provide its service at all, although it does in no way depend on an outbound network.</p>
<p>The solution was to switch to online mode in Firefox, which lets Zotero start its service immediately.</p>
<p>What can we learn from the story?</p><ul><li>Do not blindly believe in error logs: They sometimes don't tell the whole truth. Instead of precisely describing the problem, the OpenOffice.org popup made useless suggestions (&quot;Make sure Firefox is open&quot;).</li><li>Do not blindly wipe away error logs: Chances are, that you find the reason for your problem inside. Zotero loggin was hard to find, but then revealed the root of my problem.</li></ul>]]></content:encoded>
			
			
			<pubDate>Fri, 06 Feb 2009 00:10:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>How to create a page browser in TYPO3 extensions?</title>
			<link>http://www.t3node.com/blog/how-to-create-a-page-browser-in-typo3-extensions/</link>
			<description>Hugh data listings can be confusing and hard to understand. That applies to search results as well as news collections, members directory or todo lists. Page browser divide listings into several parts, which make it much easier to keep track of the data. The following article describes and compares two approaches to integrate a page browser in TYPO3 extensions.</description>
			<content:encoded><![CDATA[<h3>Function tslib_pibase::pi_list_browseresults()</h3>
<p>For a considerable time, TYPO3 ships an out-of-the-box function to add a page browser to your plugin. The function <a href="http://www.typo3-unleashed.net/typo3apidocs/typo3api_4.2.5/html/df/d32/classtslib__pibase.html#7a2b0e2292b0bfbd3b950df24ffc94ff" title="Reference of the function kindly provided by Thomas Hempel" class="external-link" >pi_list_browseresults</a> is part of&nbsp;the cObject and is called by:</p>
<pre>$content .= $this-&gt;pi_list_browseresults(<br />   $showResultCount=1,<br />   $tableParams='',<br />   $wrapArr=array(),<br />   $pointerName='pointer',<br />   $hscText=TRUE<br />);</pre>
<p>Unfortunately the output of the function is a HTML table which is semantically not a proper form for a page browser. The configuration misses the power of common templating, although you could serve most needs with  TypoScript wraps. To find out how to implement pi_list_browseresults, you'll either have to dig into some 3rd party extensions or search the archives for comments. Therefore we leave this function as is  and turn to another approach.</p>
<h3>Extension &quot;Universal page browser&quot; (pagebrowse)</h3>
<p>The <a href="http://typo3.org/extensions/repository/view/pagebrowse/current/" title="Extension overview in TER" class="external-link-new-window" >Universal page browser</a> extension from TER is meant to be used inside your plugin as a powerful alternative to pi_list_browseresults. The styling of the page browser is done by  HTML templating and is controlled by TypoScript setup. It can be used inside any extension by integrating it as a USER or USER_INT cObject. (Details on how to do that are perfectly explained in one of <a href="http://typo3bloke.net/post-details/do_you_need_a_page_browser_for_your_typo3_extension/" title="Blog posting by Dmitry Dulepov about pagebrowser integration" class="external-link" >Dmitrys blog postings</a>). Additional hooks give you the possibility to keep control of the generation of the page browser. The extension has a straight&nbsp;documentation,&nbsp;describing the implementation with commented code snippets.</p>
<h3>Comparison result</h3>
<p>Both approaches allow the integration of a page browser into your frontend plugin. The convincing documentation and the HTML styling ability of the  &quot;Universal page browser&quot; extension finaly make the difference, especially if you rather rely on&nbsp;standard writings than on searching for code snippets.</p>]]></content:encoded>
			
			
			<pubDate>Tue, 03 Feb 2009 23:30:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Creating a diff of OpenOffice .odt documents on the command-line</title>
			<link>http://www.t3node.com/blog/creating-a-diff-of-openoffice-odt-documents-on-the-command-line/</link>
			<description>I just found a little easter egg to create diffs of OpenOffice.org documents (*.odt) on the command-line.</description>
			<content:encoded><![CDATA[<p>All you need to have the following two new tools:</p><ol><li><a href="http://stosberg.net/odt2txt/" title="Project homepage (in german only)" class="external-link" >odt2txt</a> for extracting the content of an OpenOffice.org document. (A Debian package is available)</li><li><a href="http://www-verimag.imag.fr/~moy/opendocument/" title="Creating diffs with opendocument files" class="external-link" >oodiff</a> for comparing the content.</li></ol><p>The real easter egg is that you can compare your&nbsp;local copy with the latest subversion revision. Well, oodiff does not really connect to subversion, but uses a local copy of the  .svn directory. Git and Mercurial are also supported.</p>
<p>&nbsp;</p>]]></content:encoded>
			
			
			<pubDate>Sun, 07 Dec 2008 21:42:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Testing the forthcoming TYPO3 caching framework with memcached</title>
			<link>http://www.t3node.com/blog/testing-the-forthcoming-typo3-caching-framework-with-memcached/</link>
			<description>I just did some quick tests with the forthcoming caching framework of TYPO3. The results were surprising, although not the way I did expect.</description>
			<content:encoded><![CDATA[<p> The caching framework was backported from FLOW3 for the forthcoming 4.3 release. The first&nbsp;commited version had some issues with memcached, so I decided to wait for a full working version.<img alt="Engine" title="Diesel power" style="padding-top: 16px; padding-left: 16px; float: right; padding-bottom: 16px;" src="fileadmin/user_upload/images/engine.jpg" width="250" height="175" />&nbsp;Dmitry fixed the issues some days ago and <a href="http://typo3bloke.net/post-details/how_to_enable_memcached_cache_in_typo3_43/" title="Blog posting by Dmitry Dulepov" class="external-link" >posted a small howto</a> in his blog on using memcache as a caching backend for TYPO3 pagecache.</p>
<p>Today, I tried to see how it works. The setup for TYPO3 was really easy and it worked without any problems. Installing memcached and php module on Debian was a nobrainer, so no time was wasted.</p>
<p>But my first tests were a bit disappointing. First, I used memcached on a lightweight virtualbox and the gain of using memcached instead of DB tables for cache_* &quot;tables&quot; was zeeeeero: </p>
<pre> ab -c 100 -n 5000 http ://virtual.box.test/ </pre>
<p>The tests revealed ridiculous  <b>8 req/s</b> (mean) both using DB tables and memcached for caching.  I realized, that&nbsp;the CPU could have been the bottleneck, because it immediately went to 100%. My conclusion was that the virtual box was too lame to get&nbsp;significant results. So I decided to switch to a real machine.</p>
<p>I decided to use an AMD BE-2350 machine for further tests.</p>
<pre> ab -c 100 -n 5000 http ://physical.box.test/ </pre>
<p>The same basic tests with ApacheBench resulted in overall better performance and a slightly difference between memcached <b>(170 req/s</b>) and classic caching (<b>135 req/s</b>). But still not the boost I had expected. Once again looking at the CPU load, it was 100%. Most load was caused by fcgid and mysql, but I couldn't do any further tests because midnight cronjobs started and I did'nt want to stop them.</p>
<p>The next step will be to replay the tests on a machine using mod_php instead of fcgid. But I'm also looking forward for some more reports from the community to crosscheck my own results.</p>
<p>Anyway, the backport of the caching framework is very good work. It spends hope to have a smooth migration path to FLOW3 and TYPO3 v.5. So a big <b>thank you</b> goes out to core devs&nbsp; for their efforts.</p>]]></content:encoded>
			
			
			<pubDate>Thu, 04 Dec 2008 00:42:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Thunderbird add–on to comfortably switch threaded view between all and unread only</title>
			<link>http://www.t3node.com/blog/thunderbird-addon-to-comfortably-switch-threaded-view-between-all-and-unread-only/</link>
			<description>The header almost says it all: TYPO3 core developer Dmitry Dulepov has just published the Thunderbird add-on &quot;Thread Views&quot; which enhances usability when reading newsgroup threads. The add-on allows you to comfortably switch a threaded view between all and unread only. It provides some kind of a shortcut buttons, which help you to save some time.
This is the regular view on all threads of a newsgroup:

You can hide all threads which do not have any unread postings:

I did test it and it works as expected. Thanks, Dmitry. It really helps me.</description>
			<content:encoded><![CDATA[<p>The header almost says it all: TYPO3 core developer <a href="http://www.t3node.com/?id=" title="Blog posting by Dmitry Dulepov about his new Thunderbird add-on" class="external-link" >Dmitry Dulepov</a> has just published the <a href="https://addons.mozilla.org/en-US/thunderbird/addon/9743/" title="The add-on website in the official Thunderbird add-on repository" class="external-link" >Thunderbird add-on &quot;Thread Views&quot;</a> which enhances usability when reading newsgroup threads. The add-on allows you to comfortably switch a threaded view between <i>all</i> and <i>unread only</i>. It provides some kind of a shortcut buttons, which help you to save some time.</p>
<p>This is the regular view on all threads of a newsgroup:</p>
<p><img style="border-style: solid; border-width: thin;" alt="Thunderbird screenshot showing all threads" src="fileadmin/user_upload/images/show_all.png" width="443" height="197" /></p>
<p>You can hide all threads which do not have any unread postings:</p>
<p><img style="border-style: solid; border-width: thin;" alt="Thunderbird screenshot showing only threads with unread postings" src="fileadmin/user_upload/images/show_unread_only.png" width="437" height="153" /></p>
<p>I did test it and it works as expected. Thanks, Dmitry. It really helps me.</p>]]></content:encoded>
			
			
			<pubDate>Fri, 28 Nov 2008 22:58:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>FE plugins need configurable baseWrap instead of static pi_wrapInBaseClass</title>
			<link>http://www.t3node.com/blog/fe-plugins-need-configurable-basewrap-instead-of-static-pi-wrapinbaseclass/</link>
			<description>The output of most TYPO3 FE plugins are wrapped with a HTML div container by default (so called basewrap). This seems to be fair in most cases, but sometimes it is not and you have to get rid of them. Unfortunately, a lot of extensions including some of the most popular ones don't provide any control to handle this. This article describes how to do it better.</description>
			<content:encoded><![CDATA[<h3>Problem</h3>
<p>The convention to wrap the plugin content with an additional div container is not fair in any case. It should be configurable.</p>
<p>We usually find the following piece of code at the end of the main() function:</p>
<pre> return $this-&gt;pi_wrapInBaseClass($content); </pre>
<p>The reason for this might be boilerplate code from the extension kickstarter.</p>
<h3>Criticism</h3>
<p>This is not only a lack in usability, but one more violation of the MVC pattern. The method adds additional HTML tags to the content. This should be part of the view and not the controller. One could make the objection that tslib_pibase anyway does not follow the MVC pattern. If so, we still have to face the usability aspect.</p>
<h3>Solution</h3>
<p>In TYPO3 the output can be controlled by TypoScript. We should make use of it to provide a baseWrap option making that stuff configurable:</p>
<pre>public function main($content, $conf) {<br />  // (...)<br /> &nbsp;return $this-&gt;baseWrap($content);<br />}<br /> <br />protected function baseWrap($content) {<br />  if (isset($this-&gt;conf['baseWrap.'])) {<br /> &nbsp;&nbsp; return $this-&gt;cObj-&gt;stdWrap($content,$this-&gt;conf['baseWrap.']);<br /> &nbsp;} else {<br /> &nbsp;&nbsp; return $this-&gt;pi_wrapInBaseClass($content);<br />  }<br />} </pre>
<p>The content gets wrapped with the container by default, so backward compatibility is guaranteed. If user wishes to change that, he could use the stdWrap functions with baseWrap in his TS setup:</p>
<pre> plugin.tx_pluginname_pi1 {<br /> &nbsp; # Remove basewrap div container<br /> &nbsp; baseWrap.wrap = |<br /> } </pre>
<p>It takes you only a few minutes to do the magic.</p>
<p>Thanks to <a href="http://buzz.typo3.org/people/francois-suter/" title="Blog of Francois at buzz.typo3.org" class="external-link" >Francois Suter</a> for his inspiration.</p>]]></content:encoded>
			
			
			<pubDate>Wed, 26 Nov 2008 20:10:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>How to link to a file in a FE plugin of TYPO3?</title>
			<link>http://www.t3node.com/blog/how-to-link-to-a-file-in-a-fe-plugin-of-typo3/</link>
			<description>This short snippet demonstrates the essentials of how to create links to files in FE plugins. It reveals the power of cObjects and TypoScript. This technique is typical for TYPO3 and it shows you why TYPO3 can be so amazing.</description>
			<content:encoded><![CDATA[<p>This posting is not meant as a tutorial shipping complete sources, but a snippet to give you an impression of the essentials. So don't be disappointed if you won't find some ready-to-paste snippets.</p>
<p>The idea is to create a link to a file, which is set in the media field of the page. You can find this field in the page properties below the ressources tab and its label in the backend is &quot;Files&quot;.</p>
<p>Once you have chosen the file in the backend, it gets copied to the uploads/media/ directory. In the plugin, we need to get the filename and then simply build a link around it. &quot;That's easy&quot;, you might think, &quot;just get the filename from TSFE and put some a href tag around it and it's finished&quot;. But as this snippet will show, you don't need to think about HTML at all. The magic lies inside the <a href="http://typo3.org/documentation/document-library/references/doc_core_tsref/4.1.0/view/5/13/" title="filelink function reference in TSref" class="external-link" >filelink function</a> of TypoScript.</p>
<pre>// path to the file<br />$filePath = 'uploads/media/'.$GLOBALS['TSFE']-&gt;page['media'];<br />// use the filelink function to create a rich feature link<br />$content = $this-&gt;cObj-&gt;filelink(<br />  $filePath,<br />  $this-&gt;conf['fileLink.']<br />); </pre>
<p>This is only a few lines of PHP code! Next we need to configure the filelink with in the TypoScript setup of the plugin:</p>
<pre>plugin.tx_myplugin_pi1 {<br />&nbsp; fileLink {<br />&nbsp;&nbsp;&nbsp; file.noTrimWrap = | | |<br />&nbsp;&nbsp;&nbsp; labelStdWrap.data = page:media<br />&nbsp;&nbsp;&nbsp; icon = 1<br />&nbsp;&nbsp;&nbsp; icon_link = 1<br />&nbsp;&nbsp;&nbsp; size = 1<br />&nbsp;&nbsp;&nbsp; size.wrap = (|)<br />&nbsp;&nbsp;&nbsp; size.bytes = 1<br />&nbsp;&nbsp;&nbsp; size.bytes.labels = &quot; B| KB| MB| GB&quot;<br />&nbsp; }<br />}</pre>
<p>The result is a full featured link with an icon corresponding to the content type and the size of the file:</p>
<p><img src="fileadmin/user_upload/examples/demo.png" style="width: 206px; height: 60px;" alt="" /></p>]]></content:encoded>
			
			
			<pubDate>Mon, 24 Nov 2008 20:49:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Best kept TYPO3 secret: WAF</title>
			<link>http://www.t3node.com/blog/best-kept-typo3-secret-waf/</link>
			<description>The security team long time ago promised to release a ruleset for a Web Application Firewall (WAF) based on Apache's mod_security. Some are still waiting for an official announcement after the conference talk at T3CON07. And some have heard about it on todays talk at T3CON08.</description>
			<content:encoded><![CDATA[<p>For those who can't wait any longer for official announcements: it's already there since, well, since the beginning of this year I guess. The <a href="http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-project-waf" title="The archive of the TYPO3 Mailinglist about WAF" class="external-link" >waf-newsgroup</a> lacks a bit in activity (4 postings in one year), but one postings already revealed the secret on January 2008:</p>
<p><b>The ruleset hides at <a href="http://typo3.org/waf.txt" title="mod_security WAF ruleset for TYPO3" class="external-link" >http://typo3.org/waf.txt</a></b></p>
<p>I didn't test it but had a quick look at the file. It's a quite short configuration and I could not spot any TYPO3 specific rules. One lines points to an external file called modsecurity_crs_9999_typo3.conf but I couldn't find that file. Well, waf.txt also reveals that the current version was written on September, 2007. So maybe a newer one is already released, but kept secret somewhere else ;-)</p>]]></content:encoded>
			
			
			<pubDate>Fri, 10 Oct 2008 23:22:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Internet service provider Alice unsolicitedly acts as content provider</title>
			<link>http://www.t3node.com/blog/internet-service-provider-alice-unsolicitedly-acts-as-content-provider/</link>
			<description>Since a few days, the Internet service provider Alice (Hansenet / Telecom Italia) abuses my DSL connection by showing unsolicited advertisements. I cannot accept this behavior.</description>
			<content:encoded><![CDATA[<p>Browser requests to non-existent DNS names are redirected to an advertising website with google ads. What they call &quot;service&quot;, in my opinion is abuse. I never asked for this kind of service. I pay them as an internet service provider and not as a content provider. If they earn money by forcing me to watch google ads, I insist to get paid for that. Also I don't want to be bugged by non functional opt-out links which do not stop this crap. Last but not least, it is a privacy interference, because phrases of my requests are used as subject for the google ads and probably forwarded to some third party.</p>
<p>Not only are they breaking internet standards and abuse privacy, but they act as a content provider. And this may have adverse consequences for them:<br />In Germany, all content providers (&quot;Anbieter von Mediendiensten&quot;) are forced by law (&quot;Telemediengesetzes&quot;) to maintain an impress on their website. If they do not, they risk to get some kind of cease-and-desist order (&quot;Abmahnung und Unterlassungsaufforderung&quot;), which not only costs money but could turn press spotlights on this abuse. This hopefully attracts lawyers as well as the press and stops this nonsense.</p>
<p>Btw,  Verisign once started a similar &quot;service&quot; which earned lots of critique. They could have learned from that.</p>
<p>Now finally, let's welcome Alice on my personal blacklist of companies-to-be-never-recommended.</p>]]></content:encoded>
			
			
			<pubDate>Thu, 09 Oct 2008 17:34:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Thoughts about classifying objects in a digitalized world</title>
			<link>http://www.t3node.com/blog/thoughts-about-classifying-objects-in-a-digitalized-world/</link>
			<description>While reading for my thesis, I found some interesting articles about order and hierarchies in the web. One central issue in a digitalized world is the question of how to classify objects.</description>
			<content:encoded><![CDATA[<p>Before thinking about classification in a digital environment, it might be useful to take a look at the good old analog world. What's the difference between classification of objects in an analog and a digital world? When we face a large quantity of objects, we tend to order them to keep track of the sheer complexity. One way to deal with that, is to categorize things in a hierarchical order.</p>
<p>For example, a friend of mine is collecting music records. He needs to order the records in his shelf to be able to quickly find a particular album. He chose the following hierarchical order:</p>
<pre> 1. Genre<br /> 2. Musician/Band name<br /> 3. Album name </pre>
<p>This kind of order is sufficient to find most of his albums. But from time to time, he has to face the situation to be wary about which genre to choose for a new album. Dub, Reggae or Ska? The circumstance to decide in terms of <i>either/or</i> pushes him into the uncomfortable situation of making more or less poor decisions.</p>
<p>Now think about digitalizing all his records. The usual way to structure the digital copies is to save each song as a single file on the harddisk. These files are being stored inside directories, which represent the band name and/or the album name:</p>
<pre>/Music/Bandname/Albumname/Songname.ogg</pre>
<p>What pops up here is the habit to maintain structures of the analog world when transforming content into a digital form: A song belongs to a record and the record belongs to a band. This hierarchical paradigm seems to be widespread on desktop computers, although it is not mandatory. One can just as well use a database instead of a filesystem. In case of finding a certain song the represented file structure is not a limitation, because one can add any meta information to a song he likes. For example, a genre can be assigned to a song by using an id3 tag. Based on this meta data, a music library software can crawl all directories and list all Reggae songs. We even could assign more than a single genre, just like this blog article is tagged with multiple tags. No more decision in terms of <i>either/or</i>, but in terms of <i>as-well-as</i>. That means more freedom in classification and less misdeterminations caused by enforced <i>yes-or-no</i> decisions. In contrast to the analog world, digital content can be separated from its mode of presentation. In combination with networking, this opens a new kind of freedom when it comes to classify content. In particular, collaborate classification as realized in so called folksonomies seems to be very helpful and popular.</p>
<p>The other side of the coin is an increasing diffusion which may lead to disorientation. Human beings are heavily bound to the rules of the analog world and used to its limitations. Simple models of classification help to avoid uncertainty, even when they tend to cause wrong decisions. The challenge in a digitalized world is to make use of collaborate forces against the increasing confusion in a&nbsp;complex world. Folksonomies as a classification model seem to be a helpful step towards that. There might come a day when we have to skip using hierarchical ordered files and folders, because this kind of categorization gets too complex for handling the rapidly growing data.</p>]]></content:encoded>
			
			
			<pubDate>Sat, 04 Oct 2008 12:36:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Fixing locale problems for dates in TYPO3</title>
			<link>http://www.t3node.com/blog/fixing-locale-problems-for-dates-in-typo3/</link>
			<description>Sometimes, localization of dates in TYPO3 seems not to work as expected. Of course it does, but finding the right configuration can be puzzling and time consuming. One reason can be the confusing variety of locale declarations.</description>
			<content:encoded><![CDATA[<p>Localization problems mostly emerge when moving a website from one server to another or when working with different environments at the same time.</p>
<p>Today, I did some tests on moving from outdated SuSE to Debian Etch. Cloning the database and the files was easy and went fine, but then I stumbled over wrong date localization of tt_news. The website comes with german as default language and english and french as secondary. Nevertheless, the fresh clone on the Debian server ignored all language settings, using english formats for all pages.</p>
<p>The reason was the config.locale_all setting in the TypoScript template. My configuration was:</p>
<pre>config.locale_all = de_DE<br />[globalVar = GP:L = 1]<br />&nbsp; config.locale_all = en_EN<br />[global]<br />[globalVar = GP:L = 2]<br />&nbsp; config.locale_all = fr_FR<br />[global]</pre>
<p>and this worked fine on SuSE. However, Debian does not come with any of these locales and TYPO3 switched to default (english). I found out, that the locales on Debian use a different naming scheme than SuSE does. Switching to the command line,</p>
<pre>locale -a</pre>
<p>revealed the names of all installed locales. That was de_DE.utf-8, en_US.utf-8 and fr_FR.utf-8. I changed my configuration accordingly and everything worked fine:</p>
<pre>config.locale_all = de_DE.utf-8<br />[globalVar = GP:L = 1]<br />&nbsp; config.locale_all = en_US.utf-8<br />[global]<br />[globalVar = GP:L = 2]<br />&nbsp; config.locale_all = fr_FR.utf-8<br />[global]</pre>]]></content:encoded>
			
			
			<pubDate>Tue, 30 Sep 2008 18:40:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Security issue in TYPO3 Extension Secure Directory (kw_secdir)</title>
			<link>http://www.t3node.com/blog/security-issue-in-typo3-extension-secure-directory-kw-secdir/</link>
			<description>Today, the TYPO3 security team released a collective security bulletin. Since I am the author of one extension which was listed in the bulletin (kw_secdir), I'd like to comment this a little bit. Especially the severity of &quot;high&quot; sounds evil, but it's IMHO less dangerous than some might think.</description>
			<content:encoded><![CDATA[<p>The extension was mentioned in the <a href="http://typo3.org/teams/security/security-bulletins/typo3-20080919-1/" title="Security Bulletin on typo3.org" class="external-link" >Collective Security Bulletin TYPO3-20080919-1</a>, which was released today, September 19, 2008.</p>
<h3>Details about the issue:</h3>
<p>I got a mail on June 30, 2008 from the security team about the extension. It allows BE users to enter username, password and hosts in the filelist module. The problem here was, that the host parameter was &quot;not properly sanitized, making it possible to add arbitrary code lines to a htaccess file&quot;, the security team wrote. An example how to insert malicious values was appended:</p>
<p><em>POC: all%0DAddType application/x-httpd-php .txt</em></p>
<p>This could lead to arbitrary code execution, because user were then able to upload executable PHP code in the filelist module (under certain conditions, see below).</p>
<h3>Description of the patch:</h3>
<p>I added a routine to compare the input field against a whitelist of characters to prevent injection of control characters.</p>
<p>A fixed version was released on July 8, 2008. So far the technical facts.</p>
<h3>Criticism:</h3>
<p>What I do not understand, is the bulletin severity of HIGH:</p>
<p>The vulnerability only affects systems with unsafe Apache configuration, namely the infamous <em>AllowOverride All</em> for .htaccess context. It is even mentioned in the extension manual not to use that, because it opens doors for security holes. So no excuse if someone didn't give a f*** about this and was hit by the issue.</p>
<p>Also, why did the security team wait more than two month to release a bulletin earlier, if the severity is so high?</p>
<p>Please don't get me wrong. The issue was there and some user may have been affected. But there was no description at all in the bulletin, and I wanted to cast a light on this.</p>]]></content:encoded>
			
			
			<pubDate>Fri, 19 Sep 2008 19:24:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>How to find hidden TYPO3 features?</title>
			<link>http://www.t3node.com/blog/how-to-find-hidden-typo3-features/</link>
			<description>From time to time, TYPO3 core devs and insiders leak secret knowledge in the mailinglists. One can find questions about &quot;how to do this?&quot; with answers surprisingly revealing undocumented features. Read on for some hints about how to find those features without asking.</description>
			<content:encoded><![CDATA[<h3>TYPO3 wiki: <a href="http://wiki.typo3.org/index.php/Pending_Documentation" title="TYPO3 wiki page about features which needs to be added to the official docs" class="external-link" >pending documentation section</a></h3>
<p>The first place to look for those features is the <a href="http://wiki.typo3.org/index.php/Pending_Documentation" title="TYPO3 wiki page about features which needs to be added to the official docs" class="external-link" >pending documentation section</a> in the TYPO3 wiki. It's meant to be the place for documentation of all new features, which have been added to the trunk, but not yet released. The items are collected here, reviewed and then put into the docs at typo3.org. Sometimes, this process is a little bit delayed and the wiki page becomes the only referrer to new features of an actual release. In this context, we can see <a href="http://support.typo3.org/teams/core/m/re-typo3-core-rfc-9046-nested-domain-linking-with-domain-record-on-root-page-356324/" title="Comment in RFC: #9046: Nested domain linking with domain record on root page" class="external-link" >Dmitry bashing Michael in the core list</a> about that: &quot;(...) Stucki is responsible for [not] updating core documentation in time. kick him, I am already tired of doing it. (...)&quot; (Dmitry, 2008/07/31).</p>
<h3>Forge: <a href="http://forge.typo3.org/repositories/browse/typo3v4-core/Documentation/trunk" title="Latest core docs waiting for release" class="external-link" >Core docs in the subversion trunk</a></h3>
<p>Francois kindly <a href="http://support.typo3.org/teams/core/m/typo3-core-fyi-updated-tsref-with-pending-documentation-360561/" title="Discussion thread in the core list" class="external-link" >updated TSref</a> with all pending parts from the wiki. To be release soon...</p>
<h3>Bugtracker: <a href="http://bugs.typo3.org/search.php?project_id=21&amp;sticky_issues=on&amp;sortby=last_updated&amp;dir=DESC&amp;hide_status_id=90" title="List of bugs about TYPO3 documentation" class="external-link" >documentation category</a></h3>
<p>Another place is the bugtracker. There is a <a href="http://bugs.typo3.org/search.php?project_id=21&amp;sticky_issues=on&amp;sortby=last_updated&amp;dir=DESC&amp;hide_status_id=90" title="List of bugs about TYPO3 documentation" class="external-link" >documentation section in mantis</a>, where tough users could have reported items about missing documentation.</p>
<h3>Mailinglists: <a href="http://support.typo3.org/other-views/search-newsgroups/" title="TYPO3 mailinglist archive at typo3.org" class="external-link" >recently committed features</a></h3>
<p>Last but not least, you could RTFML, especially the core list. Use the <a href="http://support.typo3.org/other-views/search-newsgroups/" title="TYPO3 mailinglist archive at http://support.typo3.org" class="external-link" >search function of support.typo3.org</a> for a full bodytext search. Although &quot;we cannot expect from our users to read the Core list to learn about new features&quot; (<a href="http://support.typo3.org/teams/core/m/re-typo3-core-rfc-9109-enable-feature-in-element-browser-in-rte-like-in-normal-one-356680/p/99/" title="Masi commenting RFC: #9046" class="external-link" >Masi, 2008/08/04</a>), it however seems to be the price one has to pay for living on the bleeding edge.</p>]]></content:encoded>
			
			
			<pubDate>Mon, 04 Aug 2008 11:02:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Nested domains in a single TYPO3 pagetree</title>
			<link>http://www.t3node.com/blog/nested-domains-in-a-single-typo3-pagetree/</link>
			<description>A common scenario in maintaining websites is to have a handful of websites, each with little content and a single person who is in charge of the content. Why not throw everything into a single TYPO3 installation?</description>
			<content:encoded><![CDATA[<p>Maintaining multiple domains inside one TYPO3 instance is possible. But it can be tricky, especially when using RealURL and domains are nested. You need to carry together the neccessary configuration options. Until today this is not as easy as you might think. The following prerequisites are essential, additional to your usual setup:</p><ul> <li>Use TYPO3 Version 4.2 (because HMENU does not use typolink in &gt;=4.1)</li> <li>use RealURL Version &gt;=1.4.0</li> <li>setup TypoScript of all rootpage templates (the first three items of course can be merged into a global template):</li><br /><pre>config {<br /> &nbsp;&nbsp;simulateStaticDocuments = 0<br /> &nbsp;&nbsp;tx_realurl_enable = 1<br />   # render internal links between domains<br /> &nbsp;&nbsp;typolinkCheckRootline = 1 <br /> &nbsp;&nbsp;baseURL = <a href="http://mydomain.com/" >mydomain.com</a><br />}</pre><li>set domain record in every rootpage</li> <li>set the rootlevel flag in the rootpage templates</li> <li>set the &quot;Is root of website&quot; flag in the rootpage properties. This is essential for nested domains.</li> <li>set the rootpage_id for every domain in the RealURL configuration part in typo3conf/localconf.php:</li> <br /><pre> $TYPO3_CONF_VARS['EXTCONF']['realurl'] = array(<br />   'www.foo.com' =&gt; array(<br />     'pagePath' =&gt; array(<br />       'rootpage_id' = 1234<br />   ...<br />   ),<br />   'www.bar.com' =&gt; array (<br />     'pagePath' =&gt; array(<br />       'rootpage_id' = 5678<br />   ...<br />   ),<br /> </pre> </ul><p>However, you could still run into problems. Keep your eyes open for recent patches in the TYPO3-core list and related bugs. </p>]]></content:encoded>
			
			
			<pubDate>Thu, 31 Jul 2008 20:03:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Getting Things Done with Chandler</title>
			<link>http://www.t3node.com/blog/getting-things-done-with-chandler/</link>
			<description>To improve my productivity, I'm trying to follow David Allen's recommendations about &quot;Getting Things Done&quot;. It now seems that I finally have found a piece of software which fits my needs: Chandler, the so called note-to-self organizer.</description>
			<content:encoded><![CDATA[<p>Inspired by the <a href="http://typo3bloke.net/post-details/t3dd08_productivity_session/" title="Topic map of Dmitrys speech" class="external-link" >productivity session of Dmitry Dulepov</a> at the <a href="http://t3dd08.typo3.org" title="T3DD08: TYPO3 Developer Days 2008 at Elmhorn/Germany" class="external-link" >TYPO3 Developer Days 2008</a>, I decided to improve my personal workflow. In his speech, Dmitry referred to a book of <a href="http://www.davidco.com/" title="Website of David Allen" class="external-link" >David Allen</a> called <em>Getting Things Done</em>. In spite of my usual aversion for <em>pseudo psycho manage your life properly</em> guides, I ordered the book. <br />Trying to apply my reading to real life, I soon realized one problem in my paperless home office: the software tools I was using were quite limited to apply Allen's propositions. <br />Today I stumbled upon a <a href="http://t3n.yeebase.com/aktuell/news/newspost/chandler-project-open-source-pim-als-outlook-alternative/1719/" title="Review of Chandler (german language)" class="external-link" >news article at T3N</a> about <a href="http://chandlerproject.org" title="The Chandler project website" class="external-link" >Chandler</a>. This note-to-self organizer seems to integrate the <em>Getting Things Done</em> concept. I have just finished the installation and my first impression is satisfactory:</p><ul><li>The <a href="http://chandlerproject.org/Projects/ScreenShots" title="Collection of screenshots of Chandler" class="external-link-new-window" >user interface</a> looks intuitive and familiar with its three columns layout.</li><li>The clear use of colors gives you a quick overview about important actions.</li><li>Most important: I was able to recover the &quot;do it, defer it, delegate it&quot; pradigm at once.</li></ul><p>The next days I'll try to find out how good it really fits my needs...</p>]]></content:encoded>
			
			
			<pubDate>Tue, 08 Jul 2008 11:24:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>IE once again sucks</title>
			<link>http://www.t3node.com/blog/ie-once-again-sucks/</link>
			<description>On some of our websites, we use conditional comments to control CSS hacks for Internet Explorer. If you create static copies of a website (or mirror), never forget that only IE will follow the @import links inside conditional controls - tools like httrack or wget certainly will not, because they know how to behave! This fact cost me almost an hour today.</description>
			<content:encoded><![CDATA[]]></content:encoded>
			
			
			<pubDate>Thu, 29 May 2008 21:57:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Use Foxmarks with your own server</title>
			<link>http://www.t3node.com/blog/use-foxmarks-with-your-own-server/</link>
			<description>The synchronization of Firefox bookmarks on two or more computers is easy done with Foxmarks. Here are some suggestions on how use it without the use of the Foxmarks webservice.</description>
			<content:encoded><![CDATA[<p>I use <a href="http://www.foxmarks.com/" title="Foxmarks homepage" class="external-link" >Foxmarks</a> to synchronize my bookmarks. You simply need to install a <a href="https://addons.mozilla.org/de/firefox/addon/2410" title="The Foxmarks Add-on" class="external-link" >Firefox Add-on</a> (Firefox 2.0 only!) and register yourself at Foxmarks.com to use their webservice. If you dislike the idea of storing your treasury on someone else's server, you can also <a href="http://wiki.foxmarks.com/wiki/Foxmarks:_Frequently_Asked_Questions#Can_I_use_Foxmarks_with_my_own_server.3F" title="FAQ of the Foxmarks wiki" class="external-link" >use your own webdav environment</a> for storage.<br /> </p>
<p>The bookmarks are encoded as JSON and stored as a single file. Fortunately, <a href="http://blog.stefan-macke.com/2008/05/11/firefox-bookmarks-aus-foxmarks-anzeigen-json-datei/" title="Blog entry of Stefan Macke" class="external-link" >Stefan Macke</a> (german!) now provides a PHP script to convert JSON to HTML to display your bookmarks on a website. Thank you, Stefan! </p>]]></content:encoded>
			
			
			<pubDate>Mon, 12 May 2008 21:17:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>TYPO3 breaks on Ubuntu 8.04 LTS Hardy Heron</title>
			<link>http://www.t3node.com/blog/typo3-breaks-on-ubuntu-804-lts-hardy-heron/</link>
			<description>After a dist-upgrade from Gutsy to Hardy on our webserver, TYPO3 was suddenly broken. The reason is a bug in PHP 5.2.4. There is a workaround for TYPO3, but unfortunately the patch is still pending in the core list.</description>
			<content:encoded><![CDATA[<p>Oliver Harder already <a href="http://support.typo3.org/index.php?id=12&amp;tx_nntpreader_pi1%5Bnid%5D=61&amp;tx_nntpreader_pi1%5Bmid%5D=329677&amp;cHash=627a3dbd81" title="core-list discussion and patch" class="external-link" >requested to commit a patch</a> and it works.</p>
<p>So if you run into trouble with Ubuntu 8.04, download the patch to your typo3_src directory and <a href="http://typo3.org/development/bug-fixing/diff-and-patch/" title="How to patch TYPO3 sources" class="external-link-new-window" >patch</a> your sources:</p>
<pre>patch&nbsp; -p0 &lt; 0006158_v2.patch</pre>]]></content:encoded>
			
			
			<pubDate>Fri, 09 May 2008 19:24:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>vi(m) rulez!</title>
			<link>http://www.t3node.com/blog/vim-rulez/</link>
			<description>I don't like those bloatware IDEs like Eclipse etc. It's just too oversized for most of my projects. My favorite tool for writing code is vim (Vi iMproved). And it comes with so many neat features, like code completion, for example.</description>
			<content:encoded><![CDATA[<p>I just stumbled upon some ways to use code completion for writing PHP code:</p>
<p>When in Insert mode, type the beginning of a PHP function, for example</p>
<pre>array_s</pre>
<p>Then hit &lt;Control-X&gt; &lt;Control-O&gt; and vim will show you all possible functions in a drop down menu. Just choose the one you were looking for and hit enter</p>
<pre>array_search( <br />array_search( f<br />array_shift(  f<br />array_slice(  f<br />array_splice( f<br />array_sum( f</pre>
<p>Find out more about vim secrets: <a href="http://www.vim.org/tips/tip.php?tip_id=305" >www.vim.org/tips/tip.php</a></p>]]></content:encoded>
			
			
			<pubDate>Thu, 08 May 2008 18:58:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Change Typoscript values at parsetime</title>
			<link>http://www.t3node.com/blog/change-typoscript-values-at-parsetime/</link>
			<description>Typoscript properties in the CONFIG section are usually defined once and at a certain point. But what if you have defined the value of a property at some place and like to add another one later in the parsing process? </description>
			<content:encoded><![CDATA[<h3>Example</h3>
<p>A prominent example is <a href="http://typo3.org/documentation/document-library/references/doc_core_tsref/4.1.0/view/7/3/" title="read the property description in TSref documentation at typo3.org" class="external-link" >config.linkVars</a>. In most cases, it's used to append the global language parameter <em>L</em> to typolinks:</p>
<pre>config.linkVars = L</pre>
<p> However, if you need to append another value to that property using a basis template or an extension template, you can do this with := addToList():</p>
<pre>config.linkVars <strong>:=</strong> addToList(print)</pre>
<p>Parsing both properties will have the same result as:</p>
<pre>config.linkVars = L, print</pre>
<h3>List of functions</h3>
<p>It's so easy, isn't it? Mind the <em>:=</em> operator as a placeholder for the parser to process the function. The &quot;<a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_ts/4.1.0/view/1/2/" title="doc_core_ts documentation at typo3.org" class="external-link" >TypoScript Syntax and In-depth Study</a>&quot; docs reveal the following list of functions which can be used here. There's even a hook to use your own functions.</p>
<pre>prependString()</pre>
<p>... adds a string before the existing one.</p>
<pre>appendString()</pre>
<p>... adds a string after the existing one.</p>
<pre>removeString()</pre>
<p>... removes a string from the existing one. str_replace() is used here.</p>
<pre>replaceString()</pre>
<p>... replaces an existing string with a new one. str_replace() is used here,with the pipe symbol | as a divider.</p>
<pre>addToList()</pre>
<p>... appends values to a comma separated list. The list will neither be sorted nor distinct. Multiple values are given as a comma separated list.</p>
<pre>removeFromList()</pre>
<p>... removes values from a comma separated list. Multiple values are given as a comma separated list.</p>]]></content:encoded>
			
			
			<pubDate>Sat, 01 Mar 2008 17:38:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>addPItoST43? </title>
			<link>http://www.t3node.com/blog/addpitost43/</link>
			<description>TYPO3 sometimes drives me nuts. It happens that I come across cryptic function or property names, using them over and over again without having a clue, what its name stands for. t3lib_extMgm::addPItoST43() is one of them, although it is part of almost a billion TYPO3 extensions...</description>
			<content:encoded><![CDATA[<p>Not only that we have the <a href="http://buzz.typo3.org/people/francois-suter/article/typoscript-beauty-or-beast-1/" title="Francois Suter reviews the beautiful optionSplit property of TS" class="external-link" >optionSplit beast</a>, but we are hunted by the magic number 43. And we add PI to number ST43!</p>
<p>Today, I had enough and tried to find out, what 43 stands for. Finaly, the <a href="http://typo3.org/fileadmin/typo3api-4.0.0/db/d23/classt3lib__extMgm.html#161d98233f8583d5dd95d1f8548eb2ac" title="t3lib_extMgm Extension manager class reference" class="external-link" >source code documentation</a> led the cat out of the bag: 43 is the uid of the static template 'content.default' and the function name means: Add PlugIn to Static Template #43. Now don't worry if you use css_styled_content instead of static templates: The docs promise it will work anyway.  </p>]]></content:encoded>
			
			
			<pubDate>Wed, 20 Feb 2008 22:25:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Simulating conditions with pure HTML/CSS</title>
			<link>http://www.t3node.com/blog/simulating-conditions-with-pure-htmlcss/</link>
			<description>There are many ways to assign extra styles to the menu item of the active page. TYPO3 for example provides ACT in Typoscript to do so. But did you know that this can be solved with pure HTML/CSS?  </description>
			<content:encoded><![CDATA[<p>The only information we need to have is the ID of the page and the menu items. By setting a page ID in the &lt;body&gt; tag and the class in the menu list item, we can use the cascading property to define extra style if both are matching.</p>
<h3>HTML</h3>
<pre>&lt;body id=&quot;papers&quot;&gt;<br />...<br />&lt;ul id=&quot;navMenu&quot;&gt;<br />&nbsp; &lt;li class=&quot;blog&quot;&gt;My blog&lt;/li&gt;<br />&nbsp; &lt;li class=&quot;papers&quot;&gt;My papers&lt;/li&gt;<br />&nbsp; &lt;li class=&quot;books&gt;My books&lt;/li&gt;<br />&nbsp; &lt;li class=&quot;contact&quot;&gt;Contact&lt;/li&gt;<br />&lt;/ul&gt;</pre>
<h3>CSS</h3>
<pre>#blog #navMenu .blog a,<br />#papers #navMenu .papers a,<br />#books #navMenu .books a,<br />#contact #navMenu .contact a, {<br />&nbsp; color: red;<br />}<br /><br /></pre>]]></content:encoded>
			
			
			<pubDate>Tue, 05 Feb 2008 16:16:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Styling weblinks with CSS</title>
			<link>http://www.t3node.com/blog/styling-weblinks-with-css/</link>
			<description>CSS gives you so many powerful methods of styling weblinks. We not only have pseudo classes to distinguish between visited/unvisited and hovered/activated links, but also those highly configurable attribute selectors to individually style all types of protocols (mailto, https, ...) and document types (pdf, mp3, ...)</description>
			<content:encoded><![CDATA[<p>There are so many different link types in the web, but usually they all come with the same styling. Underlining and coloring seems to be the prefered method.</p>
<p>The first time I realizied those million ways to apply styles to links, was some years ago, when <a href="http://en.wikipedia.org" >Wikipedia </a>started to explicitly tag external links with png icons. Last week I found some time to dig into CSS and attribute selectors and the stuff I saw was amazing. Not only we can style one and the same HTML element with different ids or classes, but also by choosing any other attribute or part of it. On a small scale, a kind of Regex is allowed to differentiate cases more precisely:</p>
<h3>HTML</h3>
<pre>&lt;a href=&quot;http://www.domain.net&quot;&gt;An external link&lt;/a&gt;</pre>
<h3>CSS</h3>
<pre>a[href^=&quot;http:&quot;] { background: url(ext.png) no-repeat right; }</pre>
<p>This will add a little icon on the right side of the link. The attribute selectors [href^=value] limits the style to links starting with <em>http:</em>. If your browser supports CSS2, you can see the <a href="http://en.wikipedia.org/wiki/Effect" >effect</a>. Now have a look at the next example:</p>
<h3>HTML</h3>
<pre>&lt;a href=&quot;http://document.pdf&quot;&gt;my Thesis&lt;/a&gt;</pre>
<h3>CSS</h3>
<pre>a[href$=&quot;.pdf&quot;] { background: url(pdf.png) no-repeat right; }</pre>
<p>This will highlight links to pdf documents. The attribute selectors [href$=value] limits the style to links ending with <em>.pdf</em>. And here comes the <a href="fileadmin/user_upload/examples/example.pdf" title="Initiates file download" class="download" >example</a>.</p>
<p>Now, that IE7 is going to replace its ugly ancestor, attribute selectors are also supported by the MS empire. The next step seems to be <a href="http://microformats.org/" >microformats</a>, which mainly use attributes to semantically markup web content.</p>]]></content:encoded>
			
			
			<pubDate>Tue, 29 Jan 2008 20:34:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>unreadable output of MySQL console client</title>
			<link>http://www.t3node.com/blog/unreadable-output-of-mysql-console-client/</link>
			<description>Are you a fan of using MySQL console client? Have you ever experienced the unreadable chaos of table data, when doing queries on tables with lots of columns? The usability of this tool often ends with the first linebreak.
The solution to get some more readable output is so easy: Terminate your query with \G instead of ; or \g</description>
			<content:encoded><![CDATA[<p>Are you a fan of using MySQL console client? Have you ever experienced the unreadable chaos of table data, when doing queries on tables with lots of columns? The usability of this tool often ends with the first linebreak.</p>
<p>The solution to get some more readable output is so easy: Terminate your query with \G instead of ; or \g</p>]]></content:encoded>
			
			
			<pubDate>Mon, 05 Nov 2007 19:07:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>TypoScript collection</title>
			<link>http://www.t3node.com/blog/typoscript-collection/</link>
			<description>I just stumbled over a collection of Typoscript by Bernd Wilke. Maybe it is helpful for someone: http://www.pi-phi.de/t3v4/25.html (page in german language)</description>
			<content:encoded><![CDATA[]]></content:encoded>
			
			
			<pubDate>Wed, 24 Oct 2007 18:15:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Broken pdfinfo shipped with Zotero [fixed]</title>
			<link>http://www.t3node.com/blog/broken-pdfinfo-shipped-with-zotero-fixed/</link>
			<description>To index and search PDF files within Zotero, you need the Xpdf tool pdfinfo.  As it seems that most versions of pdfinfo are either not compatible with Zotero or broken otherwise, I decided to build it from scratch and provide it for download.</description>
			<content:encoded><![CDATA[<p>Somehow Zotero needs a slightly customzied version of pdfinfo, which is only available for download via the Zotero configuration dialog. Unfortunately, the actual version seems to be <a href="http://forums.zotero.org/discussion/1386/pdfinfolinuxi686-broken-on-ubuntu-edgy/" title="Bug report about broken pdfinfo version" class="external-link" >broken on some systems</a> (e.g. Ubuntu Edgy). Therefore, I compiled pdfinfo by myself. You can download the binary if you experience similar problems (no warranty, use at your own risk!):</p><ul><li><a href="fileadmin/user_upload/zotero/pdfinfo-Linux-i686.gz" title="Initiates file download" class="download" >pdfinfo</a> binary (gzipped, version 3.02)</li><li><a href="fileadmin/user_upload/zotero/xpdf-3.02.tar.gz" title="Initiates file download" class="download" >Xpdf sources</a> as tar.gz archive (version 3.02)</li><li><a href="fileadmin/user_upload/zotero/pdfinfo.cc" title="Initiates file download" class="download" >pdfinfo.cc</a> source file, modificated by zotero dev, see <a href="https://www.zotero.org/trac/browser/tools/xpdf/pdfinfo.cc" title="Browse the source file via trac /svn" class="external-link" >Zotero svn</a></li></ul><p>[UPDATE 2007/10/11]</p>
<p>The bug is already fixed and new binaries are provided. Nevertheless, if you still run into the described problems, it might be because the old file still exists in the Firefox cache. Clear the cache or alternatively get the file from:<br /><a href="http://www.zotero.org/download/xpdf/pdfinfo-Linux-i686-3.02" >www.zotero.org/download/xpdf/pdfinfo-Linux-i686-3.02</a></p>]]></content:encoded>
			
			
			<pubDate>Wed, 10 Oct 2007 14:16:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Zotero as reference management software</title>
			<link>http://www.t3node.com/blog/zotero-as-reference-management-software/</link>
			<description>Searching and collecting research sources without an appropriate method and tool might lead into time-consuming confusion. Looking for a way to avoid a growing unstructured collection of 3x5 cards/files, I stumbled over the reference management software Zotero. And it rocks!</description>
			<content:encoded><![CDATA[<p>My thesis is coming nearer and the list of potential useful books is growing. So I decided to start using a reference management software to organize my bibliographic collection. A <a href="http://en.wikipedia.org/wiki/Comparison_of_reference_management_software" title="Comparison of reference management software at wikipedia" class="external-link" >comparison at Wikipedia</a> gave me a first overview, then I decided to try <a href="http://www.zotero.org/" title="Homepage of the Zotero project" class="external-link" >Zotero</a>. My decision was based on four factors:</p><ul><li>Zotero comes as a Firefox extension. I like the idea, because the browser is my favorite tool for almost any research.</li><li>It also ships an Openoffice package, to integrate the references into my favorite word processor.</li><li>It's open source software.</li><li>There's an active community.</li></ul><p>Zotero does not only collect research sources on a meta level (author, title, year, ...) but also archives and indexes full text items (e.g. HTML, PDF). Tags and relations make it easy to structure and categorize items. </p>
<p>The installation is really easy and the documentation helps you to understand things within a short time. Give it a try.</p>]]></content:encoded>
			
			
			<pubDate>Wed, 10 Oct 2007 12:59:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Mail queue statistics for TYPO3 mailing lists</title>
			<link>http://www.t3node.com/blog/mail-queue-statistics-for-typo3-mailing-lists/</link>
			<description>Last sunday, Luc de Louw published more statistics on the TYPO3 mailing lists. We can now peek into some charts about the mail queue.</description>
			<content:encoded><![CDATA[<p>The <a href="http://lists.netfielders.de/cgi-bin/queuegraph.cgi" title="statistics of the postfix queue" class="external-link" >charts</a> give us an impression about how many mails were defered in the postfix queue. You can compare this value with the total amount of  incoming/active/delivered mails. This information does neither reveal the reason for queuing or the duration mails spent in the queue. But it gives us a first impression about the server (postfix) load.</p>
<p><a href="http://buzz.typo3.org/people/luc-de-louw/" title="Blog of Luc de Louw at typo3.org" class="external-link" >Luc</a> seems to like charts, since we already have some <a href="http://lists.netfielders.de/cgi-bin/mailgraph.cgi" title="smtp statistics rendered with mailgraph" class="external-link" >postfix statistics</a> of the TYPO3 listserver and some numbers about <a href="http://buzz.typo3.org/people/luc-de-louw/article/is-the-typo3-community-13337/" title="top memberships in the TYPO3 mailing lists" class="external-link" >list membership</a>.<br /> </p>]]></content:encoded>
			
			
			<pubDate>Tue, 14 Aug 2007 01:19:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>No eAccelerator package for Debian Etch?</title>
			<link>http://www.t3node.com/blog/no-eaccelerator-package-for-debian-etch/</link>
			<description>Two years after the release of &quot;Sarge&quot;, we face the next Debian release called &quot;Etch&quot;. Finally, Debian ships PHP 5, MySQL 5, Apache 2.2, ... but still NO eAccelerator package. No need to worry, you'll always find a package somewhere in the web...
</description>
			<content:encoded><![CDATA[<p>Etch includes more than 18000 packages - why is eAccelerator missing? Well, the licence of eAccelerator somehow seems not to be compatible with the Debian policy. I did not really find out why, but found an <a href="http://archive.eaccelerator.net/OldNews" title="Old and archived eAccelerator project website" class="external-link" >&quot;old news&quot;</a> about failed negotiations between the developers of eAccelerator and &quot;Mr. Turck&quot;, who &quot;owns&quot; parts of the copyright (eAccelerator is a fork of <a href="http://turck-mmcache.sourceforge.net/index_old.html" title="The Turck MMcache project seems to be inactive since 2003" class="external-link" >Turck MMcache</a>).</p>
<p>Fortunately, Andrew McMillan provides a fresh <a href="http://andrew.mcmillan.net.nz/node/70" title="Andrew McMillan announces a fresh eAccelerator package for Etch" class="external-link" >eAccelerator package</a> for Etch. There have been some questions on the TYPO3-Debian mailing list about installing third party packages on Debian Linux. To clearify things, here comes a quick installation guide.</p>
<p>You need to import Andrews public key, because Etch now comes with <a href="http://wiki.debian.org/SecureApt" title="validation of software packages with apt" class="external-link" >signed packages</a> and apt-get could complain about unverified signatures of 3rd party software.</p>
<pre>gpg --keyserver pgp.mit.edu --recv-keys 8F068012<br />gpg --armor --export 8F068012&nbsp; | apt-key add -</pre>
<p>Ok. Now add the repository to your apt sources.</p>
<pre>echo 'deb <a href="http://debian.mcmillan.net.nz/debian" >debian.mcmillan.net.nz/debian</a> etch awm' \<br />&gt;&gt; /etc/apt/sources.list</pre>
<p> Update your list of packages and install the eAccelerator module. </p>
<pre>aptitude update <br />aptitude install php5-eaccelerator </pre>
<p>You need to activate the module in /etc/php5/{cgi|apache|apache2}/conf.d/eaccelerator.ini by uncommenting the last line:</p>
<pre>extension=eaccelerator.so </pre>
<p>If you use PHP5 via FastCGI/fcgid and Apache2 worker, it is <a href="http://eaccelerator.net/wiki/InstallFromSource" title="Installation guide to build eAccelerator" class="external-link" >recommended</a> to use eAccelerator as an extension of the Zend engine. Replace the above line with:</p>
<pre>zend_extension=&quot;/usr/lib/php5/20060613+lfs/eaccelerator.so&quot; </pre>
<p>Finally, reload Apache</p>
<pre>/etc/init.d/apache2 force-reload </pre>
<p>Use phpinfo() to check if eAccelerator is activated. Note that php-cli is not supported by eAccelerator.</p>
<pre>&lt;?php phpinfo(); ?&gt;</pre>]]></content:encoded>
			
			
			<pubDate>Thu, 28 Jun 2007 21:50:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>&quot;almost stable&quot; release of mm_forum</title>
			<link>http://www.t3node.com/blog/almost-stable-release-of-mm-forum/</link>
			<description>Mittwald CM Service uploaded their latest version of the webforum extension mm_forum to TER. Eight weeks after the first alpha release, the extension now entered a beta state, but is actually called &quot;almost stable&quot; by the developers themselves.</description>
			<content:encoded><![CDATA[<p>The extension in particular drives the popular german TYPO3 forum at <a href="http://www.typo3.net" title="TYPO3 community webforum" class="external-link" >www.typo3.net</a> and thus seems to be fit for higher load environments. Unfortunately, I don't have any statistics (like traffic peaks) so this assumption is pure theory. According to Mittwald, 19.000 users have registered at typo3.net and 230.000 postings have been written yet. But without any knowledge about the data distribution, this is just a bunch of numbers (probably growing since 2001).<br /> </p>
<p>The forum is shipped with a build-in crawler and search engine, optimized for searching forum postings - a wise decision, since indexed_search is almost infamous for causing heavy load and timeouts in large scale environments.</p>
<p>A first look at the database tables reveals the use of indexes for some columns/tables. Indexes can speed up SELECT statements but are yet rarely implemented in any extension. Anyway, thanks to the efforts of core-dev <a href="http://typo3bloke.net/" title="Website of Dmitry Dulepov" class="external-link" >Dmitry Dulepov</a>, they are meanwhile common in core and sysext tables.</p>
<p>The extension is available via extension repository or directly via <a href="http://typo3.org/extensions/repository/view/mm_forum/0.1.0/" title="mm_forum in the extension repository at typo3.org" class="external-link" >typo3.org</a>.</p>]]></content:encoded>
			
			
			<pubDate>Mon, 04 Jun 2007 19:23:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>OSBF-lua rules</title>
			<link>http://www.t3node.com/blog/osbf-lua-rules/</link>
			<description>Last week, I moved my IMAP account from university to a privately hosted server. At the same time, I said goodbye to Spamassassin and switched to OSBF-lua - the results were impressive...</description>
			<content:encoded><![CDATA[<p>Already installed by <a href="http://underused.org/" title="Michael Scharkow" class="external-link" >Michael</a>, I just had to create some maildrop rules to feed <a href="http://osbf-lua.luaforge.net/" title="OSBF-lua project website at sourceforge" class="external-link" >OSBF-lua</a>. After training the bayes database with 42 pieces of spam and 9 of ham, almost any following spam was classified correctly as bulk. The training was easy. Besides some perl/shell scripts, the bayes filter can be trained by sending false pos/negs back to OSBF-lua. You simply have to change the 'Subject:' and 'To:' headers (remember majordomo?). The first thing that came to my mind was: Hey, this could easily be done with a one-click button in Thunderbird. Any extension out there?<br />  <br />  </p>
<pre>Statistics for nonspam.cfc:<br />-----------------------------------------------<br />Database version:                    OSBF-Bayes<br />Total buckets in database:                94321<br />Buckets used (%):                           9.0<br />Bucket size (bytes):                         12<br />Header size (bytes):                       4092<br />Number of chains:                          7444<br />Max chain len (buckets):                      5<br />Average chain length (buckets):             1.1<br />Max bucket displacement:                      3<br />Buckets unreachable:                          0<br />Trainings:                                    9<br />Classifications:                             88<br />Learned mistakes:                             7<br />Extra learnings:                              0<br />Ham accuracy (%):                         92.47<br />-----------------------------------------------<br /><br />Statistics for spam.cfc:<br />-----------------------------------------------<br />Database version:                    OSBF-Bayes<br />Total buckets in database:                94321<br />Buckets used (%):                          62.6<br />Bucket size (bytes):                         12<br />Header size (bytes):                       4092<br />Number of chains:                         16430<br />Max chain len (buckets):                     60<br />Average chain length (buckets):             3.6<br />Max bucket displacement:                     29<br />Buckets unreachable:                          0<br />Trainings:                                   42<br />Classifications:                            134<br />Learned mistakes:                             2<br />Extra learnings:                              1<br />Spam accuracy (%):                        98.45<br />-----------------------------------------------<br />Spam rate (%):                            58.11<br />Global accuracy (%):                      95.95<br />-----------------------------------------------</pre>
<p><br />   </p>]]></content:encoded>
			
			
			<pubDate>Sat, 26 May 2007 04:40:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Online - finaly</title>
			<link>http://www.t3node.com/blog/online-finaly/</link>
			<description>T3node is finaly released.
Be prepared for more stuff following soon.</description>
			<content:encoded><![CDATA[<p>I spend the whole night for creating the design. Since I'm not very skilled in GFX, it was hard work. But <a href="http://www.eyeshots.net" title="Christian Weber, online exhibition at www.eyeshots.net" class="external-link" >Christians</a> great SciFi images saved my day (night). Thanks for your support!</p>
<p>Now it's up to Micr0s0ft, to fix their IE bugs for proper presentation of this page ;-)</p>]]></content:encoded>
			
			
			<pubDate>Sat, 26 May 2007 03:58:00 +0200</pubDate>
			
		</item>
		
	</channel>
</rss>