Skip to main content

Welcome to Geoff Hayward's Weblog

Commenting on Java, JavaFX, Java EE, Joomla, and IoT.

Once you have unpacked and installed a nice new shiny instance of Joomla what extensions take Joomla from being a fantastic CMS to being a super CMS?

I have tried many Joomla extensions, some are very good. The list of good extensions, I am happy to say, is longer than the list of bad ones. But, what extensions are so good, so brilliant, and so useful, they should be installed into each website you build with Joomla?

My Top 5 Must Have Joomla Extensions are:

#1 Akeeba Backup

Once you have made a website - losing it would not be fun. Having a recent backup means it is never lost for ever. All websites need to be backed up. Akeeba Backup is a great tool for this.

Akeeba backup is a fully automatic backup tool for Joomla. Akeeba backup makes a complete archive of your Joomla website. Akeeba backup can run as often as you need, both manually and automatically. Akeeba backup then can deposit the backup in to a separate storage drive - Dropbox is on the list.

Restoring a backup file is just as easy as running the Joomla installer using the Akeeba kick-start recovery script. Here is a bonus to note: you can use Akeeba backup to simply move a website from one server to the next - this option is so popular, it is built into the Akeeba Backup user interface.

I like Akeeba backup - it works. I have it making regular backups that are going to my choice of cloud storage. I have called on Akeeba backup on occasions without a problem.

You can find Akeeba backup via the Akeeba Backup website. Please note: I recommend the paid version. Some of the functions I have described may not be available to users of the free version.

#2 RSForm Pro

All websites need at least one form. The RSJoomla's RSForm Pro extension for Joomla enables making forms easy and even fun. RSForm Pro will help you setup forms and then mange those forms. RSForm Pro will help you with simple forms all the way through to complicated multi page forms. All types of forms are possible and made easy by RSJoomla's RSForm Pro extension for Joomla.

RSForm Pro has several plugins too. The plugins include: MailChimp integration; PayPal integration; and many more. If that is not enough, you can even map a form's field to another part of the database right from within the extension's user interface.

I like RSForm Pro. It's simple to use. Form submissions are easy to manage and exporting into other applications is not a problem.

Go get RSJoomla's RSForm pro today from their RSJoomla website.

#3 XMap

Once you have a website out there online, you want people to see it. You need it to be indexed by search engines. You need the pages to be found by search engines soon after you have added them. Most search engines accept an xml sitemap and will query it regularly to look for new content.

Vargas's XMap automatically produces your sitemaps. Once it is setup, you can leave it to it. Each time you add a page to your website, XMap will add the page to the sitemap for you. Once more, you can also have a copy of the sitemap in HTML format so that your human visitors can have a sitemap too.

I like Vargas's XMap because it's simple and lightweight. I like that other Joomla extension makers (particularly component extension makers), that are worth their salt, create XMap plugins so that content generated by their extension is mapped by XMap too.

You can find Vargas's XMap at the XMap website.

XMap Beautiful URL Tip

If you would like your sitemap to be found using www.yourdoman.com/sitemap.xml and not a long ugly string – paste this snippet into your HTACCESS file.

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/sitemap.xml
RewriteRule .* /index.php?option=com_xmap&view=xml

Note: you will need to adjust the query if you have more than one sitemap.

#4 GoogleAJAXLib

Everybody is using a CDN nowadays and why not? CDNs make your website load faster. The scripts get cached and are sent to the user from the closest data centre to them that the CDN is using.

ReSEO's GoogleAJAXLib for Joomla simply jumps in at the right point to swap the address of the Mootools JavaScript framework to the Google Ajax Lib CDN address. The GoogleAJAXLib extension will also do any of the frameworks that the Google Ajax Lib CDN will serve, this included jQuery. So if your template or other extensions are using a framework like jQuery, ReSEO's GoogleAJAXLib will swap the address for you.

As well as giving me access to the Google Ajax Lib CDN - I like ReSEO's GoogleAJAXLib extension because it has a simple lightweight implementation. The code works with the Joomla framework the way Joomla is supposed to be hooked into. In other words its implementation is not hacky at all.

You can find ReSEO's GoogleAJAXLib extension on their GoogleAJAXLib download page.

#5 Admin Tools

The Akeeba Admin Tools is the intelligent friend of Joomla. It makes Joomla run even faster, operate more securely, and looks out for Joomla to see if anything is amiss. Akeeba Admin Tools has a HTACCESS creation tool that will help you create a sweet .htaccess file suited to your needs. It has an active scanner that stops threats. The tool has a scanner that finds and identifies changes to files within your website's file system. The list of features is comprehensive.

