SlideShare a Scribd company logo
Developing a Joomla Component 
using RAD/FOF 
by Peter Martin 
www.db8.nl / @pe7er 
JJoooommllaaddaayy UUKK 22001144
2 
>>> Sheets available: www.db8.nl <<< 
>>> Component: https://github.com/pe7er/db8locate <<< 
JJoooommllaaddaayy UUKK 22001144 
Overview 
a)Introduction 
b)Rapid Application Development (RAD) / FOF 
c)Developing a Joomla component, back-end 
d)Developing a Joomla component, front-end
3 
a) Introduction: Web Application 
● From scratch 
– PHP/MySQL/HTML/CSS/JavaScript 
● Joomla component: Joomla = Framework 
– Database object 
– Layout Template 
– Access Control List (ACL) 
– MVC → template overrides 
– Plugins 
JJoooommllaaddaayy UUKK 22001144
4 
a) Functionality component back-end 
● Items - List 
– Display list of items 
– New / Edit an item 
– Delete item(s) 
– Publish/unpublish item(s) 
JJoooommllaaddaayy UUKK 22001144 
● Category - List 
– Display list of categories 
– New / Edit a category 
– Delete categories 
– Publish/unpublish categories 
● Category - Form 
– Display form of a category 
– Save a category 
● Item - Form 
– Display form of an item 
– Save an item
5 
a) Functionality component front-end 
● Items 
– Display list of items 
JJoooommllaaddaayy UUKK 22001144 
● Category 
– Display list of categories 
● Category 
– Display category details 
● Item 
– Display item details
6 
b) Rapid Application 
Development (RAD) 
JJoooommllaaddaayy UUKK 22001144
7 
b) Software Development Framework 
● Abstracting common code functionality 
● Conventions 
● Don’t Repeat Yourself (DRY) 
● Nooku Framework ('Koowa') – Johan Janssens 
– Joomlatools extensies (DOCman), Anahita 
● Framework on Framework – Nicholas 
Dionysopoulos 
– Basis of Akeeba Backup, Admin Tools etc 
JJoooommllaaddaayy UUKK 22001144
8 
Rapid Application Development (RAD) 
● RAD = Framework on Framework (since J 3.2) 
– Extension of Joomla! Platform 
– Backwards compatible 
– Less code → faster development & less bugs 
– Bootstrap 
– Jquery 
– JSON 
JJoooommllaaddaayy UUKK 22001144
9 
Rapid Application Development (RAD) 
● Convention over configuration -> 
FOF convention: 
● naming of functions 
● database field names 
-> automatic (“automagic”) functionality 
● How to use? 
– XML → “configure” component using FOF 
– PHP → more control over output 
– Anything different? → 
Override / extend FOF code like models, controllers 
JJoooommllaaddaayy UUKK 22001144
10 
RAD/ FOF/ F0F ? 
● FOF (F O F) 
– Akeeba etc 
● RAD – FOF implementation 
– In Joomla core since 3.2 
● F0F (F zero F) – Fork of FOF 
– Akeeba etc 
JJoooommllaaddaayy UUKK 22001144
11 
c) Joomla Component 
with FOF – back-end 
JJoooommllaaddaayy UUKK 22001144
12 
c) Joomla Component with FOF 
● Development Environment 
– Local web environment (LAMP/XAMP/MAMP) 
– phpMyAdmin 
– Joomla 3.3.x installation 
– Git (software version control) + github.com 
– IDE for PHP: 
● Netbeans / PHPStorm / Eclipse / ”weapon of choice” 
JJoooommllaaddaayy UUKK 22001144
13 
“db8 locate” component 
Manage & display locations on a Google Map 
– Name: “db8 Locate” 
– Component name: com_db8locate 
– Database tabel name: #__db8locate_items 
>>> Show example of back-end in browser 
JJoooommllaaddaayy UUKK 22001144
14 
1. basic component 
(back-end) 
JJoooommllaaddaayy UUKK 22001144
1.Entry point 
/administrator/components/com_db8locate/db8locate.php 
2.Dispatcher configuration 
/administrator/components/com_db8locate/fof.xml 
3.SQL definition of database table(s) 
/administrator/components/com_db8locate/sql/install/mysql/install.sql 
4.XML installation manifest 
/administrator/components/com_db8locate/db8locate.xml 
5.View: list 
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
6.View: form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
7.Language files 
/administrator/components/com_db8locate/language/en-GB/ 
en-GB.com_db8locate.sys.ini + en-GB.com_db8locate.ini 
15 
1. basic component (back-end) 
JJoooommllaaddaayy UUKK 22001144
16 
1.1 basic component – entry point 
/administrator/components/com_db8locate/db8locate.php 
<?php 
defined('_JEXEC') or die(); 
// Load FOF 
include_once JPATH_LIBRARIES.'/fof/include.php'; 
// Quit if FOF is not installed 
if(!defined('FOF_INCLUDED')) { 
JError::raiseError ('500', 'FOF is not installed'); 
} 
FOFDispatcher::getTmpInstance('com_db8locate')->dispatch(); 
JJoooommllaaddaayy UUKK 22001144
1.2 basic comp. – dispatcher config 
/administrator/components/com_db8locate/fof.xml 
17 
● <?xml version="1.0" encoding="UTF-8"?> 
● <fof> 
● <backend> 
● <dispatcher> 
● <option name="default_view">items</option> 
</dispatcher> 
● </backend> 
● </fof> 
JJoooommllaaddaayy UUKK 22001144
1.3 basic component – SQL definition 
– ID field contains component- & fieldname (singular) 
db8locate_item_id (in Joomla: “id”) 
18 
● Create SQL installation file: 
/administrator/components/com_db8locate/sql/install/mysql/install.sql 
install.sql contains: 
– CREATE TABLE, table name (plural): 
#__db8locate_items 
– PRIMARY KEY (`db8locate_item_id`) = ID field 
JJoooommllaaddaayy UUKK 22001144
1.3 basic component – SQL definition 
19 
/administrator/components/com_db8locate/sql/install/mysql/install.sql 
CREATE TABLE IF NOT EXISTS `#__db8locate_items` ( 
● `db8locate_item_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
● `title` varchar(255) NOT NULL, 
● PRIMARY KEY (`db8locate_item_id`) 
● ) DEFAULT CHARSET=utf8; 
JJoooommllaaddaayy UUKK 22001144
1.4 basic component – XML manifest 1/2 
20 
/administrator/components/com_db8locate/db8locate.xml 
<?xml version="1.0" encoding="utf-8"?> 
<extension version="3.2" type="component" method="upgrade"> 
<name>db8 locate</name> 
<author>Peter Martin</author> 
<creationDate>12 September 2014</creationDate> 
<copyright>Copyright (C) 2014 Peter Martin / db8.nl</copyright> 
<license>GNU General Public License version 2</license> 
<authorEmail>joomla@db8.nl</authorEmail> 
<version>1.0.1</version> 
<description>Component to manage and display locations on a Google Map</description> 
<!-- SQL query files to execute on installation --> 
<install> 
● <sql> 
● <file driver="mysql" charset="utf8">sql/install/mysql/install.sql</file> 
● <file driver="mysql">sql/install/mysql/install.sql</file> 
● 
● <file driver="mysqli" charset="utf8">sql/install/mysql/install.sql</file> 
● <file driver="mysqli">sql/install/mysql/install.sql</file> 
● </sql> 
● </install> 
JJoooommllaaddaayy UUKK 22001144
1.4 basic component – XML manifest 2/2 
21 
/administrator/components/com_db8locate/db8locate.xml 
<!-- Administrator back-end section --> 
<administration> 
<!-- Administration menu --> 
<menu view="cpanel">COM_DB8LOCATE</menu> 
<!-- Back-end files --> 
<files folder="backend"> 
<folder>sql</folder> 
<filename>db8locate.php</filename> 
<filename>fof.xml</filename> 
</files> 
</administration> 
</extension> 
JJoooommllaaddaayy UUKK 22001144
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
22 
1.5 basic component – view list 
<?xml version="1.0" encoding="UTF-8"?> 
● 
● <form type="browse" 
● show_header="1" 
● show_filters="1" 
● show_pagination="1" 
● norows_placeholder="COM_DB8LOCATE_COMMON_NORECORDS"> 
● 
● <headerset> 
● <header name="db8locate_item_id" type="rowselect" tdwidth="20" /> 
● <header name="title" type="fieldsearchable" sortable="true" 
JJoooommllaaddaayy UUKK 22001144 
buttons="yes" buttonclass="btn" /> 
● </headerset> 
● 
● <fieldset name="items"> 
● <field name="db8locate_item_id" show_id="true" type="selectrow"/> 
● <field name="title" type="text" show_link="true" url="index.php?option=com_db8locate 
&amp;view=item&amp;id=[ITEM:ID]" empty_replacement="(no title)" /> 
● </fieldset> 
● 
● </form>
23 
1.6 basic component – view form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
<?xml version="1.0" encoding="UTF-8"?> 
JJoooommllaaddaayy UUKK 22001144 
● 
● <form validate="true" serverside_validate="true"> 
● 
● <fieldset name="basic_configuration" 
● label="COM_DB8LOCATE_LOCATION_ITEM_EDIT" 
● 
description="COM_DB8LOCATE_LOCATION_ITEM_EDIT_BASIC_DESC" 
● class="span4"> 
● 
● <field name="title" type="text" 
● class="inputbox" 
● label="JGLOBAL_TITLE" 
● required="true" 
● Size="50" /> 
● </fieldset> 
● </form>
24 
1. basic component – installation 
Via Extensions > Extension Manager > 
Discover 
JJoooommllaaddaayy UUKK 22001144
25 
1. basic component (back-end) 
● List view 
JJoooommllaaddaayy UUKK 22001144
26 
1. basic component (back-end) 
● Form view 
JJoooommllaaddaayy UUKK 22001144
27 
1. basic component (back-end) 
● List view after couple of new & save 
JJoooommllaaddaayy UUKK 22001144
28 
2. language file 
JJoooommllaaddaayy UUKK 22001144
29 
JJoooommllaaddaayy UUKK 22001144 
2. language file 
sys.ini → For menu items etc. 
Put in /language/ map of db8locate component! 
/administrator/components/com_db8locate/ 
language/en-GB/en-GB.com_db8locate.sys.ini 
● 
COM_DB8LOCATE="db8 Locate" 
COM_DB8LOCATE_XML_DESCRIPTION="Component to 
manage and display locations on a Google Map"
30 
COM_DB8LOCATE="db8 Locate" 
COM_DB8LOCATE_TITLE_ITEMS="Location Items" 
COM_DB8LOCATE_COMMON_NORECORDS="No Location 
Items" 
COM_DB8LOCATE_TITLE_ITEMS_EDIT="Edit Location Items" 
COM_DB8LOCATE_LOCATION_ITEM_EDIT="Location Items" 
COM_DB8LOCATE_LBL_ITEM_SAVED="Location Item saved" 
COM_DB8LOCATE_CONFIRM_DELETE="Delete Location Item?" 
JJoooommllaaddaayy UUKK 22001144 
2. language file 
.ini → large file for all language lables com_db8locate 
/administrator/components/com_db8locate/ 
language/en-GB/en-GB.com_db8locate.ini 
TIP: “Debug Language” & collect all “lables to translate”
31 
JJoooommllaaddaayy UUKK 22001144 
2. language file
32 
3. switch on/off 
JJoooommllaaddaayy UUKK 22001144
33 
3. switch on/off – database field 
New field “enabled” to store publication status 
ALTER TABLE `#__db8locate_items` ADD `enabled` 
TINYINT( 3 ) NOT NULL DEFAULT '1'; 
JJoooommllaaddaayy UUKK 22001144
3. switch on/off – database field 
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
34 
Add to <headerset> 
JJoooommllaaddaayy UUKK 22001144 
● 
<header name="enabled" type="published" sortable="true" 
tdwidth="8%" /> 
● 
● Add to <fieldset name="items"> 
● <field name="enabled" type="published"/> 
●
35 
JJoooommllaaddaayy UUKK 22001144 
3. switch on/off
36 
3. switch on/off – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
JJoooommllaaddaayy UUKK 22001144 
● 
<field name="enabled" type="list" label="JSTATUS" 
● labelclass="todo-label" 
● class="inputbox" 
● filter="intval" size="1" default="1" > 
● <option value="1">JPUBLISHED</option> 
● <option value="0">JUNPUBLISHED</option> 
● </field> 
●
37 
3. switch on/off – form 
JJoooommllaaddaayy UUKK 22001144
38 
4. order 
JJoooommllaaddaayy UUKK 22001144
39 
4. order – database field 
New database field “ordering” 
ALTER TABLE `#__db8locate_items` ADD `ordering` INT( 11 
) NOT NULL DEFAULT '0'; 
JJoooommllaaddaayy UUKK 22001144
40 
JJoooommllaaddaayy UUKK 22001144 
4. order – list 
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
Add to <headerset> 
● 
<header name="ordering" type="ordering" 
sortable="true" tdwidth="10%" /> 
● 
● Add to <fieldset name="items"> 
● 
<field name="ordering" type="ordering" labelclass="order"/> 
● 
●
41 
JJoooommllaaddaayy UUKK 22001144 
4. order
42 
5. categories 
JJoooommllaaddaayy UUKK 22001144
43 
5. categories – database field 
Add new database field “catid” to store category_id 
ALTER TABLE `#__db8locate_items` ADD `catid` INT( 10 ) 
UNSIGNED NOT NULL DEFAULT '0'; 
JJoooommllaaddaayy UUKK 22001144
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
Note: xml has hardcoded SQL for MySQL → should be model instead 
44 
5. categories – list 
Add to <headerset> 
JJoooommllaaddaayy UUKK 22001144 
● 
<header name="category" type="category" 
sortable="true" tdwidth="10%" /> 
● 
● Add to <fieldset name="items"> 
<field name="catid" type="sql" translate="false" 
query="SELECT * FROM #__categories" 
key_field="id" value_field="title" /> 
●
45 
5. categories – list 
JJoooommllaaddaayy UUKK 22001144
46 
5. categories – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
JJoooommllaaddaayy UUKK 22001144 
● 
<field name="catid" type="category" 
● extension="com_db8locate" 
● class="inputbox" 
● label="JCATEGORY" 
● required="true" 
● size="1" /> 
●
47 
5. categories – form 
JJoooommllaaddaayy UUKK 22001144
48 
5. categories – toolbar 
/administrator/components/com_db8locate/toolbar.php 
● <?php 
defined('_JEXEC') or die(); 
class Db8locateToolbar extends FOFToolbar { 
public function Db8locateHelperRenderSubmenu($vName) { 
return $this->renderSubmenu($vName); 
} 
public function renderSubmenu($vName = null) { 
if (is_null($vName)) { 
$vName = $this->input->getCmd('view', 'cpanel'); 
} 
$this->input->set('view', $vName); 
parent::renderSubmenu(); 
$toolbar = FOFToolbar::getAnInstance($this->input->getCmd('option', 
'com_db8locate'), $this->config); 
$toolbar->appendLink(Jtext::_('COM_DB8LOCATE_SUBMENU_CATEGORIES'), 
'index.php?option=com_categories&extension=com_db8locate', $vName == 
'categories'); 
} 
JJoooommllaaddaayy UUKK 22001144 
}
49 
5. categories – toolbar 
JJoooommllaaddaayy UUKK 22001144
5. categories – toolbar in Category Manager 
50 
Create button in Category Manager to navigate back to “Items”: 
/administrator/components/com_db8locate/helpers/db8locate.php 
● <?php 
● defined('_JEXEC') or die(); 
● 
● /** 
● * Helper to display db8 locate component submenus in com_categories 
● */ 
● abstract class Db8locateHelper { 
● 
● public static function addSubmenu($submenu) { 
JsubMenuHelper::addEntry(JText::_( 
JJoooommllaaddaayy UUKK 22001144 
'COM_DB8LOCATE_TITLE_ITEMS'), 
'index.php?option=com_db8locate', $submenu == 'locations'); 
JsubMenuHelper::addEntry(JText::_( 
'COM_DB8LOCATE_SUBMENU_CATEGORIES'), 
'index.php?option=com_categories&view=categories 
&extension=com_db8locate', $submenu == 'categories'); 
● } 
● }
Warning: Invalid argument supplied for foreach() 
in /var/www/rad/libraries/cms/helper/content.php on 
line 121 
51 
5. categories – Category Manager 
Click on “Location Categories”, Result: 
JJoooommllaaddaayy UUKK 22001144
52 
6. access levels 
JJoooommllaaddaayy UUKK 22001144 
1. Access to application
53 
6. access levels application 1/2 
/administrator/components/com_db8locate/access.xml 
● <?xml version="1.0" encoding="utf-8"?> 
● <access component="com_db8locate"> 
● 
● <section name="component"> 
● <action name="core.admin" title="JACTION_ADMIN" 
JJoooommllaaddaayy UUKK 22001144 
description="JACTION_ADMIN_COMPONENT_DESC" /> 
<action name="core.manage" title="JACTION_MANAGE" 
description="JACTION_MANAGE_COMPONENT_DESC" /> 
● <action name="core.create" title="JACTION_CREATE" 
description="JACTION_CREATE_COMPONENT_DESC" /> 
● <action name="core.delete" title="JACTION_DELETE" 
description="JACTION_DELETE_COMPONENT_DESC" /> 
● <action name="core.edit" title="JACTION_EDIT" 
description="JACTION_EDIT_COMPONENT_DESC" /> 
● <action name="core.edit.state" title="JACTION_EDITSTATE" 
description="JACTION_EDITSTATE_COMPONENT_DESC" /> 
● </section>
54 
6. access levels application 2/2 
/administrator/components/com_db8locate/access.xml 
● <section name="category"> 
● <action name="core.manage" title="JACTION_MANAGE" 
description="JACTION_MANAGE_COMPONENT_DESC" /> 
● <action name="core.create" title="JACTION_CREATE" 
description="COM_CATEGORIES_ACCESS_CREATE_DESC" /> 
● <action name="core.delete" title="JACTION_DELETE" 
description="COM_CATEGORIES_ACCESS_DELETE_DESC" /> 
● <action name="core.edit" title="JACTION_EDIT" 
description="COM_CATEGORIES_ACCESS_EDIT_DESC" /> 
● <action name="core.edit.state" title="JACTION_EDITSTATE" 
description="COM_CATEGORIES_ 
JJoooommllaaddaayy UUKK 22001144 
ACCESS_EDITSTATE_DESC" /> 
● </section> 
● 
● </access>
55 
6. access levels 
JJoooommllaaddaayy UUKK 22001144 
2. (Front-end) access to 
database items
56 
6. access levels – list 
JJoooommllaaddaayy UUKK 22001144
57 
7. parameters 
JJoooommllaaddaayy UUKK 22001144
58 
JJoooommllaaddaayy UUKK 22001144 
7. parameters 
/administrator/components/com_db8locate/config.xml 
via Components > db8 locate > categories > [options] 
● <?xml version="1.0" encoding="UTF-8"?> 
● <config> 
● 
● <fieldset name="permissions" 
● label="JCONFIG_PERMISSIONS_LABEL" 
● description="JCONFIG_PERMISSIONS_DESC" > 
● 
● <field name="rules" 
● type="rules" 
● label="JCONFIG_PERMISSIONS_LABEL" 
● class="inputbox" 
● filter="rules" 
● component="com_db8locate" 
● section="component" /> 
● 
● </fieldset> 
● 
● </config>
59 
8. multilingual 
JJoooommllaaddaayy UUKK 22001144
60 
8. multilingual – database field 
Add new field “language” to store language code 
ALTER TABLE `#__db8locate_items` ADD `language` 
CHAR( 7 ) NOT NULL DEFAULT '*'; 
JJoooommllaaddaayy UUKK 22001144
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
61 
8. multilingual – list 
Add to <headerset> 
JJoooommllaaddaayy UUKK 22001144 
● 
<header name="language" type="language" 
sortable="true" tdwidth="10%" /> 
● 
● 
● Add to <fieldset name="items"> 
<field name="language" type="text" tdwidth="10%" /> 
●
62 
8. multilingual – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
JJoooommllaaddaayy UUKK 22001144 
● 
<field name="language" type="contentlanguage" 
label="JFIELD_LANGUAGE_LABEL" > 
● <option value="*">JALL</option> 
● </field> 
● 
●
63 
8. multilingual – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
JJoooommllaaddaayy UUKK 22001144 
● 
<field name="language" type="contentlanguage" 
label="JFIELD_LANGUAGE_LABEL" > 
● <option value="*">JALL</option> 
● </field> 
● 
●
64 
8. multilingual – list 
JJoooommllaaddaayy UUKK 22001144
65 
9. “magic fields” 
JJoooommllaaddaayy UUKK 22001144
66 
JJoooommllaaddaayy UUKK 22001144 
9. “magic fields” 
● Present in component: 
enabled (“state”), ordering, 
● Also add to database table: 
created_by, created_on(“created”), 
modified_by, modified_on(“modified”), 
locked_by(“checked_out”), 
locked_on(“checked_out_time”), hits 
● In list view: created_by & created_on 
● In form view: all fields
67 
10. tags 
JJoooommllaaddaayy UUKK 22001144
68 
JJoooommllaaddaayy UUKK 22001144 
10. tags 
#__tags tabel stores tags: 
id title 
4 Joomla 
5 Linux 
#__contentitem_tag_map links content items 
and tags: 
type_alias core_content_id content_item_id tag_id type_id 
com_content.article 1 1 2 1 
com_content.article 1 1 3 1 
com_content.article 3 2 4 1 
com_content.article 3 2 5 1 
com_weblinks.weblink 2 1 4 2 
com_weblinks.weblink 2 1 5 2
69 
JJoooommllaaddaayy UUKK 22001144 
10. tags – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
● 
<field name="tags" 
type="tag" 
label="JTAG" 
description="JTAG_DESC" 
class="inputbox span12" 
multiple="true" > 
</field>
70 
JJoooommllaaddaayy UUKK 22001144 
10. tags 
Unfortunately ... not working... bug in Joomla to versie 3.2.3: 
Use of com_tags only possible if JTable is used in component.
71 
11. my own fields... 
JJoooommllaaddaayy UUKK 22001144
72 
11. db8locate – database field 
Add your own fields to database 
ALTER TABLE `jos_db8locate_items` 
● ADD `location` VARCHAR( 60 ) NOT NULL , 
● ADD `address` VARCHAR( 50 ) NOT NULL , 
● ADD `postcode` VARCHAR( 12 ) NOT NULL , 
● ADD `city` VARCHAR( 50 ) NOT NULL , 
● ADD `region` VARCHAR( 50 ) NOT NULL , 
● ADD `country` VARCHAR( 50 ) NOT NULL , 
● ADD `latitude` VARCHAR( 10 ) NOT NULL , 
● ADD `longitude` VARCHAR( 10 ) NOT NULL , 
● ADD `website` VARCHAR( 100 ) NOT NULL 
JJoooommllaaddaayy UUKK 22001144
73 
11. db8locate – list 
JJoooommllaaddaayy UUKK 22001144
74 
11. db8locate – further improvements 
● Update your SQL installation script: 
/administrator/components/com_db8locate/sql/install/mysql/install.sql 
● If "required fields" are not completed, 
then "save" results in emptying the fields... 
/administrator/components/com_db8locate/models/items.php 
● 
class Db8directoryModelItems extends F0Fmodel { 
● protected $_savestate = 1; 
● protected function loadFormData() { 
● Jfactory::getApplication()-> 
● setUserState('com_db8locate.add.item.data', ''); 
● 
JJoooommllaaddaayy UUKK 22001144 
● 
● if (empty($this->_formData)) { 
● return array(); 
● } else { 
● return $this->_formData; 
● } 
● } 
● }
75 
11. db8locate – further improvements 
● Edit form too long → divide into columns 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
● 
<fieldset name="basic_configuration" 
label="COM_DB8LOCATE_ITEM_LOCATION" class="span4"> fields in column 1 
</fieldset> 
● 
● <fieldset name="address" label="COM_DB8LOCATE_ITEM_ADDRESS" 
class="span4"> fields in column 2 </fieldset> 
JJoooommllaaddaayy UUKK 22001144
76 
11. db8locate – further improvements 
● Lookup Coordinates of each Address at Google Maps API 
– Add lookup code for Google Map API in Model 
– Add button in Toolbar 
– Add handling in Controller 
JJoooommllaaddaayy UUKK 22001144
77 
d) Joomla Component 
with FOF – front-end 
JJoooommllaaddaayy UUKK 22001144
78 
12. basic component (front-end) 
1.Entry point 
/components/com_db8locate/db8locate.php 
2.View: list 
/components/com_db8locate/views/items/tmpl/form.default.xml 
/components/com_db8locate/views/items/metadata.xml –> for menu 
3.View: single item 
/components/com_db8locate/views/item/tmpl/form.item.xml 
/components/com_db8locate/views/item/metadata.xml –> for menu 
4.Language files 
/components/com_db8locate/language/en-GB/en-GB.com_db8locate.ini 
JJoooommllaaddaayy UUKK 22001144
79 
12.1 front-end – entry point 
/administrator/components/com_db8locate/db8locate.php 
<?php 
defined('_JEXEC') or die(); 
// Load FOF 
include_once JPATH_LIBRARIES.'/fof/include.php'; 
// Quit if FOF is not installed 
if(!defined('FOF_INCLUDED')) { 
JError::raiseError ('500', 'FOF is not installed'); 
} 
FOFDispatcher::getTmpInstance('com_db8locate')->dispatch() 
; 
JJoooommllaaddaayy UUKK 22001144
80 
12.2 front-end – view list 
/components/com_db8locate/views/items/tmpl/form.default.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<form 
type="browse" 
show_header="1" 
show_filters="0" 
show_pagination="1" 
show_enabled="1" 
norows_placeholder="COM_DB8LOCATE_COMMON_NORECORDS" > 
<headerset> 
<header name="title" type="fieldsearchable" sortable="true"buttons="true" /> 
<header name="city" type="fieldsearchable" sortable="true"buttons="false" /> 
<header name="region" sortable="true"buttons="false" /> 
<header name="country" sortable="true"buttons="false" tdwidth="20%" /> 
<header name="category" sortable="false"buttons="false" /> 
</headerset> 
<fieldset name="items"> 
<field name="title" type="text" show_link="true" 
url="index.php?option=com_db8locate&amp;view=item&amp;id=[ITEM:ID]" 
class="todoitem" empty_replacement="(no title)" /> 
<field name="city" type="text" /> 
<field name="region" type="text" /> 
<field name="country" type="text" /> 
<field name="catid" type="sql" translate="false" query="SELECT * FROM #__categories" 
key_field="id" value_field="title"/> 
</fieldset> 
</form> 
JJoooommllaaddaayy UUKK 22001144
81 
12.2 front-end – view list 
JJoooommllaaddaayy UUKK 22001144
82 
12.3 front-end – view details 
/components/com_db8locate/views/item/tmpl/form.item.xml 
<?xml version="1.0" encoding="utf-8"?> 
● <form 
● type="read"> 
● 
● <fieldset name="a_single_item" class="item-container form-horizontal"> 
● <field name="title" type="text" 
● label="COM_DB8LOCATE_TITLE" 
● class="db8locate-title-field" 
● size="50"/> 
● 
● <field name="city" type="text" 
● label="COM_DB8LOCATE_CITY" 
● labelclass="db8locate-field" 
● size="20" /> 
● 
● <field name="website" type="text" 
● label="COM_DB8LOCATE_WEBSITE" 
● labelclass="db8locate-field" 
● size="40" /> 
● 
● </fieldset> 
● </form> 
JJoooommllaaddaayy UUKK 22001144
83 
12.3 front-end – view details 
JJoooommllaaddaayy UUKK 22001144
84 
12.4 language files 
/components/com_db8locate/language/en-GB/en-GB.com_db8locate.ini 
TIP: “Debug Language” & collect all “lables to translate” 
JJoooommllaaddaayy UUKK 22001144
85 
13. more views 
JJoooommllaaddaayy UUKK 22001144
86 
<?php 
$viewTemplate = $this->getRenderedForm(); 
echo $viewTemplate; 
?> 
JJoooommllaaddaayy UUKK 22001144 
13. more views 
Combine XML & PHP 
/components/com_db8locate/views/items/tmpl/default.php 
and load form.default.xml 
E.g. mix with Google Maps
87 
13. more views – mixed php & xml 
JJoooommllaaddaayy UUKK 22001144
88 
JJoooommllaaddaayy UUKK 22001144 
13. more views 
Extra (built-in) output options: 
&format=csv 
administrator/index.php?option=com_db8locate&format=csv 
&format=json 
administrator/index.php?option=com_db8locate&format=json
89 
d) tools 
JJoooommllaaddaayy UUKK 22001144
90 
JJoooommllaaddaayy UUKK 22001144 
Errors 
● IMHO Harder to detect than "regular" Joomla 
component! 
● Cache!! 
● Debug 
– E.g. back-end error: 
“An error has occurred. 1064 You have an error in your SQL syntax; check the manual that corresponds to 
your MySQL server version for the right syntax to use near 'ORDER BY node.lft' at line 4 SQL=SELECT 
node.id FROM jos_categories AS node, jos_categories AS parent WHERE node.lft BETWEEN parent.lft AND 
parent.rgt AND parent.id = ORDER BY node.lft” 
can be caused by error in the front-end! 
Test: rename front-end com_db8locate temporary 
– Front-end error: 
Notice: Undefined variable: form_class in /var/www/rad/libraries/fof/render/strapper.php on line 676 
Test: rebuilt .xml files step-by-step 
– print_r($object) / echo $query / die(“stop here!”)
91 
JJoooommllaaddaayy UUKK 22001144 
Sources 
● Documentation 
https://www.akeebabackup.com/documentation/fof.html 
● FOF Mailinglist: 
https://groups.google.com/forum/#!forum/frameworkonframework 
● Source code Github: 
https://github.com/akeeba/fof 
● Examples: 
https://github.com/akeeba/todo-fof-example/ 
https://github.com/akeeba/contactus 
Akeeba Backup, Akeeba Ticket System 
https://github.com/tuum/com_timesheet
JJoooommllaaddaayy UUKK 22001144
93 
JJoooommllaaddaayy UUKK 22001144 
Contact 
Presentation available at: 
http://www.db8.nl 
Component db8locate available at: 
https://github.com/pe7er/db8locate 
Peter Martin 
e-mail: info at db8.nl 
website: www.db8.nl 
twitter: @pe7er 
Review this presentation: 
https://joind.in/talk/view/11625
94 
JJoooommllaaddaayy UUKK 22001144 
Used Photos 1/2 
● Speed Typing - Matthew Bowden http://www.sxc.hu/photo/275499 
● Speedometer – Abdulhamid AlFadhly http://www.sxc.hu/photo/1390189 
● LONDON SKYLINE CLIP ART 
http://www.clker.com/clipart-london-skyline-19.html 
● Forjados 1 - Albert Lazcano http://www.sxc.hu/photo/626785 
● Bengali Keyborad - Mohammad Jobaed Adnan 
http://www.sxc.hu/photo/676844 
● Old Light Switches - Paul Cross http://www.sxc.hu/photo/1259922 
● madera en pila 1 - jean froidevaux http://www.sxc.hu/photo/313864 
● Books books books... - Brandon Blinkenberg 
http://www.sxc.hu/photo/424027 
● Sign 3: forbidden access - Davide Guglielmo 
http://www.sxc.hu/photo/200982
95 
JJoooommllaaddaayy UUKK 22001144 
Used Photos 2/2 
● Communications Receiver - John Munsch http://www.sxc.hu/photo/260775 
● Flags of the Baltic Sea countries - Johannes Raitio 
http://www.sxc.hu/photo/471547 
● Lock - Robert Linder http://www.sxc.hu/photo/1395379 
● Basho Collage 5 - Billy Alexander http://www.sxc.hu/photo/1330749 
● Earth: Night Edition - Europe - Sigurd Decroos 
http://www.sxc.hu/photo/140879 
● Retro/Vintage TV set - "meltingdog" http://www.sxc.hu/photo/1440150 
● san sebastian views 1 - ibon san martin http://www.sxc.hu/photo/94018 
● Tools - J Boontje http://www.sxc.hu/photo/805571 
● The End Book, EWikist, 2010 
http://commons.wikimedia.org/wiki/File:The_End_Book.png

