SlideShare ist ein Scribd-Unternehmen logo
1 von 95
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

JUG Utrecht 2013 - Have you tried turning it off and on again? Problemen oplo...
JUG Utrecht 2013 - Have you tried turning it off and on again? Problemen oplo...JUG Utrecht 2013 - Have you tried turning it off and on again? Problemen oplo...
JUG Utrecht 2013 - Have you tried turning it off and on again? Problemen oplo...Peter Martin
 
Development Setup of B-Translator
Development Setup of B-TranslatorDevelopment Setup of B-Translator
Development Setup of B-TranslatorDashamir Hoxha
 
Troubleshooting Joomla! problems - Joomladay Germany 2014
Troubleshooting Joomla! problems - Joomladay Germany 2014Troubleshooting Joomla! problems - Joomladay Germany 2014
Troubleshooting Joomla! problems - Joomladay Germany 2014Peter Martin
 
Joomla english for the work group
Joomla english for the work groupJoomla english for the work group
Joomla english for the work groupVicent Selfa
 
Joomlapresentation
JoomlapresentationJoomlapresentation
Joomlapresentationjlleblanc
 
JoomlaEXPO Presentation by Joe LeBlanc
JoomlaEXPO Presentation by Joe LeBlancJoomlaEXPO Presentation by Joe LeBlanc
JoomlaEXPO Presentation by Joe LeBlancJohn Coonen
 
Custom module and theme development in Drupal7
Custom module and theme development in Drupal7Custom module and theme development in Drupal7
Custom module and theme development in Drupal7marif4pk
 
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...
Desenvolvendo uma aplicação híbrida para Android e IOs utilizando Ionic, aces...Juliano Martins
 
TYPO3 CKEditor for integrators
TYPO3 CKEditor for integratorsTYPO3 CKEditor for integrators
TYPO3 CKEditor for integratorsFrans Saris
 
Overlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MyOverlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MySteve McMahon
 
The Anatomy of TYPO3 Sitepackages
The Anatomy of TYPO3 SitepackagesThe Anatomy of TYPO3 Sitepackages
The Anatomy of TYPO3 SitepackagesBenjamin Kott
 
Joomla 1.5 modules - Joomla!Days NL 2009 #jd09nl
Joomla 1.5 modules - Joomla!Days NL 2009 #jd09nlJoomla 1.5 modules - Joomla!Days NL 2009 #jd09nl
Joomla 1.5 modules - Joomla!Days NL 2009 #jd09nlJoomla!Days Netherlands
 
New EEA Plone Add-ons
New EEA Plone Add-onsNew EEA Plone Add-ons
New EEA Plone Add-onsAlin Voinea
 
13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS 13th Sep, Drupal 7 advanced training by TCS
13th Sep, Drupal 7 advanced training by TCS DrupalMumbai
 
Best practices for joomla extensions developers
Best practices for joomla extensions developersBest practices for joomla extensions developers
Best practices for joomla extensions developersFrancesco Abeni
 
Building Pluggable Web Applications using Django
Building Pluggable Web Applications using DjangoBuilding Pluggable Web Applications using Django
Building Pluggable Web Applications using DjangoLakshman Prasad
 

Was ist angesagt? (20)

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

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

Joomla 3 Component programmeren met RAD - Joomladagen 2014
Joomla 3 Component programmeren met RAD - Joomladagen 2014Joomla 3 Component programmeren met RAD - Joomladagen 2014
Joomla 3 Component programmeren met RAD - Joomladagen 2014Peter Martin
 
R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06zeesniper
 
Java Unit Testing with Unitils
Java Unit Testing with UnitilsJava Unit Testing with Unitils
Java Unit Testing with UnitilsMikalai Alimenkou
 
Modern frontend development with VueJs
Modern frontend development with VueJsModern frontend development with VueJs
Modern frontend development with VueJsTudor Barbu
 
Drupal 8 what to wait from
Drupal 8   what to wait fromDrupal 8   what to wait from
Drupal 8 what to wait fromAndrii Podanenko
 
Rapid application development using Akeeba FOF and Joomla 3.2
Rapid application development using Akeeba FOF and Joomla 3.2Rapid application development using Akeeba FOF and Joomla 3.2
Rapid application development using Akeeba FOF and Joomla 3.2JoomlaDay Australia
 
CISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 DevelopmentCISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 DevelopmentBrad Rippe
 
.NET @ apache.org
 .NET @ apache.org .NET @ apache.org
.NET @ apache.orgTed Husted
 
Getting started with drupal 8 code
Getting started with drupal 8 codeGetting started with drupal 8 code
Getting started with drupal 8 codeForum One
 