I use Akeeba Admin Tools because they give me peace of mind. I also like that my websites are super-fast. Ok, Joomla is good at being fast and secure, I know, but we are talking super at and not just good at.

You can find Akeeba AdminTools via the Akeeba Admin Tools website.

Conclusion

After installing my top 5 Joomla extensions, you will start a new website that: backs itself up automatically and is easily recoverable. A website that can collect information from its visitors and send it to almost anywhere you like. Your new Joomla website will be easily indexable by search engines. The website will be super-fast and it will be super-secure.

What to look out for?

Look out for the age of this article! I have based this on the extensions I am using with Joomla 2.5 (The current production release). I have read on the Joomla JavaScript working group forum that there is a move to put the CDN functionality into the Joomla core.



Read

Do you need to know how to make CSS border gradients? This swift article will show you how to make a pseudo cross browser border gradient. CSS Border gradients are easy to make once you know how, and with the right tool. The border gradients in this article work across browsers without using images to fall back on.

Making the CSS Gradient

Let's start by making the CSS gradient. Surprisingly CSS gradients can be made to work across most of, if not all of, the browser you are normally developing for. The tricky part is each browser has its own implementation. However, there are great tools online to take the labour out of making gradients. So we will make life easier for ourselves and use one.

The CSS gradient tool I've found and like is the colorzilla gradient editor. The makers of the Colorzilla gradient editor tool provided a brilliant browser-based interface that comes with all the instructions you need for making the gradient.

Making the CSS Gradient a Border Gradient

In the solution below is the CSS gradient that was generated by the Colorzilla gradient editor tool. I've put the gradient CSS inside a class that is named 'border-gradient'.

Using this CSS we will make a border or at least a pseudo border (pseudo as in not real as opposed to a CSS pseudo-class). To do this just add padding and make sure the box doesn't collapse. You can stop the box from collapsing by using an in-line block or by floating the box with its overflow property set to hidden.

Then just put a box inside of the box and set the background to a solid colour. The box that is inside the box needs to be displayed as an in-line block. That is it - I said it was easy. Easy with thanks to the hard work that the online gradient editor tools of course, without them it would be tricky.

CSS Border Gradient Demo

See the border gradient example.

CSS Border Gradient Solution