More Related Content

PDF
Developing a Joomla 3.x Component using RAD FOF- Part 1: Back-end - Joomladay...
PDF
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
PPTX
Rapid application development using Akeeba FOF and Joomla 3.2
PDF
How to create a joomla component from scratch
PPT
Rapid application development with FOF
PPTX
Introduction to building joomla! components using FOF
ODP
Developing new feature in Joomla - Joomladay UK 2016
PDF
Using Drupal Features in B-Translator
Developing a Joomla 3.x Component using RAD FOF- Part 1: Back-end - Joomladay...
Developing a Joomla 3.x Component using RAD FOF- Part 2: Front-end + demo - J...
Rapid application development using Akeeba FOF and Joomla 3.2
How to create a joomla component from scratch
Rapid application development with FOF
Introduction to building joomla! components using FOF
Developing new feature in Joomla - Joomladay UK 2016
Using Drupal Features in B-Translator

What's hot (20)

ODP
JUG Utrecht 2013 - Have you tried turning it off and on again? Problemen oplo...
PDF
Development Setup of B-Translator
PDF
Troubleshooting Joomla! problems - Joomladay Germany 2014
PDF
Php 7 evolution
PDF
OpenCms Days 2015 Advanced Solr Searching
PPT
Joomla english for the work group
PPT
Joomlapresentation
PPT
JoomlaEXPO Presentation by Joe LeBlanc
ODP
Custom module and theme development in Drupal7
PDF
Fluid powered TYPO3
ODP
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...
PPT
Pluggin creation
PDF
TYPO3 CKEditor for integrators
KEY
Overlays, Accordions & Tabs, Oh My
PDF
The Anatomy of TYPO3 Sitepackages
PDF
Joomla 1.5 modules - Joomla!Days NL 2009 #jd09nl
PPTX
New EEA Plone Add-ons
PDF
13th Sep, Drupal 7 advanced training by TCS
PDF
Best practices for joomla extensions developers
PDF
Building Pluggable Web Applications using Django
JUG Utrecht 2013 - Have you tried turning it off and on again? Problemen oplo...
Development Setup of B-Translator
Troubleshooting Joomla! problems - Joomladay Germany 2014
Php 7 evolution
OpenCms Days 2015 Advanced Solr Searching
Joomla english for the work group
Joomlapresentation
JoomlaEXPO Presentation by Joe LeBlanc
Custom module and theme development in Drupal7
Fluid powered TYPO3
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...
Pluggin creation
TYPO3 CKEditor for integrators
Overlays, Accordions & Tabs, Oh My
The Anatomy of TYPO3 Sitepackages
Joomla 1.5 modules - Joomla!Days NL 2009 #jd09nl
New EEA Plone Add-ons
13th Sep, Drupal 7 advanced training by TCS
Best practices for joomla extensions developers
Building Pluggable Web Applications using Django
Ad

