<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sakic.Net blog</title>
	<atom:link href="http://www.sakic.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sakic.net/blog</link>
	<description>Learn about Joomla, PHP, mySQL, Javascript, AJAX, CSS, web technologies and development</description>
	<lastBuildDate>Wed, 30 Jun 2010 06:10:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SEF Advance extension for K2</title>
		<link>http://www.sakic.net/blog/sef-advance-extension-for-k2/</link>
		<comments>http://www.sakic.net/blog/sef-advance-extension-for-k2/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 02:11:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[SEF]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=44</guid>
		<description><![CDATA[SEF Advance extension for K2 is now in testing phase. If you use the K2 component for Joomla it will give you some kick-ass URLs in combination with SEF Advance. Interested? Help testing! Join the discussion on forum. Let me show this on an example. Let&#8217;s say you have a category called Animals, under that a [...]]]></description>
			<content:encoded><![CDATA[<p><img title="moving" src="http://www.sakic.net/blog/wp-content/uploads/2010/06/k2.jpg" alt="K2" hspace="6" width="200" height="79" align="right" />SEF Advance extension for K2 is now in testing phase. If you use the K2 component for Joomla it will give you some kick-ass URLs in combination with SEF Advance. Interested? Help testing! Join the discussion on <a href="http://www.sakic.net/forum/sef-advance/sef-advance-extension-for-k2/">forum</a>.</p>
<p><span id="more-44"></span>Let me show this on an example. Let&#8217;s say you have a category called <strong>Animals</strong>, under that a subcategory called <strong>Birds</strong> and finally two items there: <strong>Eagle</strong> and <strong>Hawk</strong>. The parent category Animals is linked to menu.</p>
<p><strong>The regular K2 SEF URLs are right now like:</strong><br />
Animals (category): <a>http://domain/animals</a><br />
Birds (subcategory): <a>http://domain/animals/itemlist/category/4-birds</a><br />
Eagle (item): <a>http://domain/animals/item/3-eagle</a><br />
Hawk (item): <a>http://domain/animals/item/4-hawk</a></p>
<p><strong>With the new extension for SEF Advance you get:</strong><br />
Animals (category): <a>http://domain/animals/</a><br />
Birds (subcategory): <a>http://domain/animals/birds/</a><br />
Eagle (item): <a>http://domain/animals/birds/eagle/</a><br />
Hawk (item): <a>http://domain/animals/birds/hawk/</a></p>
<p>It works for unlimited category depth. As you can see there are no IDs nor strange words in the URLs and they are far more logical reflecting your content structure. The other K2 views are also covered with improved URLs.</p>
<p>You will notice there is no &#8220;k2&#8243; component prefix in the URLs either which was the case in all previous extensions for 3rd party components. This is possible thanks to a new API format in SEF Advance which allows for this to be skipped (will require SEF Advance v2.3.1 or later). As K2 is often used as a replacement for Joomla&#8217;s own content component and tightly connected to the core, I figured you will appreciate this feature as URLs become far more advanced and simple.</p>
<p>The extension is almost completed and will be available soon for free download to all SEF Advance users. I would appreciate your help through this testing phase though.</p>
<p>How can you help?</p>
<p>If you have a well developed K2 site (preferably the latest version 2.3) with many categories and content and wouldn&#8217;t mind me testing the extension there please contact me with your admin password and FTP info. You will most certainly get the access to the extension first in that case.</p>
<p>Join the discussion on <a href="http://www.sakic.net/forum/sef-advance/sef-advance-extension-for-k2/">forum</a> and help improving it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/sef-advance-extension-for-k2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Forum spam</title>
		<link>http://www.sakic.net/blog/forum-spam/</link>
		<comments>http://www.sakic.net/blog/forum-spam/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 16:49:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=42</guid>
		<description><![CDATA[Recently I began to receive huge amount of spam on forum. The attack started about a month ago with hundreds of fake registrations every day all adding spam links to various sites for SEO purposes. The curious thing is that they were able to bypass different types of visual verifications, anti-bot systems and email activation which suggests these [...]]]></description>
			<content:encoded><![CDATA[<p><img title="moving" src="http://www.sakic.net/blog/wp-content/uploads/2010/01/no-spam.gif" alt="spam" hspace="6" width="100" height="100" align="right" />Recently I began to receive huge amount of spam on <a href="http://www.sakic.net/forum/">forum</a>. The attack started about a month ago with hundreds of fake registrations every day all adding spam links to various sites for SEO purposes. The curious thing is that they were able to bypass different types of visual verifications, anti-bot systems and email activation which suggests these are attacks with human intervention.<span id="more-42"></span></p>
<p>The pattern is the same: someone would register on the site, passing the visual CAPTCHA, activating the account, commonly with Yahoo or Gmail account and immediately begin to edit the profile adding links to their signature, URL, even profile pictures. Some would also enter more or less meaningless posts to give their spam links more exposure. The registrations come from different IP addresses, mostly from Asia but also from USA and Europe.</p>
<p>To fight this I first started deleting the posts and banning the IP addresses but I soon realised that they change IPs and find proxies faster than I can ban them. A new registration would come every 5 minutes so I thought it must be some kind of smart script or bot doing it. I changed the visual verification to reCAPTCHA and added anti-bot question on registration. The attacks decreased a bit but quite a few were still able to get through. I even received an email from someone complaining that the reCAPTCHA was hard to solve! The same person then created a spam account.</p>
<p>Since this proved to be not just simple bot attack but a massive spam with human intervention, I switched to manually approving new registrations. A new user will now have to enter a reason for registration. I will then review the application based on this input, email and the IP address. The spammers are still trying, entering pretty smart inputs, but I can at least eliminate them effectively before they can contaminate the forum. The manual approval will unfortunately reflect on regular users making it more difficult to participate.</p>
<p>The spammers get more advanced switching from automatic bots to hiring humans to make fake registrations and enter spam links. How they manage to pull off such a massive attack using real man power so it pays off is still mystery to me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/forum-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>We are moving</title>
		<link>http://www.sakic.net/blog/we-are-moving/</link>
		<comments>http://www.sakic.net/blog/we-are-moving/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 00:26:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=40</guid>
		<description><![CDATA[This week we are moving. From USA to Europe actually. Well, only the site of course. There could be some disturbances with Sakic.Net and its services so please bear with us until things are settled and everything is in place on the new server. EDIT (Oct 31st 2009): The server move has been completed. Hope everything went [...]]]></description>
			<content:encoded><![CDATA[<p><img title="moving" src="http://www.sakic.net/blog/wp-content/uploads/2009/10/moving.gif" alt="moving" hspace="6" width="100" height="110" align="right" />This week we are moving. From USA to Europe actually. Well, only the site of course. There could be some disturbances with Sakic.Net and its services so please bear with us until things are settled and everything is in place on the new server.</p>
<p>EDIT (Oct 31st 2009): The server move has been completed. Hope everything went smoothly and you haven&#8217;t noticed it. Please leave a comment about how the new host feels: is the site faster, slower and where you surf from.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/we-are-moving/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why am I encoding my scripts</title>
		<link>http://www.sakic.net/blog/why-am-i-encoding-my-scripts/</link>
		<comments>http://www.sakic.net/blog/why-am-i-encoding-my-scripts/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 10:30:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[joomla]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=38</guid>
		<description><![CDATA[Recently it came to my attention that someone copied one of my free and GPL components for Joomla, made cosmetic changes and started selling it. According to GPL there wouldn&#8217;t be anything wrong with that if they also didn&#8217;t change the license to a proprietary one (which text they also copied from my non-GPL products) [...]]]></description>
			<content:encoded><![CDATA[<p><img title="PHP encoding" src="http://www.sakic.net/blog/wp-content/uploads/2009/09/php_locker.gif" alt="PHP encoding" width="100" height="110" align="right" />Recently it came to my attention that someone copied one of my free and GPL components for Joomla, made cosmetic changes and started selling it. According to GPL there wouldn&#8217;t be anything wrong with that if they also didn&#8217;t change the license to a proprietary one (which text they also copied from my non-GPL products) and if they didn&#8217;t steal the component&#8217;s name as well. For this reason I am getting emails asking for relation with this site, even asking me for support.<br />
<span id="more-38"></span></p>
<p>Things to get worse they are even publishing a module for their rip-off component on Joomla Extension Directory (JED) which is sold under the same proprietary license but claiming to be GPL. A week ago I submitted a report to JED team but they did nothing to remove this module, which is used by visitors to find this pirated component and their site, not even to reply my email. The same JED team who swear on GPL, were quick to remove all my non-GPL extensions, checked my site and manually examined the code for all my commercial GPL products.</p>
<p>Of course there is no way for me to do anything about this component. Complaining didn&#8217;t help and legal action is of course not feasible. It&#8217;s people like this that make me reluctant to release anything GPL or open source any more. It also confirms why encoding my commercial products has been a good idea.</p>
<p>Namely, a similar thing happened several years ago when I released <a href="http://www.sakic.net/products/sef_advance/">SEF Advance</a>, the first SEF component for Joomla and Mambo which later became widely popular and followed by many other extensions. At first, the script was not encoded but had a simple protection instead. It got easily broken and the component, being so wanted, started appearing on warez sites. About that time the first open source SEF components started to appear as well. Examining their code I could find the same principles, copies of my code, same variable names and comments as found in SEF Advance. I didn&#8217;t want to make a big deal out of it so I just let it go and started encoding SEF Advance. However, these open source components had been picked up by others who continued the project as per GPL nature. Later on I could find bigger portions of my code even in OpenSEF. I personally know the OpenSEF author, a great guy. He acted in good faith taking over the previous GPL projects and had no idea they contained pirated code. This project later evolved and was recoded, picked up by other projects but it&#8217;s interesting that many SEF components for Joomla originate from SEF Advance and its code, even though it never was open source.</p>
<p>There has been a lot of buzz around GPL and encoding for Joomla extensions recently, both for and against. Why I am doing it is not because of some script kiddies who would find it on warez sites, who would never have bought it anyway. I do it because of authors without honour like the one from the beginning of this text. The authors that would breach your copyright, take the credit for themselves and try to earn some money out of your work. Other authors and users will then be unknowingly using illegal code and, in worst case, even ask you for support. Encoding is the easiest way to protect your customers, be able to give them support they deserve and clearly separate your work from the competition.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/why-am-i-encoding-my-scripts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changing CakePHP pagination URLs</title>
		<link>http://www.sakic.net/blog/changing-cakephp-pagination-urls/</link>
		<comments>http://www.sakic.net/blog/changing-cakephp-pagination-urls/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 13:25:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[urls]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=35</guid>
		<description><![CDATA[CakePHP framework provides a great pagination helper but its default URLs aren&#8217;t that great. By default it generates URLs that look like: http://domain/news/page:2. I spent a long time looking for a way to skip &#8220;page:&#8221; part in URLs and in links generated by the helper, or even just change the string &#8220;page&#8221; to something else. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.sakic.net/blog/wp-content/uploads/2009/07/cake-logo.png" alt="CakePHP" width="90" height="90" align="right" /></p>
<p><a href="http://cakephp.org/" target="_blank">CakePHP</a> framework provides a great pagination helper but its default URLs aren&#8217;t that great. By default it generates URLs that look like: <a href="javascript: void(0)">http://domain/news/page:2</a>. I spent a long time looking for a way to skip &#8220;page:&#8221; part in URLs and in links generated by the helper, or even just change the string &#8220;page&#8221; to something else. It showed up that there&#8217;s no easy way to configure the paginator that way. So I came up with a workaround that will change your CakePHP pagination URLs to: <a href="javascript: void(0)">http://domain/news/2</a><span id="more-35"></span></p>
<p>Assuming that you already created pagination on your site according to <a href="http://book.cakephp.org/view/164/Pagination" target="_blank">CakePHP instructions</a> we will start making a few changes. We begin with the view where we want to modify automatically generated links into the new ones:</p>
<pre class="brush: php;">
$prev_link = str_replace('page:', '', $paginator-&gt;prev('« Prev'));
$prev_link = preg_replace('/\/1&quot;/', '&quot;', $prev_link);
$next_link = str_replace('page:', '', $paginator-&gt;next('Next »'));
echo $prev_link;
echo $next_link;
</pre>
<p>This will take out &#8220;page:&#8221; part from the prev/next links and make them only contain the page number instead. Also, we replace  <a href="javascript: void(0)">http://domain/news/1</a> with only <a href="javascript: void(0)">http://domain/news</a> in order to avoid alias URLs and penalties for duplicate content by search engines. Be sure to apply the same method to the rest of your links such as those generated by numbers() method etc., if you are using them.</p>
<p>Now we need to make sure that the Cake makes correct interpretation of the passed argument. In our router file we add something like:</p>
<pre class="brush: php;">
Router::connect('/news/*', array('controller' =&gt; 'news', 'action' =&gt; 'display'));
</pre>
<p>This will forward our pagination links to news controller and its display() method. Our page number parameter will be passed as argument to this method. Let&#8217;s take a look at the code in news_controller.php:</p>
<pre class="brush: php;">
public function display($option='') {
if (is_numeric($option)) {
$this-&gt;passedArgs['page'] = $option;
}
$items = $this-&gt;paginate('News');
...
}
</pre>
<p>As we can see we take the passed argument and assign it to the passedArgs array under the &#8216;page&#8217; key where all named URL parameters are held. This way the paginator will understand that we are on the page passed by our URL.</p>
<p>That&#8217;s it. If you&#8217;ve done it correctly you now have nice pagination URLs like:<br />
<a href="javascript: void(0)">http://domain/news</a><br />
<a href="javascript: void(0)">http://domain/news/2</a><br />
<a href="javascript: void(0)">http://domain/news/3</a><br />
instead of:<br />
<a href="javascript: void(0)">http://domain/news</a><br />
<a href="javascript: void(0)">http://domain/news/page:1</a> (duplicate)<br />
<a href="javascript: void(0)">http://domain/news/page:2</a><br />
<a href="javascript: void(0)">http://domain/news/page:3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/changing-cakephp-pagination-urls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrating Twitter into your Joomla site</title>
		<link>http://www.sakic.net/blog/integrating-twitter-into-your-joomla-site/</link>
		<comments>http://www.sakic.net/blog/integrating-twitter-into-your-joomla-site/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 02:42:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=31</guid>
		<description><![CDATA[Twitter is the new thing on the internet. With it you can leave short updates about what you are up to and your followers will be updated. If you have a Twitter account and a Joomla site you may want to show your latest Twitter updates on it. Using our product AJAX Scroller you can show [...]]]></description>
			<content:encoded><![CDATA[<p><img title="Twitter" src="http://www.sakic.net/blog/wp-content/uploads/2009/06/twitter_logo_header.png" alt="Twitter" width="155" height="36" align="right" />Twitter is the new thing on the internet. With it you can leave short updates about what you are up to and your followers will be updated. If you have a Twitter account and a Joomla site you may want to show your latest Twitter updates on it. Using our product <a href="http://www.sakic.net/products/ajax_scroller/">AJAX Scroller</a> you can show not only your own updates, but also the updates of all of your friends. And all of them can be loaded and browsed with no extra overhead. Here is how you do it.<span id="more-31"></span></p>
<ol>
<li>Download <a href="http://www.sakic.net/products/ajax_scroller/">AJAX Scroller</a>. There is a <a href="http://www.sakic.net/support/trial/12/">free trial</a> available for testing.</li>
<li>Install the module on your Joomla site. Doesn&#8217;t matter which version you use, the same package will install and work both on Joomla 1.5 native and Joomla 1.0.</li>
<li>After the installation go to the Module manager and edit the module to adjust its parameters. The images below show the optimal settings:<br />
<img title="AJAX Scroller params 1" src="http://www.sakic.net/blog/wp-content/uploads/2009/06/ajax_scroller_params-1.gif" alt="AJAX Scroller params 1" hspace="4" width="300" height="333" align="left" /><strong><span style="text-decoration: underline;">Important settings</span><span style="font-weight: normal;"></p>
<p></span></strong><strong>Type</strong>: select Twitter<br />
<strong>Max chars</strong>: limits the item text<br />
<strong>Max number of items</strong>: Limit number of displayed updates, set 0 for unlimited, in this case it will mean 20 as per Twitter API feed limits<br />
<strong>Display image</strong>: shows the Twitter profile image<br />
<strong>Max image width</strong>: resizes the profile image</p>
<p style="clear: both;">
<p><img title="AJAX Scroller Params 2" src="http://www.sakic.net/blog/wp-content/uploads/2009/06/ajax_scroller_params-2.gif" alt="AJAX Scroller Params 2" hspace="4" width="380" height="345" align="left" /><strong><span style="text-decoration: underline;">Important settings</span></strong></p>
<p><strong>Twitter timeline</strong>: select if you want to show only your own updates (user timeline) or also your friends updates (friends timeline), mentions of your username or search by keyword.<br />
<strong>Twitter username</strong>: enter your username on Twitter<br />
<strong>Twitter password</strong>: only needed if friends timeline selected<br />
<strong>Cache / Time</strong>: because Twitter limits number of API calls to max 100 per minute it&#8217;s crucial to use caching. Select minimum of 60 seconds cache time. Otherwise Twitter may temporarily ban you and the module won&#8217;t be able to connect.</p>
<p style="clear: both;">
</li>
<li>That&#8217;s it. Save the module, publish it to selected position and it will display and smoothly scroll your Twitter updates. The updates will be pre-fetched asynchronously from cache and Twitter servers will be contacted as often as you specified.</li>
</ol>
<p>Check out our <a href="http://joomla15.sakic.net/ajax-scroller/" target="_blank">DEMO site</a> to see how it looks in action. You will see Twitter module working both for user timeline and friends timeline. If you need help with installation, styling and troubleshooting AJAX Scroller check out the <a href="http://www.sakic.net/support/faq/ajax_scroller/#q">FAQ</a> and visit our <a href="http://www.sakic.net/forum/ajax_series-b4.0/">Forums</a>.</p>
<p>Have fun with Twitter on your Joomla site!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/integrating-twitter-into-your-joomla-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Package extensions for Joomla 1.5 and 1.0 together</title>
		<link>http://www.sakic.net/blog/package-joomla-extensions-together/</link>
		<comments>http://www.sakic.net/blog/package-joomla-extensions-together/#comments</comments>
		<pubDate>Sat, 30 May 2009 12:50:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[joomla]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=16</guid>
		<description><![CDATA[If you ever tried to write an extension for Joomla you probably know that old components, modules, plugins and templates, for Joomla version 1.0, are not compatible with version 1.5. With some minor tweaking, you could get old extensions to run quite nicely in Joomla 1.5 if you turned on the legacy mode plugin. However, more [...]]]></description>
			<content:encoded><![CDATA[<p><img title="cubes" src="http://www.sakic.net/blog/wp-content/uploads/2009/05/cubes.gif" alt="cubes" hspace="6" width="154" height="100" align="right" />If you ever tried to write an extension for Joomla you probably know that old components, modules, plugins and templates, for Joomla version 1.0, are not compatible with version 1.5. With some minor tweaking, you could get old extensions to run quite nicely in Joomla 1.5 if you turned on the legacy mode plugin.</p>
<p>However, more and more Joomla users require native 1.5 extensions only and won&#8217;t bother turning on the legacy mode. The developers convert their old extensions to new ones but they are forced to distribute them separately for different Joomla versions. Here is how you can fit them together so that the same package can be installed both on Joomla 1.0 and 1.5, without legacy mode needed.<span id="more-16"></span></p>
<p><strong>Why a single installation package?</strong></p>
<p>It&#8217;s convenient both for the user and the developer to only deal with a single installation file which works for any Joomla version. However, users wanting legacy-mode free plugins complicate the situation. Even if developer manages to solve the incompatibilities on the code level he will still be faced with installation obstacles. Namely, Joomla 1.5 has a new manifest format and won&#8217;t install an old extension without legacy mode being turned on.</p>
<p>I&#8217;ve seen some devs instructing their users to temporarily turn on the legacy mode just for installation to be turned off immediately after. This is not ideal solution as users do not often read the instructions and, after they have been presented with a message &#8220;This extension is written for old version of Joomla&#8221; they may be giving up. So what can we do? Well, here is a solution that elegantly solves this problem creating a single package which installs on both Joomla versions with no legacy mode needed at any time.</p>
<p><strong>Solution</strong></p>
<p>The trick is to use two different manifest files, one for Joomla 1.0, and other for Joomla 1.5. We need to package our extension in a special way to fool the installers to load the appropriate manifest. Here is an example for packaging a simple Joomla module in a file installable on both Joomla versions with no legacy mode. The same example can be analogously applied to components, plugins etc.</p>
<p>I call my module mod_example and structure it as follows:</p>
<p><img class="alignleft" style="margin-left: 6px; margin-right: 6px;" title="Module tree" src="http://www.sakic.net/blog/wp-content/uploads/2009/05/module_tree.gif" alt="Module tree" width="190" height="220" /></p>
<p>As you can see, I have files and folders for Joomla 1.0 directly under the root, but I create a new folder called &#8220;1.5&#8243; in which I put files and folders for Joomla 1.5. You can call this folder differently but the name has to start with a character that comes before &#8220;m&#8221; in the alphabet. The trick is that Joomla 1.5 installer will take the first manifest it finds in the package, which in this case will be: 1.5/mod_example.xml, while Joomla 1.0 installer will take the manifest that resides on root: mod_example.xml.</p>
<p>This way we can nicely separate files for Joomla 1.0 and Joomla 1.5. Of course, we have in fact two modules in one package so we must maintain both but it&#8217;s worth it since we can take advantage of Joomla 1.5 framework and we avoid mixing things together if we would to have everything in same files. If we now zip it together we get a single package that installs both on Joomla 1.0 and 1.5!</p>
<p>Finally, I attach the zipped example module that you can play with and try to install on both Joomla 1.0 and Joomla 1.5 without legacy mode.</p>
<div style="clear: both;"><a href="http://www.sakic.net/content/scripting_files/mod_example.zip"><img class="size-full wp-image-29 alignnone" style="margin-left: 6px; margin-right: 6px;" title="mod_example.zip" src="http://www.sakic.net/blog/wp-content/uploads/2009/05/64px-winzip_icon.png" alt="64px-winzip_icon" width="64" height="64" /></a><a href="http://www.sakic.net/content/scripting_files/mod_example.zip">mod_example.zip</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/package-joomla-extensions-together/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Welcome</title>
		<link>http://www.sakic.net/blog/welcome/</link>
		<comments>http://www.sakic.net/blog/welcome/#comments</comments>
		<pubDate>Wed, 27 May 2009 21:37:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.sakic.net/blog/?p=1</guid>
		<description><![CDATA[This is my first blog post. In addition to our regular products news, this blog will be used to post about best practices using Joomla and programming for it, using our products and other Joomla extensions and for general web development hints. Be sure to subscribe to our RSS feed and follow it while I [...]]]></description>
			<content:encoded><![CDATA[<p>This is my first blog post. In addition to our regular <a href="http://www.sakic.net/news/">products news</a>, this blog will be used to post about best practices using Joomla and programming for it, using our products and other Joomla extensions and for general web development hints. Be sure to subscribe to our <a href="http://www.sakic.net/rss/">RSS feed</a> and follow it while I will try to post regularly and keep you up to date with interesting and useful stuff for web developers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sakic.net/blog/welcome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