.border-gradient{
	background: #58332b; /* Old browsers */
	/* IE9 SVG, needs conditional override of \'filter\' to \'none\' */
	background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzU4MzMyYiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNiZWYwZTQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
	background: -moz-linear-gradient(top,  #58332b 0%, #bef0e4 100%); /* FF3.6+ */
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#58332b), color-stop(100%,#bef0e4)); /* Chrome,Safari4+ */
	background: -webkit-linear-gradient(top,  #58332b 0%,#bef0e4 100%); /* Chrome10+,Safari5.1+ */
	background: -o-linear-gradient(top,  #58332b 0%,#bef0e4 100%); /* Opera 11.10+ */
	background: -ms-linear-gradient(top,  #58332b 0%,#bef0e4 100%); /* IE10+ */
	background: linear-gradient(to bottom,  #58332b 0%,#bef0e4 100%); /* W3C */
	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr=\'#58332b\', endColorstr=\'#bef0e4\',GradientType=0 ); /* IE6-8 */
	padding: 3px;
	display: inline;
	float: left;
	overflow: hidden;
}
.border-gradient .border-gradient-content{
	background-color: #FFFFFF;
	display: inline-block;
}

Conclusion

This solution gives the effect of a gradient border. People who view it will perceive a gradient border. Importantly, this solution works across all browsers, I have tested it in IE 7 through to IE 10, Opera, Safari, Firefox, and Chrome.



Read

Internet Explorer, before version nine, did not cope with media queries, however, there is no need to duplicate your CSS stylesheets. If you need a good tip on how best to deal with Internet Explorer when it comes to CSS media queries - in the context of maintenance - then this short article will help.

CSS - the Need for Good Maintenance

Most of us know that if we get the ground work right during the development stage of a project the maintenance will be noticeably easier - not just with CSS. In fact small changes that should take five minutes can take hours on a project that either rushed or skipped the groundwork stage.

The Problem

When the project includes the use of media queries as the mechanism for enabling responsive layouts - it can be tempting to duplicate everything minus the media queries for the older versions of Internet Explorer. That is fine but this approach forks the stylesheets. Once it is time to make changes to the styles, it becomes difficult to guarantee synchronisation across the fork.

The other issue is: you are sending out a duplication set of CSS rules to Internet Explorer. That makes for an extra volume of bandwidth being used that can and should be avoided.

The Solution

First, spilt the CSS styles into two files - this may seem counter intuitive as this does create an extra hit to the server but in the context of maintenance I believe it is worth it. With proper caching, the second hit only happens once.

Once split, name the staylsheets something like: reset-generic-queries.css and large.css. You may see where I am going with this!

In the first stylesheet put your CSS resets, followed by your generic CSS rules such as the projects typography, and then your media query groups.

Finally, without any media queries put your large screen style rules in the stylesheet named 'large'.

You should have two CSS files structured something like this:

/* resets */


/* typography */


/* elements */


/* helpers */


/* small screen */
@media all and (max-width: 480px){

}

/* medium screen */
@media all and (min-width: 480px) and (max-width: 940px) {

}

For the 'reset-generic-queries.css' file; and

/* large screen */

For the 'large.css' file.

Once you have your CSS across two stylesheets, in a similar manner you can establish zero duplication in your styles without difficulty. The magic, now, of zero duplication is in how you link the stylesheets to the main document.

<link media="all" type="text/css" rel="stylesheet" href="reset-generic-queries.css" />
<link media="all and (min-width: 940px)" type="text/css" rel="stylesheet" href=" large.css " />
<!--[if lt IE 9]>
	<link media="all" rel="stylesheet" type="text/css" href=" large.css" />
<![endif]-->

As you can see, the first stylesheet labled 'reset-generic-queries' is linked as normal. The second stylesheet uses an in-line media query so that it is used only by screens large enough, in combination with an 'IF IE' for Internet Explorer support.

Internet Explorer (older IE) will not see the embedded media queries in the first stylesheet but will see your resets CSS rules and your generic CSS rules as they are not wrapped in a query. Internet Explorer will not download the stylesheet linked with an in-line media query but will download the same stylesheet using its own 'IF IE' query - therefore Internet Explorer renders all of the CSS that is meant for a large screen.

All the other browsers (and new IE) will read your resets CSS rules, your generic CSS rules, and the rules most appropriate to the screen size currently displaying your responsive layouts.

Conclusion

When using CSS media queries, you can cut out the need for duplication in your CSS. There is no need to duplicate CSS just to make Internet Explore continue to work with your otherwise responsive layouts. All you need to do is be clever in how you organise your styles and link your styles to the main document. This short article has outlined an approach to do this so that zero duplication can be achieved with media queries and this will make your CSS more maintainable in the long term.

Video Supplement



Read

Tables have a habit of creeping into every other web development project. Finding a way to make them responsive has been a big issue and a hot topic this year. In this article a new way to make tables responsive has been explored and quite possibly a good solution has been found.

Let's Rule Out JavaScript in Making a Table Responsive

Why rule out JavaScript? JavaScript is a great wagon when it comes to progressive enhancements. The problem with JavaScript is it is not always available. If a table has been used in a project there is a good reason behind why it has been used. This is normally because the data is well suited to a table layout - or in other words it is tabular data.

You can choose to try and fix it with JavaScript, however, in this case you have to accept that some visitors will see a broken looking layout. As a Client-side Web Developer you are not doing your job properly if you accept this. Also, when you least expect it, someone will send your client a screen shot, and your client - quite rightly - will demand you fix it.

But First Let's Explore What a Table is

In order to begin to find a candidate solution, we need to understand the problem. We need to start by exploring briefly what the notion of a table is and what a table is used for. The simple answer, of course, is a table is a structure that semantically holds collections of comparable data; and we use tables to present data in such a way that information can be drawn.

This means that for a structure to act as a table it needs to support the concept of columns and of rows. Or otherwise no information can be reliably drawn from the data it holds. A HTML table fits this description perfectly after all it is what it was designed to do - its very name gives that away. The problem is HTML tables do not slim down on small screens. A row remains a row - full stop.

Now we have a good understanding of what the problem is, and while HTML tables fit the description, they do not fit the needs of a responsive layout. This is especially noticeable on mobile phone layouts as I am sure you are aware. This means if we can find an alternative HTML structure that can also fit the description of a table - to semantically holds collections of comparable data and present data in such a way that information can be drawn from it reliably, and fit the needs of a responsive layout then it is definitely worth looking for.

A Responsive Table from a Semantic Combination of HTML Elements

In any document headings (i.e. 'h*' elements) semantically indicate a section of a document. Therefore, an 'h*' element also makes a great contender as a row heading.

<h3>Row 1</h3>

By wrapping each row into an unordered list, we can begin to make a relationship between rows. You may ask what about the table's columns, and the column's headings? Definition lists, if structured well, make this possible - as shown below:

<ul class="responsive-table">
	<li class="first-row">
    	<h3>Row 1</h3>
        <dl>
            <dt>Heading 1</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 2</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 3</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 4</dt>
            <dd>data</dd>
        </dl>
	</li>
	<li>
    	<h3>Row 2</h3>
        <dl>
            <dt>Heading 1</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 2</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 3</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 4</dt>
            <dd>data</dd>
        </dl>
	</li>
	<li>
    	<h3>Row 3</h3>
        <dl>
            <dt>Heading 1</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 2</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 3</dt>
            <dd>data</dd>
        </dl>
        <dl>
            <dt>Heading 4</dt>
            <dd>data</dd>
        </dl>
	</li>
</ul>

As you can see, column headings are made constant for each item of each row. This thus creating continuity between each row and therefore, information can reliably be drawn from the data held in the semantic structure - fitting the description of a table. I believe that screen readers would also read this out in a way that makes the table's information attainable.

With a preconception of what a table looks like in a browser you may think that example 1 does not look very table like yet. However, I am sure you will agree information can be drawn from it in the same way that fits the discretion of a table.

At this point you can also see how it can easily take up less width to display - even without any styling.

Let's Style Our Responsive Table to Look Like a Table

Before we move on into the table, we need to fix up the containing unordered list and reset the margin, padding, line height and font-size of the 'ul', 'h*', 'dl', and the 'dd' elements. Once done, we need to make every definition list and h* elements sit next to each other both on the x-axes and on the y-axes. We can do this using the CSS's 'float: left' in combination with percentage widths. You can target each column width with classes if you like, as a proof of concept, I will keep this simple with a 20% width for row headings and 20% width for each column.

The trick to making it look like a normal table on a screen that is large enough to display a normal table is to use the first row's column headings. The conflict is, we do not wish to show any of the other row's headings in this layout. We will do this by making all 'dt' elements invisible except for the first row's 'dt' elements. Finally, the first row of the table needs the 'h*' element's padding at the top to be equivalent line height of the column headings: this gives the correct vertical alignment to the row's heading.

.responsive-table {
	width:100%;
}
.responsive-table ,
.responsive-table h3,
.responsive-table dl,
.responsive-table dd{
	margin:0;
	padding:0;
	font-size: 1em;
	line-height:1em;
}
.responsive-table li{
	list-style:none;
	display:block;
	clear:both;
}
.responsive-table h3,
.responsive-table dl{
	float:left;
	display:inline;
	width:20%;
}
.responsive-table .first-row h3{
	padding-top:1em;
}
.responsive-table dt{
	display:none;
	font-weight:bold;
}
.responsive-table .first-row dt{
	display:inline;
}

You will now see a table that also fits our preconception of what a table should look like in example 2.

Let's Style Our Responsive Table to Fit on Small Screens

For a small screen set the break point of your media query to the place that makes the most sense to the data inside of your table. For this demo I have chosen 600 pixels. For this layout all you need to do is set the 'td' and 'dl' elements to float.

Here is all of the CSS for each layout of the responsive table:

.responsive-table {
	width:100%;
}
.responsive-table ,
.responsive-table h3,
.responsive-table dl,
.responsive-table dd{
	margin:0;
	padding:0;
	font-size: 1em;
	line-height:1em;
}
.responsive-table li{
	list-style:none;
	display:block;
	clear:both;
	padding:5px 0 0; 
}
.responsive-table dt{
	font-weight:bold;
}
@media all and (max-width:600px){
	.responsive-table dt,
	.responsive-table dd{
		float:left;
		display:inline;
		padding-left:10px;
	}
}
@media all and (min-width:600px){
	.responsive-table h3,
	.responsive-table dl{
		float:left;
		display:inline;
		width:20%;
	}
	.responsive-table .first-row h3{
		padding-top:1em;
	}
	.responsive-table dt{
		display:none;
	}
	.responsive-table .first-row dt{
		display:inline;
	}
}

Please see example 3. To get the best idea of how this looks and works, resize IE9 and up or any other browser on a large screen.

A Tip Worth Noting

If you need to give the table heading a background colour, apply the colour to the unordered list and set the list items back to their intended colour.

Conclusion

With an open way of thinking about what a table is and how else we can construct a table with HTML this approach to a responsive table works. The CSS to present it is very light-weight and much more agile than its HTML table counterpart. What do you think?

Acknowledgements

This solution was co-developed by Neal Stammers and myself.



Read

This article is written to impart a short cut in getting to the content of an XML document from within a JavaScript script quickly and consistently across browsers. You will see that by skipping the XML document's DOM all together time and bytes are saved.

There is also a second good to the solution that is conveyed in this article. To the best of my knowledge earlier than ie9 versions of Internet Explore do not treat RSS feeds as XML. This means in an Ajax's XMLHttpRequest object there is no responseXML document to work with and that can be a gotcha. Of course you may be able to change the header for RSS documents server side. However let's assume you cannot get access to do so as this article is about dealing with XML responses generally.

Getting the Text from XML the Normal Way

When the XMLHttpRequest object of an Ajax call returns with a responseXML you have a document. A handsome document full of information but, getting hold of the information is not so easy. There are traversals to make you dizzy, elements to store, and then there are cross browser issues for getting hold of the text nodes themselves.

An XML Traversal Example:

var items = responseXML.getElementsByTagName('item');
var title[3] = items[3].getElementsByTagName("title")[0];
var desc[3] = items[3].getElementsByTagName("description")[0];

And in reality there will be a for-each loop or for loop in there somewhere. There will be variables storing elements – allsorts going on. It may not be the hardest thing to do but the JavaScript file is growing byte by byte and the cross browser issues are afoot.

The XML Text Node Cross Browser Issue

Some browsers get hold of the text node like this:

.textContent
Others browsers get hold of the text node like this:

.text

This means making a function that will return the content whichever way the browser likes to work is a likely root. In other words, more bytes are added to the JavaScript file just to deal with cross browser differences. It is at this point you realise you are not working smart and are going down the wrong root. But, there is the better solution.

Getting the Text from XML the Smart Way

While the DOM is normally a good thing in this case it only serves to get in the way. Introduce regular expressions to the mix and add a little responseText and your smart cake is well on its way to tasty.

You may ask: What about the lack of single line mode in JavaScript's regular expression? And I would say good question. The answer is 'no problem' and it is all thanks to:

[\s\S]

This means from the group, denoted by the square brackets, of white space characters and not white space characters. That's right anything and including new line characters.

The example below uses regular expression to collect all the items from an RSS feed into an array. Then it takes the index for getting a random item. It then templates the item as appropriate and finally appends the templated item into the DOM of the main HTML page.

new Request({
    'url': '/testimonials.rss',
    onSuccess: function(responseText){
        //split items into an array 
        var items = responseText.match(/<item>[\s\S]*?<\/item>/g);
	
        // pick an item at random 
        var rand = Math.floor(Math.random()*items.length);

        // template the data 
        var html = '';
        html += /<div class="feed-description">(.*)<\/div>/.exec(items[rand])[1];
        html += '<p class="title">' + /<title>(.*)<\/title>/.exec(items[rand])[1] + '</p>';
        html += '</div>';

        //then wrap and append it to something 
        var testimonial = new Element('div', {
           'class': 'testimonial'
        }).set('html', html);
        $$('.testimonials')[0].grab(testimonial, 'bottom');
    }
}).send();

You can of course template all the items of the feed or nodes of your document the first few items or whatever you need. Using the same method you can get hold of any part of the item or whatever your XML document is. For example:

html += '<a href="' + /<link>(.*)<\/link>/.exec(items[rand])[1] + '">Read more</a>';

will add a link back to the article source as given in the RSS feed.

Conclusion

As XML is often the transport medium given in response to many Ajax requests, it is important to have a good cross browser solution that doesn't necessarily weight down the scripts size. This method is a way of dealing with what has been returned across all browsers without the need of extra functions that only serve to make your solution work a cross browsers. I am finding this approach works very well and it is worth sharing. What do you think about this approach?



Read

Mailing List

Responsive Media

With the ResponsiveMedia plugin for Joomla it is easy to add 3rd party content from YouTube, Vimeo, and Instagram right in to any Joomla! article.

ResponsiveMedia