Similar to Developing a Joomla 3.x Component using RAD/FOF - Joomladay UK 2014 (20)

ODP
Joomla 3 Component programmeren met RAD - Joomladagen 2014
PPT
R12 d49656 gc10-apps dba 06
PPTX
Java Unit Testing with Unitils
PDF
Modern frontend development with VueJs
PDF
Drupal 8 what to wait from
PPTX
Rapid application development using Akeeba FOF and Joomla 3.2
PPTX
CISOA Conference 2020 Banner 9 Development
PDF
.NET @ apache.org
PPTX
Getting started with drupal 8 code
PDF
Php 5.6 From the Inside Out
ODP
Asian Spirit 3 Day Dba On Ubl
PPTX
Dolibarr - What's new in 18.0 - DevCamp Bordeaux 2023.pptx
PPT
Mageguru - magento custom module development
PDF
OpenCms Days 2015 Workflow using Docker and Jenkins
PDF
Odoo Experience 2018 - The Odoo JS Framework
PPTX
MySQL Audit using Percona audit plugin and ELK
PPTX
OA Framwork Presentation.pptx
PDF
September SDG - Lightning
PDF
TYPO3 6.1. What's new
PDF
Frontend JS workflow - Gulp 4 and the like
Joomla 3 Component programmeren met RAD - Joomladagen 2014
R12 d49656 gc10-apps dba 06
Java Unit Testing with Unitils
Modern frontend development with VueJs
Drupal 8 what to wait from
Rapid application development using Akeeba FOF and Joomla 3.2
CISOA Conference 2020 Banner 9 Development
.NET @ apache.org
Getting started with drupal 8 code
Php 5.6 From the Inside Out
Asian Spirit 3 Day Dba On Ubl
Dolibarr - What's new in 18.0 - DevCamp Bordeaux 2023.pptx
Mageguru - magento custom module development
OpenCms Days 2015 Workflow using Docker and Jenkins
Odoo Experience 2018 - The Odoo JS Framework
MySQL Audit using Percona audit plugin and ELK
OA Framwork Presentation.pptx
September SDG - Lightning
TYPO3 6.1. What's new
Frontend JS workflow - Gulp 4 and the like
Ad