Php 5.6 From the Inside Out
Php 5.6 From the Inside OutPhp 5.6 From the Inside Out
Php 5.6 From the Inside OutFerenc Kovács
 
Asian Spirit 3 Day Dba On Ubl
Asian Spirit 3 Day Dba On UblAsian Spirit 3 Day Dba On Ubl
Asian Spirit 3 Day Dba On Ublnewrforce
 
Mageguru - magento custom module development
Mageguru -  magento custom module development Mageguru -  magento custom module development
Mageguru - magento custom module development Mage Guru
 
Odoo Experience 2018 - The Odoo JS Framework
Odoo Experience 2018 - The Odoo JS FrameworkOdoo Experience 2018 - The Odoo JS Framework
Odoo Experience 2018 - The Odoo JS FrameworkElínAnna Jónasdóttir
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKYoungHeon (Roy) Kim
 
OA Framwork Presentation.pptx
OA Framwork Presentation.pptxOA Framwork Presentation.pptx
OA Framwork Presentation.pptxwadierefky1
 
TYPO3 6.1. What's new
TYPO3 6.1. What's newTYPO3 6.1. What's new
TYPO3 6.1. What's newRafal Brzeski
 
Frontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the likeFrontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the likeDamien Seguin
 
jRecruiter - The AJUG Job Posting Service
jRecruiter - The AJUG Job Posting ServicejRecruiter - The AJUG Job Posting Service
jRecruiter - The AJUG Job Posting ServiceGunnar Hillert
 

Ähnlich wie Developing a Joomla 3.x Component using RAD/FOF - Joomladay UK 2014 (20)

Joomla 3 Component programmeren met RAD - Joomladagen 2014
Joomla 3 Component programmeren met RAD - Joomladagen 2014Joomla 3 Component programmeren met RAD - Joomladagen 2014
Joomla 3 Component programmeren met RAD - Joomladagen 2014
 
R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06
 
Java Unit Testing with Unitils
Java Unit Testing with UnitilsJava Unit Testing with Unitils
Java Unit Testing with Unitils
 
Modern frontend development with VueJs
Modern frontend development with VueJsModern frontend development with VueJs
Modern frontend development with VueJs
 
Drupal 8 what to wait from
Drupal 8   what to wait fromDrupal 8   what to wait from
Drupal 8 what to wait from
 
Rapid application development using Akeeba FOF and Joomla 3.2
Rapid application development using Akeeba FOF and Joomla 3.2Rapid application development using Akeeba FOF and Joomla 3.2
Rapid application development using Akeeba FOF and Joomla 3.2
 
CISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 DevelopmentCISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 Development
 
.NET @ apache.org
 .NET @ apache.org .NET @ apache.org
.NET @ apache.org
 
Getting started with drupal 8 code
Getting started with drupal 8 codeGetting started with drupal 8 code
Getting started with drupal 8 code
 
Php 5.6 From the Inside Out
Php 5.6 From the Inside OutPhp 5.6 From the Inside Out
Php 5.6 From the Inside Out
 
Asian Spirit 3 Day Dba On Ubl
Asian Spirit 3 Day Dba On UblAsian Spirit 3 Day Dba On Ubl
Asian Spirit 3 Day Dba On Ubl
 
Mageguru - magento custom module development
Mageguru -  magento custom module development Mageguru -  magento custom module development
Mageguru - magento custom module development
 
OpenCms Days 2015 Workflow using Docker and Jenkins
OpenCms Days 2015 Workflow using Docker and JenkinsOpenCms Days 2015 Workflow using Docker and Jenkins
OpenCms Days 2015 Workflow using Docker and Jenkins
 
Odoo Experience 2018 - The Odoo JS Framework
Odoo Experience 2018 - The Odoo JS FrameworkOdoo Experience 2018 - The Odoo JS Framework
Odoo Experience 2018 - The Odoo JS Framework
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELK
 
OA Framwork Presentation.pptx
OA Framwork Presentation.pptxOA Framwork Presentation.pptx
OA Framwork Presentation.pptx
 
September SDG - Lightning
September SDG - LightningSeptember SDG - Lightning
September SDG - Lightning
 
TYPO3 6.1. What's new
TYPO3 6.1. What's newTYPO3 6.1. What's new
TYPO3 6.1. What's new
 
Frontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the likeFrontend JS workflow - Gulp 4 and the like
Frontend JS workflow - Gulp 4 and the like
 
jRecruiter - The AJUG Job Posting Service
jRecruiter - The AJUG Job Posting ServicejRecruiter - The AJUG Job Posting Service
jRecruiter - The AJUG Job Posting Service
 

Mehr von Peter Martin

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

Mehr von Peter Martin (20)

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

Kürzlich hochgeladen

Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 

Kürzlich hochgeladen (20)

Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 

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