<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		
		<title>Latest Articles</title>
		<link>http://www.bungert.co.uk/</link>
		<description>From bungert.co.uk</description>
		<language>en</language>
		<image>
			<title>Latest Articles</title>
			<url>http://www.bungert.co.uk/fileadmin/bungert/v1//images/logos/logo.png</url>
			<link>http://www.bungert.co.uk/</link>
			<width>60</width>
			<height>56</height>
			<description>From bungert.co.uk</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Sun, 13 Dec 2009 17:30:00 -0500</lastBuildDate>
		
		
		<item>
			<title>tt_news and translated articles in multi-lingual sites</title>
			<link>http://www.bungert.co.uk/en/blog/articles/tt-news-and-translated-articles-in-multi-lingual-sites.html</link>
			<description>One of the easy things to setup in tt_news with multiple languages is the ability to create...</description>
			<content:encoded><![CDATA[<p>I have an extension at work for TCA changes. The changes I made shows an editable field in the tt_news TCA form allowing a BE user to specify a news article ID as this records default translation.</p>
<p>Here is the code from my TCA extension that changes tt_news:</p>
<p class="inputText">if(t3lib_extMgm::isLoaded('tt_news')) {<br />&nbsp;&nbsp;&nbsp; t3lib_div::loadTCA(&quot;tt_news&quot;);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; // Remove the field from the palette<br />&nbsp;&nbsp;&nbsp; $TCA['tt_news']['palettes']['2']['showitem'] = str_replace(',l18n_parent', '', $TCA['tt_news']['palettes']['2']['showitem']);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; // Add l18n_parent to types on it's own tab with localisation and to showRecordFieldList;<br />&nbsp;&nbsp;&nbsp; $TCA['tt_news']['types']['0']['showitem'] = str_replace('Relations,', 'Relations,l18n_parent,', $TCA['tt_news']['types']['0']['showitem']);<br />&nbsp;&nbsp;&nbsp; $TCA['tt_news']['interface']['showRecordFieldList'] .= ',l18n_parent';<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; $newConfig = array (<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 'type' =&gt; 'input',&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 'size' =&gt; '5',<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 'max' =&gt; '5',<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 'eval' =&gt; 'trim,int'<br />&nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; // Remove the old config and add the new one<br />&nbsp;&nbsp;&nbsp; unset($TCA['tt_news']['columns']['l18n_parent']['config']);<br />&nbsp;&nbsp;&nbsp; $TCA['tt_news']['columns']['l18n_parent']['config'] = $newConfig;<br />}</p>
<p>So what does it do?</p>
<p class="inputText">if(t3lib_extMgm::isLoaded('tt_news')) {</p>
<p>This if checks if tt_news is actually loaded - no point doing anything more if it isn't.</p>
<p class="inputText">$TCA['tt_news']['palettes']['2']['showitem'] = str_replace(',l18n_parent', '', $TCA['tt_news']['palettes']['2']['showitem']);</p>
<p>The<b> l18n_parent</b> field is then removed from it's 'secondary options' palette and then added to the 'Relations' tab as an input field that just accepts ints:</p>
<p class="inputText">&nbsp;&nbsp;&nbsp; $TCA['tt_news']['types']['0']['showitem'] = str_replace('Relations,', 'Relations,l18n_parent,', $TCA['tt_news']['types']['0']['showitem']);<br />&nbsp;&nbsp;&nbsp; $TCA['tt_news']['interface']['showRecordFieldList'] .= ',l18n_parent';<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /> &nbsp;&nbsp;&nbsp; ...<br /> &nbsp;&nbsp;&nbsp; <br />&nbsp; &nbsp; unset($TCA['tt_news']['columns']['l18n_parent']['config']);<br />&nbsp;&nbsp;&nbsp; $TCA['tt_news']['columns']['l18n_parent']['config'] = $newConfig;</p>
<p>That's it! Whenever you are on a translated record this field will show up (whether there is a default translation or not - good for changing the default translation too). You can then enter the UID&nbsp;of the tt_news record that should be the articles default translation. The field is still an exclude field so you can use TYPO3's backend groups to control who actually sees this field.</p>
<p>Originally I made this a select field so that you could choose from a list of articles, but when you have many articles this is not a good solution, so I decided on a int-only text field. You could of course change it to a user field and add ajax auto-suggested article titles that narrow down the list of article titles shown as a user types them in or what ever else you can think of.</p>
<p><br />NB: this has <b>not</b> been tested with tt_news 3.0 or TYPO3 4.3.</p>]]></content:encoded>
			<category><a href="en/blog/categories/typo3.html" title="TYPO3">TYPO3</a></category>
			
			<author>stephen@bungert.co.uk</author>
			<pubDate>Sun, 13 Dec 2009 17:30:00 -0500</pubDate>
			
		</item>
		
		<item>
			<title>Using TYPO3's default pi browser in your ext</title>
			<link>http://www.bungert.co.uk/en/blog/articles/using-typo3s-default-pi-browser-in-your-extension.html</link>
			<description>Does your extension need a page browser? Why not use the default TYPO3 page browser? Because it's...</description>
			<content:encoded><![CDATA[<p>First add a class variable called <b>pi_alwaysPrev</b> and set it to 1 (can be 0 if you want this option disabled by default), this is used to decide if the previous button is always shown. Admins can then change this value via TypoScript. Also an array called <b>internal </b>is required, and an array to store wraps for the page browser, I called this <b>pbWrapper</b> but you can call this whatever you want:</p>
<p class="inputText">class yourExtensionName extends tslib_pibase {<br />&nbsp;&nbsp;&nbsp; var $prefixId = 'yourExtensionName';<br />&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp; var <b>$pi_alwaysPrev</b> = 1;<br />&nbsp;&nbsp;&nbsp; var <b>$internal</b> = array();<br />&nbsp;&nbsp;&nbsp; var <b>$pbWrapper</b> = array();<br />&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp; function main($content, $conf) {</p>
<p>The internal array has several elements used by the page browser to keep track of where it is, which page is displayed, how many results per page and so on. These need setting at some point in your extension:<br /><br /><b>'currentTable'</b><br />This is the table name used in queries<br /><br /><b>'orderBy'</b><br />This is the field to sort results by<br /><br /><b>'descFlag'</b><br />This is the direction of the sort<br /><br /><b>'results_at_a_time'</b><br />How many results to show on each page<br /><br /><b>'maxPages'</b><br />How many pages to show - this is the number of clickable page links in the browser itself, not how many pages are required to browse through all results. This is dictated by the number of records in the table.<br /><b><br />'res_count'</b><br />This is used to store the total number of results in the table<br /><br /><b>'dontLinkActivePage'</b><br />This disables or enables the link to the current page<br /><br /><b>'showFirstLast'</b><br />Enables or disables First (page) and Last (page) links.<br /><br /><b>'showRange'</b><br />Shows result ranges instead of page numbers. If <b>'resultsPerPage' </b>is set to 10 then enabling this option would result in page 1 being displayed as 1-10, page 2 being displayed as 11-20 and so on.<br /><br /><b>'pagefloat'</b><br />This is the position of the current page in the displayed page links. It is by default set to 'center' (with american spelling), but can also be an integer. 'center' means that if <i>'maxPages' = 5</i>, the current page will always be page link 3 so that it is in the centre of the page links. Setting 'pagefloat' to a number makes the current page's link appear there instead.. e.g: <i>'pagefloat' = 2, 'maxPages' = 5</i> displays the current page as the second page link.</p>
<p class="inputText">// sb_portfolio's default setup of the internal array:<br />$this-&gt;internal['currentTable'] = $this-&gt;tableName;<br />$this-&gt;internal['orderBy'] = $this-&gt;orderField;<br />$this-&gt;internal['descFlag'] = $this-&gt;orderDir;<br />$this-&gt;internal['results_at_a_time'] = 10;<br />$this-&gt;internal['maxPages'] = 12;<br />$this-&gt;internal['res_count'];<br />$this-&gt;internal['dontLinkActivePage'] = 1;<br />$this-&gt;internal['showFirstLast'] = 0;<br />$this-&gt;internal['showRange'] = 0;<br />$this-&gt;internal['pagefloat'] = 'center';</p>
<p>You should store the starting point field in an element called<b> pidList</b>, since this is what is used by the page browser. I made the mistake of using the element <b>startingPoint,</b> so I had to either copy the<b> startingPoint</b> element to a new <b>pidList</b> element or rename the element where I stored the starting point. Since the field on the backend is called starting point (and that's what I think of it as being), I decided just to copy the value to a new <b>pidList</b> element:</p>
<p class="inputText">$this-&gt;conf['pidList'] = $this-&gt;conf['startingPoint'];</p>
<p>You also need to provide an array to store wraps for the page browser elements. These wraps can then be set in TypoScript by a site admin so that the different parts of the page browser are styled inline with the site's design.<br /><br /><b>'disabledLinkWrap'</b><br />This is the wrap for links that are disabled, like the previous button when you are on the first page.<br /><br /><b>'activeLinkWrap'</b><br />This is the wrap for the current page.<br /><br /><b>'inactiveLinkWrap'</b><br />This is the wrap for all other pages/links.<br /><br /><b>'browseLinksWrap'</b><br />This is a wrap for all the page links/buttons (next/previous etc.).<br /><br /><b>'showResultsWrap'</b><br />This is the wrap for the text saying how many results are shown.<br /><br /><b>'browseBoxWrap'</b><br />This is a wrap for the complete page browser.</p>
<p class="inputText">// sb_portfolio's default setup of the pbWrapper array:<br />$this-&gt;pbWrapper['disabledLinkWrap']<br />&nbsp;= trim($this-&gt;conf['pageBrowser.']['wraps.']<br />&nbsp;['disabledLinkWrap']);<br />$this-&gt;pbWrapper['inactiveLinkWrap']<br />&nbsp;= trim($this-&gt;conf['pageBrowser.']['wraps.']<br />&nbsp;['inactiveLinkWrap']);<br />$this-&gt;pbWrapper['activeLinkWrap']<br />&nbsp;= trim($this-&gt;conf['pageBrowser.']['wraps.']<br />&nbsp;['activeLinkWrap']);<br />$this-&gt;pbWrapper['browseLinksWrap']<br />&nbsp;= trim($this-&gt;conf['pageBrowser.']['wraps.']<br />&nbsp;['browseLinksWrap']);<br />$this-&gt;pbWrapper['showResultsWrap']<br />&nbsp;= trim($this-&gt;conf['pageBrowser.']['wraps.'<br />&nbsp;['showResultsWrap']);<br />$this-&gt;pbWrapper['browseBoxWrap']<br />&nbsp;= trim($this-&gt;conf['pageBrowser.']['wraps.']&nbsp;<br />&nbsp;['browseBoxWrap']);</p>
<p>Obviously you must set some default values for the wraps in your extensions TypoScript template:</p>
<p class="inputText">// These were my extensions default wraps, you can change the setup of the TS too, this was just how I chose to do it.<br />plugin.tx_sbportfolio_pi1 {<br />&nbsp; pageBrowser {<br />&nbsp;&nbsp;&nbsp; wraps {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disabledLinkWrap =<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;span class=&quot;pbLink disabledPbLink&quot;&gt;|&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inactiveLinkWrap =<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;span class=&quot;pbLink inactivePbLink&quot;&gt;|&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; activeLinkWrap =<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;span class=&quot;pbLink activePbLink&quot;&gt;|&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; browseLinksWrap = &lt;p class=&quot;pbButtons&quot;&gt;|&lt;/p&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showResultsWrap = &lt;p class=&quot;pbResults&quot;&gt;|&lt;/p&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; browseBoxWrap = <br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;div class=&quot;portPageBrowser&quot;&gt;|&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br />}<br /><br />// You could for example have:<br />plugin.yourExtensionName {<br />&nbsp; disabledLinkWrap =<br />&nbsp; &nbsp; &lt;span class=&quot;pbLink disabledPbLink&quot;&gt;|&lt;/span&gt;<br />}<br /><br />// In which case you would need to alter the assignment<br />// to the 'disabledLinkWrap' element, thus:<br />$this-&gt;pbWrapper['disabledLinkWrap'] =<br />&nbsp; trim($this-&gt;conf['disabledLinkWrap']);</p>
<p>Another variable required by the page browser is <b>$this-&gt;piVars['pointer'],</b> this keeps track of the current page, set this to zero if it doesn't already exist with the following piece of code (if it does exist, it doesn't need changing!):</p>
<p class="inputText">if (!isset($this-&gt;piVars['pointer'])) {<br />&nbsp;&nbsp;&nbsp; $this-&gt;piVars['pointer'] = 0;<br />}</p>
<p>Of course any and all of these properties could be changed by TypoScript variables or even FlexForm values. I used the folowing TS:</p>
<p class="inputText">plugin.tx_sbportfolio_pi1 {<br />&nbsp;&nbsp;&nbsp; # Enable or disable page browser<br />&nbsp;&nbsp;&nbsp; pageBrowser = 1<br /><br />&nbsp;&nbsp;&nbsp; pageBrowser {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # $this-&gt;internal['results_at_a_time']<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultsPerPage = 15<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # $this-&gt;internal['maxPages']<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numPageLinksDisplayed = 5<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # $this-&gt;internal['dontLinkActivePage']<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linkActivePage = 0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # $this-&gt;internal['showFirstLast']<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showFirstAndLastLinks = 0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # $this-&gt;internal['pagefloat']<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curPageLocation = center<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # $this-&gt;internal['showRange']<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showItemNumberRanges = 0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # $this-&gt;pi_alwaysPrev<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alwaysShowPrevious = 0<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>You then have to get the number of items and get the right items for the page number</p>
<p class="inputText">// Get the number of items in total<br />$query = $this-&gt;pi_list_query(<br />&nbsp; $this-&gt;tableName,<br />&nbsp; 1,<br />&nbsp; $this-&gt;cObj-&gt;enableFields($this-&gt;tableName),<br />&nbsp; '',<br />&nbsp; '',<br />&nbsp; 'ORDER BY ' . $this-&gt;orderField . ' ' . $this-&gt;orderDir<br />);<br /><br />$res = $GLOBALS['TYPO3_DB']-&gt;sql_query($query);<br /><br />// Set number of items<br />list($this-&gt;internal['res_count']) =<br />&nbsp; $GLOBALS['TYPO3_DB']-&gt;sql_fetch_row($res);<br /><br />// Now get the results for the page<br />$query = $this-&gt;pi_list_query(<br />&nbsp; $this-&gt;tableName, <br />&nbsp; 0, <br />&nbsp; $this-&gt;cObj-&gt;enableFields($this-&gt;tableName), <br />&nbsp; '', <br />&nbsp; '', <br />&nbsp; 'ORDER BY ' . $this-&gt;orderField . ' ' . <br />&nbsp; $this-&gt;orderDir<br />);<br /><br />$res = $GLOBALS['TYPO3_DB']-&gt;sql_query($query);<br /><br />// And make a list of them<br />$this-&gt;pi_list_makelist($res);<br /><br />// Make the page browser and story it in a class <br />// property for access later in the output function<br />// The third argument <b>$this-&gt;pbWrapper</b> is the array <br />// containing the wraps. Rename this to whatever array <br />// name you use.<br /><br />// The fifth argument<br />// <b>trim($this-&gt;conf['pageBrowser.']['allowJustText'])</b><br />// was a TS setting that stops the link text being <br />// sent through htmlspecialchars()<br />// so that html tags could be used in Local Language <br />// strings instead of just text - this allows images<br />// to be used for buttons<br /><br />$this-&gt;pBrowser = $this-&gt;pi_list_browseresults(<br />&nbsp; 1, <br />&nbsp; '', <br />&nbsp; $this-&gt;pbWrapper, <br />&nbsp; 'pointer',<br />&nbsp; trim($this-&gt;conf['pageBrowser.']['allowJustText'])<br />);</p>
<p>The call to <b>$this-&gt;pi_list_makelist()</b> requires that you have two functions in your code <b>pi_list_row</b> and&nbsp;<b>pi_list_header</b>. These handle getting the data for each result and wrapping it adding it to the output, but I already had the logic for sb_portfolio worked out didn't want to have to change that if the page browser was enabled. I was previously using <b>exec_SELECTgetRows</b> to get the results which returns an array or results. All the examples that I could find for using the page browser seemd to do all the formatting and adding of the result to the ouput in pi_list_row, which I didn't want so I just added the result to an array that I used later in the existing output functions. I didn't use <b>pi_list_header</b> so I just added an empty function with a return in it.</p>
<p class="inputText">// Add the current row to the array.<br />function pi_list_row($c) {<br />&nbsp;&nbsp;&nbsp; $this-&gt;queryData[] = $this-&gt;internal['currentRow'];<br />&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; // Procesing of the data for output will be done later in another function, I just need the results so return now.<br />&nbsp;&nbsp;&nbsp; return;<br />}<br /><br />// Header not needed, so just return when called<br />function pi_list_header() {<br />&nbsp;&nbsp;&nbsp; return;<br />}</p>
<p>Then all you need to do is have a marker in your extension which can be replaced with the page browser:</p>
<p class="inputText">// Page browser previously stored in $this-&gt;pBrowser needs to replace a marker in your extensions template:<br />// I called it PAGE_BROWSER, but you can call it whatever you want.<br />$subpartArray['###PAGE_BROWSER###'] = $this-&gt;pBrowser;</p>
<p>Now you have a fully functional page browser.</p>]]></content:encoded>
			<category><a href="en/blog/categories/typo3.html" title="TYPO3">TYPO3</a></category>
			
			<author>stephen@bungert.co.uk</author>
			<pubDate>Fri, 17 Apr 2009 14:37:00 -0400</pubDate>
			
		</item>
		
		<item>
			<title>TYPO3 Extension Development book review</title>
			<link>http://www.bungert.co.uk/en/blog/articles/typo3-extension-development-book-review.html</link>
			<description>TYPO3 Extension Development, Dmitry Dulepov's new book aimed at the TYPO3 developer... well I'm one...</description>
			<content:encoded><![CDATA[<h2> My experience with TYPO3</h2>
<p>I have been using TYPO3 for about one and a half years, at first this was difficult because the documentation is hard to find and when you do find it, it is hard to follow, especially <a href="http://typo3.org/documentation/document-library/references/doc_core_tsref/4.2.0/view/" title="View TSREF 4.2.0" class="external-link-new-window" >TSREF</a> and the <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/" title="View the Core API 4.2.0" class="external-link-new-window" >core API.</a></p>
<p>There are some free books at the TYPO3 website, like <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_ts/4.2.0/view/" title="View TypoScript Syntax and In-depth Study 4.2.0" class="external-link-new-window" >TypoScript Syntax and In-depth Study</a> or <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_inside/4.2.0/view/" title="View Inside TYPO3 4.2.0" class="external-link-new-window" >Inside TYPO3</a>, but they still don't answer most questions since they are reference books, and to use them you have to know what your want to reference.</p>
<p>I have had to create several extensions for TYPO3 after using it for only a few weeks on-and-off when I had time. This meant that my first extension didn't use templates or TypoScript properties... basically because I couldn't find anything about how to do this, at least not in a way I could understand - and not in time to meet my deadlines. I would have really liked this book then; the contents list seemed to cover everything I had trouble doing at first: using TypoScript properties, working with templates, etc.</p>
<h3>So do I still need this book?</h3>
<p>Those kind of things I can do now, and I have made several extension for work... do I still need a book like this? The answer is <b>yes</b>, this book is not just for the beginner, it covers some very complex subjects like writing backend modules.<br /><br />I had to do this once for a modified version of nawl_secured extension, and I was sort of working blind just looking at the backend of an extension for page comments (not Dmitry's), I got it working even though I wasn't sure what I was doing - a book like this would have made it so much more easier. I'm also working on a new extension that will make extensive use of a backend module so this chapter has helped me a lot and been very informative.</p>
<h2>Scope of the book</h2>
<p><a href="http://www.packtpub.com/typo3-extension-development/book" title="Go to the TYPO3 Extension Development page at Packt Publishing" class="external-link-new-window" ><img class="left" alt="Book Cover" title="TYPO3 Extension Development Cover" src="uploads/RTEmagicC_t3_ext_dev_cover.jpg.jpg" width="221" height="286" /></a></p>
<p>The book starts with an explanation of the TYPO3 API, how it is divided in to three parts and talks about important and useful functions that every developer should know and be using. It explains what t3lib_ and tslib_ are, what the TCE (TYPO3 Core Engine) and TCA (Table Configuration Array) are and what they do.<br /><br />The next chapter breaks down an extension in to its component parts and explains what all those files are that the Kickstarter generates. The different types of extension categories (FE, FE Plug-in, Backend Module, etc.) are also discussed.<br /><br />The following two chapters cover planning an extension and then generating the basics of it with the kickstarter extension. Chapter 5 is an analysis of a frontend extension and covers topics like static TypoScript, templating, localization and caching.<br /><br />After this we have two chapters about programming - frontend and backend. These chapters are very interesting... you get to create an extension for user management and statistics (The one created with the kickstarter in chapter 4) with several modes, a bit like tt_news: there's a list view, a single page view, and a search view where you are even shown how to implement auto-complete on the search box - great stuff!<br /><br />The last chapter talks about writing your extension manual (in <a href="http://openoffice.org/" title="Go to openoffice.org" class="external-link-new-window" >OpenOffice</a>), cleaning up the files and uploading your extension to the <a href="http://typo3.org/extensions/repository/" title="Go to the Extension Repository" class="external-link-new-window" >TYPO3 extension repository.</a></p>
<h3>What I would have like to have seen:</h3><ul><li>How to show the content of my extension in the page module (like tt_news articles do). The list module was covered in the book, page view wasn't. I shall have a look through tca.php in the tt_news folder. Maybe now I know more about the TCA arrays, I can see how it's done.</li></ul><h2>Overall</h2>
<p>I was very impressed with this book, it's sort of the unwritten manual for TYPO3 developers, if you have started writting extensions for TYPO3 and always wanted to know how to use FlexForms, how to support localisation or how to make a backend module for your Extension this is the book to get.</p>
<p>Even if you think you know how to do these things already, Dmitry will still probably tell you something you didn't know, or explain how to do it better. Order it now, or get the Easter Bunny to bring you it instead of an egg!</p>
<p>As a present, the Easter Bunny left me a sample chapter that you can download:</p>]]></content:encoded>
			<category><a href="en/blog/categories/typo3.html" title="TYPO3">TYPO3</a></category>
			
			<author>stephen@bungert.co.uk</author>
			<pubDate>Mon, 06 Apr 2009 14:25:00 -0400</pubDate>
			<enclosure url="http://www.bungert.co.uk/uploads/media/TYPO3_Extension_Development_Chapter_2_-_Anatomy_of_a_TYPO3_Extension.pdf" length ="671555" type="application/pdf" />
		</item>
		
		<item>
			<title>TYPO3 Gamebook extension</title>
			<link>http://www.bungert.co.uk/en/blog/articles/typo3-gamebook-extension.html</link>
			<description>Remember FightingFantasy books? Choose your own adventure? I'm planning to make a game book...</description>
			<content:encoded><![CDATA[<p>   My interest in gamebooks was rekindled after finding the <a href="http://www.ffproject.com/" title="Free FF style online game books" class="external-link-new-window" >Fighting FantasyProject</a>, and <a href="http://www.projectaon.org/" title="Project Aon" class="external-link-new-window" >Lone Wolf Online.</a> I have a bit of experience now with TYPO3 and TYPO3 extension development now and have started planning a&nbsp; new extension to allow the creation and playing of game books in a TYPO3 based site.</p>
<h2>Initial ideas</h2><ul><li>Create monsters site-wide that can then be used by book authors</li><li>Create weapons and items site-wide that can then be used by book authors</li><li>Use existing Monsters, Items and weapons as templates for new or book specific&nbsp; versions</li><li>Also have a store of images that can be used by authors</li><li>Create styles for books that can be selected by authors, e.g: Default style (like an old book), Horror style (like the default but with blood splats on the pages and things, Sci-fi style...</li><li>Default character attributes, and have the ability to create extra book specific attributes</li></ul>]]></content:encoded>
			<category><a href="en/blog/categories/typo3.html" title="TYPO3">TYPO3</a></category>
			<category><a href="en/blog/categories/gamebook.html" title="Gamebook">Gamebook</a></category>
			
			<author>stephen@bungert.co.uk</author>
			<pubDate>Thu, 02 Apr 2009 05:35:00 -0400</pubDate>
			
		</item>
		
		<item>
			<title>SB_Portfolio v0.0.2</title>
			<link>http://www.bungert.co.uk/en/blog/articles/sb-portfolio.html</link>
			<description>My extension sb_porfolio has been updated. The manual has been edited, and several bugs fixed...</description>
			<content:encoded><![CDATA[<p>There are extra typoscript properties for width and height so that these can be set site-wide. For a live example vist the <a href="en/portfolio.html" title="Go to my Portfolio" target="_top" class="internal-link" >Portfolio section</a> on my site.</p>]]></content:encoded>
			<category><a href="en/blog/categories/typo3.html" title="TYPO3">TYPO3</a></category>
			<category><a href="en/blog/categories/sb_portfolio.html" title="SB Portfolio">SB Portfolio</a></category>
			
			<author>stephen@bungert.co.uk</author>
			<pubDate>Sat, 14 Mar 2009 02:22:00 -0400</pubDate>
			
		</item>
		
		<item>
			<title>Changing the file icons displayed in tt_news</title>
			<link>http://www.bungert.co.uk/en/blog/articles/changing-the-file-icons-displayed-in-tt-news.html</link>
			<description>The list of files displayed in tt_news is great, if you like the default TYPO3 icons. If you don't,...</description>
			<content:encoded><![CDATA[<p class="inputText"># Change file icon directory<br />newsFiles {<br />&nbsp; stdWrap {<br />&nbsp; &nbsp; substring = 49<br />&nbsp; &nbsp; innerWrap = &lt;img src=&quot;fileadmin/path/to/icons/|<br />&nbsp; }<br />}</p>
<h2>What does it do?</h2>
<p>First, I cut the first 49 characters away from the &lt;img&gt; tag using stdWrap. Maybe you will have to change this to another number, but with both my sites it worked ok. This removes everything up to and including the last slash in the src attribute.</p>
<p>Then I use the innerWrap property of stdWrap to recreate the start of the &lt;img&gt; tag, with of course the path to where my icons are stored for the site.</p>
<p>That's it! The image will then be taken from your sites specified directory, which of course contains icons that match your sites design.</p>
<h2>Taking it further</h2>
<p>If you should need to you can send the &lt;img&gt; tag through the HTML parser to alter other attributes, like for example, width and height. Also don't forget allowTags = a, otherwise the link to the file will get removed!</p>
<p class="inputText">stdWrap.HTMLparser = 1<br />stdWrap.HTMLparser.allowTags = a<br />stdWrap.HTMLparser.tags.img.fixAttrib.width.set&nbsp; = 12<br />stdWrap.HTMLparser.tags.img.fixAttrib.height.set = 12</p>]]></content:encoded>
			<category><a href="en/blog/categories/typo3.html" title="TYPO3">TYPO3</a></category>
			
			<author>stephen@bungert.co.uk</author>
			<pubDate>Wed, 25 Jun 2008 18:03:00 -0400</pubDate>
			
		</item>
		
		<item>
			<title>Creating .swf files with EditPad Pro and MTASC</title>
			<link>http://www.bungert.co.uk/en/blog/articles/creating-swf-files-with-editpad-pro-and-mtasc.html</link>
			<description>My laptop is really getting slow... so slow I need an alternative to the Flash IDE. I recently came...</description>
			<content:encoded><![CDATA[<p>Well, it wanted to use some Java IDE to code the ActionScript in. The one thing Java isn't is fast, I would have no chance doing this on my old Dell. Besides, I like and want to carry on using EditPad Pro to write my ActionScript code, as I had done when I used the Flash IDE.</p>
<p>After a bit of messing about I finally got the thing to work, here's how:</p><ol><li>  <a href="http://www.mtasc.org/#download" mce_href="http://www.mtasc.org/#download">Download</a> MTASC</li><li>Extract it to a location of your choice</li><li>Create a test ActionScript class, <a href="http://www.mtasc.org/#tutorial" mce_href="http://www.mtasc.org/#tutorial">like the one on the MTASC site</a></li><li>Open EditPad Pro</li><li>Open the <b>Configure External Tools</b> window (<i>Tools-&gt;Configure Tools...</i>). then create a new Tool with the following settings:<br /><br /></li></ol><blockquote style="margin-bottom:0;margin-top:0;"><p><a href="fileadmin/bungert/images/news_images/epp-tools-mtasc-00.png" target="_top" class="download" ><img class="left" alt="EditPad Pro Tools Window" title="Configure External Tools (Definition Tab)" src="uploads/RTEmagicC_epp-tools-mtasc-00.png.png" width="221" height="161" /></a></p>
<h2>Definition Tab</h2></blockquote><blockquote style="margin-bottom:0;margin-top:0;"><p><b>Caption:</b><br /> Compile ActionScript</p>
<p><b>Hint:</b><br />Create a .swf Flash movie with MTASC</p>
<p><b>Command Line: </b><b><br /></b>mtasc -swf %FILENAMENOEXT%.swf -main -header 800:600:24:ff0000 %FILENAME%</p>
<p><b>Working Folder:  </b><br />%PATH%\<br /><br /></p>
<p><a href="fileadmin/bungert/images/news_images/epp-tools-mtasc-01.png" target="_top" class="download" ><img class="left" alt="EditPad Pro Tools Window 2" title="Configure External Tools (Standard I/O)" src="uploads/RTEmagicC_epp-tools-mtasc-01_01.png.png" width="221" height="161" /></a></p></blockquote><blockquote style="margin-bottom:0;margin-top:0;"><h2>Standard I/O Tab<i><br /></i></h2>
<p><b>What to send to tool's standard input:</b><br />Nothing</p>
<p><b>How to capture the tool's standard output</b><br />Into message pane </p>
<p><b>How to capture the tool's standard error</b><br /> Combine with output</p></blockquote><p>That's it. Just open the .as fileyou created in step 3 and select <i>Tools-&gt;Compile ActionScript.</i> More options for the command line can be found on the MTASC site, as well explanations of what they do.</p>]]></content:encoded>
			<category><a href="en/blog/categories/web_development.html" title="Web Development">Web Development</a></category>
			
			<author>stephen@bungert.co.uk</author>
			<pubDate>Fri, 30 May 2008 23:55:00 -0400</pubDate>
			
		</item>
		
	</channel>
</rss>