More from Peter Martin (20)

ODP
JCE editor optimaliseren (Joomla Den Bosc­h 2016)
ODP
Internet of Things - Linux Usergroup Nijmegen
PDF
Joomla: 10 years of progress (jd15fr)
ODP
Joomla 10-jaar-vooruitgang-jdnl15
ODP
Linux command-line-magic-jdnl15
PDF
GNU Radio & digitaal vliegtuig spotten
PDF
Help mijn website is gehackt - Joomla User Group Den Bosch 2014
PDF
Music Trackers - Linux Usergroup Nijmegen 2014
PDF
linux-commandline-magic-Joomla-World-Conference-2014
PDF
How IT works - Joomladay UK 2014
PDF
Joomla multilingual website without 3rd party extensions - Joomladay UK 2014
PDF
How IT works - Joomladay Germany 2014
ODP
Linux Nijmegen - Webserver (LAMP stack) opzetten met VirtualbBox & Vagrant
ODP
Problemen oplossen in Joomla - Joomladagen 2014
ODP
Joomla Bugs, Patches & Fun - Joomladagen 2014
ODP
Basis Linux (aan de hand van LPIC-1)
ODP
JUG Utrecht 2013 - Optimaliseren van Joomla Content Editor (JCE) voor admins
ODP
Joomla on Raspberry Pi using Nginx - Nederlandse Linux Gebruikers Group novem...
ODP
Configuring Joomla JCE editor from usability point of view
ODP
Joomla Community
JCE editor optimaliseren (Joomla Den Bosc­h 2016)
Internet of Things - Linux Usergroup Nijmegen
Joomla: 10 years of progress (jd15fr)
Joomla 10-jaar-vooruitgang-jdnl15
Linux command-line-magic-jdnl15
GNU Radio & digitaal vliegtuig spotten
Help mijn website is gehackt - Joomla User Group Den Bosch 2014
Music Trackers - Linux Usergroup Nijmegen 2014
linux-commandline-magic-Joomla-World-Conference-2014
How IT works - Joomladay UK 2014
Joomla multilingual website without 3rd party extensions - Joomladay UK 2014
How IT works - Joomladay Germany 2014
Linux Nijmegen - Webserver (LAMP stack) opzetten met VirtualbBox & Vagrant
Problemen oplossen in Joomla - Joomladagen 2014
Joomla Bugs, Patches & Fun - Joomladagen 2014
Basis Linux (aan de hand van LPIC-1)
JUG Utrecht 2013 - Optimaliseren van Joomla Content Editor (JCE) voor admins
Joomla on Raspberry Pi using Nginx - Nederlandse Linux Gebruikers Group novem...
Configuring Joomla JCE editor from usability point of view
Joomla Community

Recently uploaded (20)

PDF
Web App vs Mobile App What Should You Build First.pdf
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
PDF
1 - Historical Antecedents, Social Consideration.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Approach and Philosophy of On baking technology
PDF
A novel scalable deep ensemble learning framework for big data classification...
PDF
August Patch Tuesday
PPTX
Chapter 5: Probability Theory and Statistics
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
PDF
DP Operators-handbook-extract for the Mautical Institute
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
project resource management chapter-09.pdf
PDF
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
PDF
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
PPTX
TLE Review Electricity (Electricity).pptx
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
Web App vs Mobile App What Should You Build First.pdf
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
1 - Historical Antecedents, Social Consideration.pdf
Programs and apps: productivity, graphics, security and other tools
NewMind AI Weekly Chronicles - August'25-Week II
Approach and Philosophy of On baking technology
A novel scalable deep ensemble learning framework for big data classification...
August Patch Tuesday
Chapter 5: Probability Theory and Statistics
Heart disease approach using modified random forest and particle swarm optimi...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
DP Operators-handbook-extract for the Mautical Institute
gpt5_lecture_notes_comprehensive_20250812015547.pdf
project resource management chapter-09.pdf
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
TLE Review Electricity (Electricity).pptx
SOPHOS-XG Firewall Administrator PPT.pptx

Developing a Joomla 3.x Component using RAD/FOF - Joomladay UK 2014

  • 1. Developing a Joomla Component using RAD/FOF by Peter Martin www.db8.nl / @pe7er JJoooommllaaddaayy UUKK 22001144
  • 2. 2 >>> Sheets available: www.db8.nl <<< >>> Component: https://github.com/pe7er/db8locate <<< JJoooommllaaddaayy UUKK 22001144 Overview a)Introduction b)Rapid Application Development (RAD) / FOF c)Developing a Joomla component, back-end d)Developing a Joomla component, front-end
  • 3. 3 a) Introduction: Web Application ● From scratch – PHP/MySQL/HTML/CSS/JavaScript ● Joomla component: Joomla = Framework – Database object – Layout Template – Access Control List (ACL) – MVC → template overrides – Plugins JJoooommllaaddaayy UUKK 22001144
  • 4. 4 a) Functionality component back-end ● Items - List – Display list of items – New / Edit an item – Delete item(s) – Publish/unpublish item(s) JJoooommllaaddaayy UUKK 22001144 ● Category - List – Display list of categories – New / Edit a category – Delete categories – Publish/unpublish categories ● Category - Form – Display form of a category – Save a category ● Item - Form – Display form of an item – Save an item
  • 5. 5 a) Functionality component front-end ● Items – Display list of items JJoooommllaaddaayy UUKK 22001144 ● Category – Display list of categories ● Category – Display category details ● Item – Display item details
  • 6. 6 b) Rapid Application Development (RAD) JJoooommllaaddaayy UUKK 22001144
  • 7. 7 b) Software Development Framework ● Abstracting common code functionality ● Conventions ● Don’t Repeat Yourself (DRY) ● Nooku Framework ('Koowa') – Johan Janssens – Joomlatools extensies (DOCman), Anahita ● Framework on Framework – Nicholas Dionysopoulos – Basis of Akeeba Backup, Admin Tools etc JJoooommllaaddaayy UUKK 22001144
  • 8. 8 Rapid Application Development (RAD) ● RAD = Framework on Framework (since J 3.2) – Extension of Joomla! Platform – Backwards compatible – Less code → faster development & less bugs – Bootstrap – Jquery – JSON JJoooommllaaddaayy UUKK 22001144
  • 9. 9 Rapid Application Development (RAD) ● Convention over configuration -> FOF convention: ● naming of functions ● database field names -> automatic (“automagic”) functionality ● How to use? – XML → “configure” component using FOF – PHP → more control over output – Anything different? → Override / extend FOF code like models, controllers JJoooommllaaddaayy UUKK 22001144
  • 10. 10 RAD/ FOF/ F0F ? ● FOF (F O F) – Akeeba etc ● RAD – FOF implementation – In Joomla core since 3.2 ● F0F (F zero F) – Fork of FOF – Akeeba etc JJoooommllaaddaayy UUKK 22001144
  • 11. 11 c) Joomla Component with FOF – back-end JJoooommllaaddaayy UUKK 22001144
  • 12. 12 c) Joomla Component with FOF ● Development Environment – Local web environment (LAMP/XAMP/MAMP) – phpMyAdmin – Joomla 3.3.x installation – Git (software version control) + github.com – IDE for PHP: ● Netbeans / PHPStorm / Eclipse / ”weapon of choice” JJoooommllaaddaayy UUKK 22001144
  • 13. 13 “db8 locate” component Manage & display locations on a Google Map – Name: “db8 Locate” – Component name: com_db8locate – Database tabel name: #__db8locate_items >>> Show example of back-end in browser JJoooommllaaddaayy UUKK 22001144
  • 14. 14 1. basic component (back-end) JJoooommllaaddaayy UUKK 22001144
  • 15. 1.Entry point /administrator/components/com_db8locate/db8locate.php 2.Dispatcher configuration /administrator/components/com_db8locate/fof.xml 3.SQL definition of database table(s) /administrator/components/com_db8locate/sql/install/mysql/install.sql 4.XML installation manifest /administrator/components/com_db8locate/db8locate.xml 5.View: list /administrator/components/com_db8locate/views/items/tmpl/form.default.xml 6.View: form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml 7.Language files /administrator/components/com_db8locate/language/en-GB/ en-GB.com_db8locate.sys.ini + en-GB.com_db8locate.ini 15 1. basic component (back-end) JJoooommllaaddaayy UUKK 22001144
  • 16. 16 1.1 basic component – entry point /administrator/components/com_db8locate/db8locate.php <?php defined('_JEXEC') or die(); // Load FOF include_once JPATH_LIBRARIES.'/fof/include.php'; // Quit if FOF is not installed if(!defined('FOF_INCLUDED')) { JError::raiseError ('500', 'FOF is not installed'); } FOFDispatcher::getTmpInstance('com_db8locate')->dispatch(); JJoooommllaaddaayy UUKK 22001144
  • 17. 1.2 basic comp. – dispatcher config /administrator/components/com_db8locate/fof.xml 17 ● <?xml version="1.0" encoding="UTF-8"?> ● <fof> ● <backend> ● <dispatcher> ● <option name="default_view">items</option> </dispatcher> ● </backend> ● </fof> JJoooommllaaddaayy UUKK 22001144
  • 18. 1.3 basic component – SQL definition – ID field contains component- & fieldname (singular) db8locate_item_id (in Joomla: “id”) 18 ● Create SQL installation file: /administrator/components/com_db8locate/sql/install/mysql/install.sql install.sql contains: – CREATE TABLE, table name (plural): #__db8locate_items – PRIMARY KEY (`db8locate_item_id`) = ID field JJoooommllaaddaayy UUKK 22001144
  • 19. 1.3 basic component – SQL definition 19 /administrator/components/com_db8locate/sql/install/mysql/install.sql CREATE TABLE IF NOT EXISTS `#__db8locate_items` ( ● `db8locate_item_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, ● `title` varchar(255) NOT NULL, ● PRIMARY KEY (`db8locate_item_id`) ● ) DEFAULT CHARSET=utf8; JJoooommllaaddaayy UUKK 22001144
  • 20. 1.4 basic component – XML manifest 1/2 20 /administrator/components/com_db8locate/db8locate.xml <?xml version="1.0" encoding="utf-8"?> <extension version="3.2" type="component" method="upgrade"> <name>db8 locate</name> <author>Peter Martin</author> <creationDate>12 September 2014</creationDate> <copyright>Copyright (C) 2014 Peter Martin / db8.nl</copyright> <license>GNU General Public License version 2</license> <authorEmail>joomla@db8.nl</authorEmail> <version>1.0.1</version> <description>Component to manage and display locations on a Google Map</description> <!-- SQL query files to execute on installation --> <install> ● <sql> ● <file driver="mysql" charset="utf8">sql/install/mysql/install.sql</file> ● <file driver="mysql">sql/install/mysql/install.sql</file> ● ● <file driver="mysqli" charset="utf8">sql/install/mysql/install.sql</file> ● <file driver="mysqli">sql/install/mysql/install.sql</file> ● </sql> ● </install> JJoooommllaaddaayy UUKK 22001144
  • 21. 1.4 basic component – XML manifest 2/2 21 /administrator/components/com_db8locate/db8locate.xml <!-- Administrator back-end section --> <administration> <!-- Administration menu --> <menu view="cpanel">COM_DB8LOCATE</menu> <!-- Back-end files --> <files folder="backend"> <folder>sql</folder> <filename>db8locate.php</filename> <filename>fof.xml</filename> </files> </administration> </extension> JJoooommllaaddaayy UUKK 22001144
  • 22. /administrator/components/com_db8locate/views/items/tmpl/form.default.xml 22 1.5 basic component – view list <?xml version="1.0" encoding="UTF-8"?> ● ● <form type="browse" ● show_header="1" ● show_filters="1" ● show_pagination="1" ● norows_placeholder="COM_DB8LOCATE_COMMON_NORECORDS"> ● ● <headerset> ● <header name="db8locate_item_id" type="rowselect" tdwidth="20" /> ● <header name="title" type="fieldsearchable" sortable="true" JJoooommllaaddaayy UUKK 22001144 buttons="yes" buttonclass="btn" /> ● </headerset> ● ● <fieldset name="items"> ● <field name="db8locate_item_id" show_id="true" type="selectrow"/> ● <field name="title" type="text" show_link="true" url="index.php?option=com_db8locate &amp;view=item&amp;id=[ITEM:ID]" empty_replacement="(no title)" /> ● </fieldset> ● ● </form>
  • 23. 23 1.6 basic component – view form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml <?xml version="1.0" encoding="UTF-8"?> JJoooommllaaddaayy UUKK 22001144 ● ● <form validate="true" serverside_validate="true"> ● ● <fieldset name="basic_configuration" ● label="COM_DB8LOCATE_LOCATION_ITEM_EDIT" ● description="COM_DB8LOCATE_LOCATION_ITEM_EDIT_BASIC_DESC" ● class="span4"> ● ● <field name="title" type="text" ● class="inputbox" ● label="JGLOBAL_TITLE" ● required="true" ● Size="50" /> ● </fieldset> ● </form>
  • 24. 24 1. basic component – installation Via Extensions > Extension Manager > Discover JJoooommllaaddaayy UUKK 22001144
  • 25. 25 1. basic component (back-end) ● List view JJoooommllaaddaayy UUKK 22001144
  • 26. 26 1. basic component (back-end) ● Form view JJoooommllaaddaayy UUKK 22001144
  • 27. 27 1. basic component (back-end) ● List view after couple of new & save JJoooommllaaddaayy UUKK 22001144
  • 28. 28 2. language file JJoooommllaaddaayy UUKK 22001144
  • 29. 29 JJoooommllaaddaayy UUKK 22001144 2. language file sys.ini → For menu items etc. Put in /language/ map of db8locate component! /administrator/components/com_db8locate/ language/en-GB/en-GB.com_db8locate.sys.ini ● COM_DB8LOCATE="db8 Locate" COM_DB8LOCATE_XML_DESCRIPTION="Component to manage and display locations on a Google Map"
  • 30. 30 COM_DB8LOCATE="db8 Locate" COM_DB8LOCATE_TITLE_ITEMS="Location Items" COM_DB8LOCATE_COMMON_NORECORDS="No Location Items" COM_DB8LOCATE_TITLE_ITEMS_EDIT="Edit Location Items" COM_DB8LOCATE_LOCATION_ITEM_EDIT="Location Items" COM_DB8LOCATE_LBL_ITEM_SAVED="Location Item saved" COM_DB8LOCATE_CONFIRM_DELETE="Delete Location Item?" JJoooommllaaddaayy UUKK 22001144 2. language file .ini → large file for all language lables com_db8locate /administrator/components/com_db8locate/ language/en-GB/en-GB.com_db8locate.ini TIP: “Debug Language” & collect all “lables to translate”
  • 31. 31 JJoooommllaaddaayy UUKK 22001144 2. language file
  • 32. 32 3. switch on/off JJoooommllaaddaayy UUKK 22001144
  • 33. 33 3. switch on/off – database field New field “enabled” to store publication status ALTER TABLE `#__db8locate_items` ADD `enabled` TINYINT( 3 ) NOT NULL DEFAULT '1'; JJoooommllaaddaayy UUKK 22001144
  • 34. 3. switch on/off – database field /administrator/components/com_db8locate/views/items/tmpl/form.default.xml 34 Add to <headerset> JJoooommllaaddaayy UUKK 22001144 ● <header name="enabled" type="published" sortable="true" tdwidth="8%" /> ● ● Add to <fieldset name="items"> ● <field name="enabled" type="published"/> ●
  • 35. 35 JJoooommllaaddaayy UUKK 22001144 3. switch on/off
  • 36. 36 3. switch on/off – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> JJoooommllaaddaayy UUKK 22001144 ● <field name="enabled" type="list" label="JSTATUS" ● labelclass="todo-label" ● class="inputbox" ● filter="intval" size="1" default="1" > ● <option value="1">JPUBLISHED</option> ● <option value="0">JUNPUBLISHED</option> ● </field> ●
  • 37. 37 3. switch on/off – form JJoooommllaaddaayy UUKK 22001144
  • 38. 38 4. order JJoooommllaaddaayy UUKK 22001144
  • 39. 39 4. order – database field New database field “ordering” ALTER TABLE `#__db8locate_items` ADD `ordering` INT( 11 ) NOT NULL DEFAULT '0'; JJoooommllaaddaayy UUKK 22001144
  • 40. 40 JJoooommllaaddaayy UUKK 22001144 4. order – list /administrator/components/com_db8locate/views/items/tmpl/form.default.xml Add to <headerset> ● <header name="ordering" type="ordering" sortable="true" tdwidth="10%" /> ● ● Add to <fieldset name="items"> ● <field name="ordering" type="ordering" labelclass="order"/> ● ●
  • 41. 41 JJoooommllaaddaayy UUKK 22001144 4. order
  • 42. 42 5. categories JJoooommllaaddaayy UUKK 22001144
  • 43. 43 5. categories – database field Add new database field “catid” to store category_id ALTER TABLE `#__db8locate_items` ADD `catid` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'; JJoooommllaaddaayy UUKK 22001144
  • 44. /administrator/components/com_db8locate/views/items/tmpl/form.default.xml Note: xml has hardcoded SQL for MySQL → should be model instead 44 5. categories – list Add to <headerset> JJoooommllaaddaayy UUKK 22001144 ● <header name="category" type="category" sortable="true" tdwidth="10%" /> ● ● Add to <fieldset name="items"> <field name="catid" type="sql" translate="false" query="SELECT * FROM #__categories" key_field="id" value_field="title" /> ●
  • 45. 45 5. categories – list JJoooommllaaddaayy UUKK 22001144
  • 46. 46 5. categories – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> JJoooommllaaddaayy UUKK 22001144 ● <field name="catid" type="category" ● extension="com_db8locate" ● class="inputbox" ● label="JCATEGORY" ● required="true" ● size="1" /> ●
  • 47. 47 5. categories – form JJoooommllaaddaayy UUKK 22001144
  • 48. 48 5. categories – toolbar /administrator/components/com_db8locate/toolbar.php ● <?php defined('_JEXEC') or die(); class Db8locateToolbar extends FOFToolbar { public function Db8locateHelperRenderSubmenu($vName) { return $this->renderSubmenu($vName); } public function renderSubmenu($vName = null) { if (is_null($vName)) { $vName = $this->input->getCmd('view', 'cpanel'); } $this->input->set('view', $vName); parent::renderSubmenu(); $toolbar = FOFToolbar::getAnInstance($this->input->getCmd('option', 'com_db8locate'), $this->config); $toolbar->appendLink(Jtext::_('COM_DB8LOCATE_SUBMENU_CATEGORIES'), 'index.php?option=com_categories&extension=com_db8locate', $vName == 'categories'); } JJoooommllaaddaayy UUKK 22001144 }
  • 49. 49 5. categories – toolbar JJoooommllaaddaayy UUKK 22001144
  • 50. 5. categories – toolbar in Category Manager 50 Create button in Category Manager to navigate back to “Items”: /administrator/components/com_db8locate/helpers/db8locate.php ● <?php ● defined('_JEXEC') or die(); ● ● /** ● * Helper to display db8 locate component submenus in com_categories ● */ ● abstract class Db8locateHelper { ● ● public static function addSubmenu($submenu) { JsubMenuHelper::addEntry(JText::_( JJoooommllaaddaayy UUKK 22001144 'COM_DB8LOCATE_TITLE_ITEMS'), 'index.php?option=com_db8locate', $submenu == 'locations'); JsubMenuHelper::addEntry(JText::_( 'COM_DB8LOCATE_SUBMENU_CATEGORIES'), 'index.php?option=com_categories&view=categories &extension=com_db8locate', $submenu == 'categories'); ● } ● }
  • 51. Warning: Invalid argument supplied for foreach() in /var/www/rad/libraries/cms/helper/content.php on line 121 51 5. categories – Category Manager Click on “Location Categories”, Result: JJoooommllaaddaayy UUKK 22001144
  • 52. 52 6. access levels JJoooommllaaddaayy UUKK 22001144 1. Access to application
  • 53. 53 6. access levels application 1/2 /administrator/components/com_db8locate/access.xml ● <?xml version="1.0" encoding="utf-8"?> ● <access component="com_db8locate"> ● ● <section name="component"> ● <action name="core.admin" title="JACTION_ADMIN" JJoooommllaaddaayy UUKK 22001144 description="JACTION_ADMIN_COMPONENT_DESC" /> <action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" /> ● <action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" /> ● <action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" /> ● <action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" /> ● <action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" /> ● </section>
  • 54. 54 6. access levels application 2/2 /administrator/components/com_db8locate/access.xml ● <section name="category"> ● <action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" /> ● <action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" /> ● <action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" /> ● <action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" /> ● <action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ JJoooommllaaddaayy UUKK 22001144 ACCESS_EDITSTATE_DESC" /> ● </section> ● ● </access>
  • 55. 55 6. access levels JJoooommllaaddaayy UUKK 22001144 2. (Front-end) access to database items
  • 56. 56 6. access levels – list JJoooommllaaddaayy UUKK 22001144
  • 57. 57 7. parameters JJoooommllaaddaayy UUKK 22001144
  • 58. 58 JJoooommllaaddaayy UUKK 22001144 7. parameters /administrator/components/com_db8locate/config.xml via Components > db8 locate > categories > [options] ● <?xml version="1.0" encoding="UTF-8"?> ● <config> ● ● <fieldset name="permissions" ● label="JCONFIG_PERMISSIONS_LABEL" ● description="JCONFIG_PERMISSIONS_DESC" > ● ● <field name="rules" ● type="rules" ● label="JCONFIG_PERMISSIONS_LABEL" ● class="inputbox" ● filter="rules" ● component="com_db8locate" ● section="component" /> ● ● </fieldset> ● ● </config>
  • 59. 59 8. multilingual JJoooommllaaddaayy UUKK 22001144
  • 60. 60 8. multilingual – database field Add new field “language” to store language code ALTER TABLE `#__db8locate_items` ADD `language` CHAR( 7 ) NOT NULL DEFAULT '*'; JJoooommllaaddaayy UUKK 22001144
  • 61. /administrator/components/com_db8locate/views/items/tmpl/form.default.xml 61 8. multilingual – list Add to <headerset> JJoooommllaaddaayy UUKK 22001144 ● <header name="language" type="language" sortable="true" tdwidth="10%" /> ● ● ● Add to <fieldset name="items"> <field name="language" type="text" tdwidth="10%" /> ●
  • 62. 62 8. multilingual – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> JJoooommllaaddaayy UUKK 22001144 ● <field name="language" type="contentlanguage" label="JFIELD_LANGUAGE_LABEL" > ● <option value="*">JALL</option> ● </field> ● ●
  • 63. 63 8. multilingual – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> JJoooommllaaddaayy UUKK 22001144 ● <field name="language" type="contentlanguage" label="JFIELD_LANGUAGE_LABEL" > ● <option value="*">JALL</option> ● </field> ● ●
  • 64. 64 8. multilingual – list JJoooommllaaddaayy UUKK 22001144
  • 65. 65 9. “magic fields” JJoooommllaaddaayy UUKK 22001144
  • 66. 66 JJoooommllaaddaayy UUKK 22001144 9. “magic fields” ● Present in component: enabled (“state”), ordering, ● Also add to database table: created_by, created_on(“created”), modified_by, modified_on(“modified”), locked_by(“checked_out”), locked_on(“checked_out_time”), hits ● In list view: created_by & created_on ● In form view: all fields
  • 67. 67 10. tags JJoooommllaaddaayy UUKK 22001144
  • 68. 68 JJoooommllaaddaayy UUKK 22001144 10. tags #__tags tabel stores tags: id title 4 Joomla 5 Linux #__contentitem_tag_map links content items and tags: type_alias core_content_id content_item_id tag_id type_id com_content.article 1 1 2 1 com_content.article 1 1 3 1 com_content.article 3 2 4 1 com_content.article 3 2 5 1 com_weblinks.weblink 2 1 4 2 com_weblinks.weblink 2 1 5 2
  • 69. 69 JJoooommllaaddaayy UUKK 22001144 10. tags – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> ● <field name="tags" type="tag" label="JTAG" description="JTAG_DESC" class="inputbox span12" multiple="true" > </field>
  • 70. 70 JJoooommllaaddaayy UUKK 22001144 10. tags Unfortunately ... not working... bug in Joomla to versie 3.2.3: Use of com_tags only possible if JTable is used in component.
  • 71. 71 11. my own fields... JJoooommllaaddaayy UUKK 22001144
  • 72. 72 11. db8locate – database field Add your own fields to database ALTER TABLE `jos_db8locate_items` ● ADD `location` VARCHAR( 60 ) NOT NULL , ● ADD `address` VARCHAR( 50 ) NOT NULL , ● ADD `postcode` VARCHAR( 12 ) NOT NULL , ● ADD `city` VARCHAR( 50 ) NOT NULL , ● ADD `region` VARCHAR( 50 ) NOT NULL , ● ADD `country` VARCHAR( 50 ) NOT NULL , ● ADD `latitude` VARCHAR( 10 ) NOT NULL , ● ADD `longitude` VARCHAR( 10 ) NOT NULL , ● ADD `website` VARCHAR( 100 ) NOT NULL JJoooommllaaddaayy UUKK 22001144
  • 73. 73 11. db8locate – list JJoooommllaaddaayy UUKK 22001144
  • 74. 74 11. db8locate – further improvements ● Update your SQL installation script: /administrator/components/com_db8locate/sql/install/mysql/install.sql ● If "required fields" are not completed, then "save" results in emptying the fields... /administrator/components/com_db8locate/models/items.php ● class Db8directoryModelItems extends F0Fmodel { ● protected $_savestate = 1; ● protected function loadFormData() { ● Jfactory::getApplication()-> ● setUserState('com_db8locate.add.item.data', ''); ● JJoooommllaaddaayy UUKK 22001144 ● ● if (empty($this->_formData)) { ● return array(); ● } else { ● return $this->_formData; ● } ● } ● }
  • 75. 75 11. db8locate – further improvements ● Edit form too long → divide into columns /administrator/components/com_db8locate/views/item/tmpl/form.form.xml /administrator/components/com_db8locate/views/item/tmpl/form.form.xml ● <fieldset name="basic_configuration" label="COM_DB8LOCATE_ITEM_LOCATION" class="span4"> fields in column 1 </fieldset> ● ● <fieldset name="address" label="COM_DB8LOCATE_ITEM_ADDRESS" class="span4"> fields in column 2 </fieldset> JJoooommllaaddaayy UUKK 22001144
  • 76. 76 11. db8locate – further improvements ● Lookup Coordinates of each Address at Google Maps API – Add lookup code for Google Map API in Model – Add button in Toolbar – Add handling in Controller JJoooommllaaddaayy UUKK 22001144
  • 77. 77 d) Joomla Component with FOF – front-end JJoooommllaaddaayy UUKK 22001144
  • 78. 78 12. basic component (front-end) 1.Entry point /components/com_db8locate/db8locate.php 2.View: list /components/com_db8locate/views/items/tmpl/form.default.xml /components/com_db8locate/views/items/metadata.xml –> for menu 3.View: single item /components/com_db8locate/views/item/tmpl/form.item.xml /components/com_db8locate/views/item/metadata.xml –> for menu 4.Language files /components/com_db8locate/language/en-GB/en-GB.com_db8locate.ini JJoooommllaaddaayy UUKK 22001144
  • 79. 79 12.1 front-end – entry point /administrator/components/com_db8locate/db8locate.php <?php defined('_JEXEC') or die(); // Load FOF include_once JPATH_LIBRARIES.'/fof/include.php'; // Quit if FOF is not installed if(!defined('FOF_INCLUDED')) { JError::raiseError ('500', 'FOF is not installed'); } FOFDispatcher::getTmpInstance('com_db8locate')->dispatch() ; JJoooommllaaddaayy UUKK 22001144
  • 80. 80 12.2 front-end – view list /components/com_db8locate/views/items/tmpl/form.default.xml <?xml version="1.0" encoding="UTF-8"?> <form type="browse" show_header="1" show_filters="0" show_pagination="1" show_enabled="1" norows_placeholder="COM_DB8LOCATE_COMMON_NORECORDS" > <headerset> <header name="title" type="fieldsearchable" sortable="true"buttons="true" /> <header name="city" type="fieldsearchable" sortable="true"buttons="false" /> <header name="region" sortable="true"buttons="false" /> <header name="country" sortable="true"buttons="false" tdwidth="20%" /> <header name="category" sortable="false"buttons="false" /> </headerset> <fieldset name="items"> <field name="title" type="text" show_link="true" url="index.php?option=com_db8locate&amp;view=item&amp;id=[ITEM:ID]" class="todoitem" empty_replacement="(no title)" /> <field name="city" type="text" /> <field name="region" type="text" /> <field name="country" type="text" /> <field name="catid" type="sql" translate="false" query="SELECT * FROM #__categories" key_field="id" value_field="title"/> </fieldset> </form> JJoooommllaaddaayy UUKK 22001144
  • 81. 81 12.2 front-end – view list JJoooommllaaddaayy UUKK 22001144
  • 82. 82 12.3 front-end – view details /components/com_db8locate/views/item/tmpl/form.item.xml <?xml version="1.0" encoding="utf-8"?> ● <form ● type="read"> ● ● <fieldset name="a_single_item" class="item-container form-horizontal"> ● <field name="title" type="text" ● label="COM_DB8LOCATE_TITLE" ● class="db8locate-title-field" ● size="50"/> ● ● <field name="city" type="text" ● label="COM_DB8LOCATE_CITY" ● labelclass="db8locate-field" ● size="20" /> ● ● <field name="website" type="text" ● label="COM_DB8LOCATE_WEBSITE" ● labelclass="db8locate-field" ● size="40" /> ● ● </fieldset> ● </form> JJoooommllaaddaayy UUKK 22001144
  • 83. 83 12.3 front-end – view details JJoooommllaaddaayy UUKK 22001144
  • 84. 84 12.4 language files /components/com_db8locate/language/en-GB/en-GB.com_db8locate.ini TIP: “Debug Language” & collect all “lables to translate” JJoooommllaaddaayy UUKK 22001144
  • 85. 85 13. more views JJoooommllaaddaayy UUKK 22001144
  • 86. 86 <?php $viewTemplate = $this->getRenderedForm(); echo $viewTemplate; ?> JJoooommllaaddaayy UUKK 22001144 13. more views Combine XML & PHP /components/com_db8locate/views/items/tmpl/default.php and load form.default.xml E.g. mix with Google Maps
  • 87. 87 13. more views – mixed php & xml JJoooommllaaddaayy UUKK 22001144
  • 88. 88 JJoooommllaaddaayy UUKK 22001144 13. more views Extra (built-in) output options: &format=csv administrator/index.php?option=com_db8locate&format=csv &format=json administrator/index.php?option=com_db8locate&format=json
  • 89. 89 d) tools JJoooommllaaddaayy UUKK 22001144
  • 90. 90 JJoooommllaaddaayy UUKK 22001144 Errors ● IMHO Harder to detect than "regular" Joomla component! ● Cache!! ● Debug – E.g. back-end error: “An error has occurred. 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY node.lft' at line 4 SQL=SELECT node.id FROM jos_categories AS node, jos_categories AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND parent.id = ORDER BY node.lft” can be caused by error in the front-end! Test: rename front-end com_db8locate temporary – Front-end error: Notice: Undefined variable: form_class in /var/www/rad/libraries/fof/render/strapper.php on line 676 Test: rebuilt .xml files step-by-step – print_r($object) / echo $query / die(“stop here!”)
  • 91. 91 JJoooommllaaddaayy UUKK 22001144 Sources ● Documentation https://www.akeebabackup.com/documentation/fof.html ● FOF Mailinglist: https://groups.google.com/forum/#!forum/frameworkonframework ● Source code Github: https://github.com/akeeba/fof ● Examples: https://github.com/akeeba/todo-fof-example/ https://github.com/akeeba/contactus Akeeba Backup, Akeeba Ticket System https://github.com/tuum/com_timesheet
  • 93. 93 JJoooommllaaddaayy UUKK 22001144 Contact Presentation available at: http://www.db8.nl Component db8locate available at: https://github.com/pe7er/db8locate Peter Martin e-mail: info at db8.nl website: www.db8.nl twitter: @pe7er Review this presentation: https://joind.in/talk/view/11625
  • 94. 94 JJoooommllaaddaayy UUKK 22001144 Used Photos 1/2 ● Speed Typing - Matthew Bowden http://www.sxc.hu/photo/275499 ● Speedometer – Abdulhamid AlFadhly http://www.sxc.hu/photo/1390189 ● LONDON SKYLINE CLIP ART http://www.clker.com/clipart-london-skyline-19.html ● Forjados 1 - Albert Lazcano http://www.sxc.hu/photo/626785 ● Bengali Keyborad - Mohammad Jobaed Adnan http://www.sxc.hu/photo/676844 ● Old Light Switches - Paul Cross http://www.sxc.hu/photo/1259922 ● madera en pila 1 - jean froidevaux http://www.sxc.hu/photo/313864 ● Books books books... - Brandon Blinkenberg http://www.sxc.hu/photo/424027 ● Sign 3: forbidden access - Davide Guglielmo http://www.sxc.hu/photo/200982
  • 95. 95 JJoooommllaaddaayy UUKK 22001144 Used Photos 2/2 ● Communications Receiver - John Munsch http://www.sxc.hu/photo/260775 ● Flags of the Baltic Sea countries - Johannes Raitio http://www.sxc.hu/photo/471547 ● Lock - Robert Linder http://www.sxc.hu/photo/1395379 ● Basho Collage 5 - Billy Alexander http://www.sxc.hu/photo/1330749 ● Earth: Night Edition - Europe - Sigurd Decroos http://www.sxc.hu/photo/140879 ● Retro/Vintage TV set - "meltingdog" http://www.sxc.hu/photo/1440150 ● san sebastian views 1 - ibon san martin http://www.sxc.hu/photo/94018 ● Tools - J Boontje http://www.sxc.hu/photo/805571 ● The End Book, EWikist, 2010 http://commons.wikimedia.org/wiki/File:The_End_Book.png