SlideShare a Scribd company logo
1 of 83
Download to read offline
Developing a Joomla 
Component using RAD/FOF 
Part 1: Back-end 
Peter Martin, www.db8.nl. twitter: @pe7er 
Joomladay.de – 12+13 september 2014
Presentation Overview 
a)Introduction 
b)Rapid Application Development (RAD) / FOF 
c)Developing a Joomla back-end component: 
db8locate 
(Part 2: 
Developing a Joomla front-end component: db8locate 
Demo with programming, github & local web environment) 
>>> Sheets available: www.db8.nl <<< 
>>> Component: https://github.com/pe7er/db8locate <<< 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
a) Introduction 
● Your own webapplication: programming everything from 
scratch 
● PHP/MySQL/HTML/CSS/JavaScript 
● Joomla component: Joomla = Framework 
● Data to/from database – Database object 
● Layout – Template 
● Rights Management – Access Control List (ACL) 
● MVC → template overrides 
● Plugins – hook into events in own component 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
a) Functionality component back-end 
● Category list 
● Display list of categories 
● New / Edit a category 
● Delete categories 
● Publish/unpublish categories 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
● Categorie form 
● Display form of a category 
● Save a category 
● List of items 
● Display list of items 
● New / Edit an item 
● Delete item(s) 
● Publish/unpublish item(s) 
● Item form 
● Display form of an item 
● Save an item
a) Functionality component front-end 
● Display list of categories 
● Display a single category 
● Display list of items 
● Display single item 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
b) Rapid Application Development (RAD) 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
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 DDeeuuttsscchhllaanndd 22001144
Rapid Application Development (RAD) 
● RAD = Framework on Framework (since Joomla 3.2) 
● Extension of Joomla! Platform, Not stand-alone 
Joomla's MVC classes & similar to Joomla's MVC API 
● Backwards compatibile 
● Less code → faster development & less bugs 
● Convention over configuration -> FOF convention 
regarding naming of functions and database field names 
-> automatic (“automagic”) functionality 
● Bootstrap, jQuery, JSON 
● Hierarchical MVC (HMCV) – display component views at 
other places (other views, componenten, modules) 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
RAD/ FOF/ F0F ? 
● FOF (F O F) – Akeeba etc 
● RAD – FOF implementation in Joomla > version 3.2 
● F0F (F zero F) – Fork of FOF 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
c) Joomla Component with FOF 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
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 / Eclipse / PHPStorm / your ”weapon of choice” 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
“db8 locate” component 
Goal: 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 DDeeuuttsscchhllaanndd 22001144
1. basic component (back-end) 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
1. basic component (back-end) 
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 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
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 DDeeuuttsscchhllaanndd 22001144
1.2 basic comp. – dispatcher config 
/administrator/components/com_db8locate/fof.xml 
●<?xml version="1.0" encoding="UTF-8"?> 
●<fof> 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
● <backend> 
● <dispatcher> 
● <option name="default_view">items</option> 
</dispatcher> 
● </backend> 
●</fof>
1.3 basic component – SQL definition 
● Create SQL installation file: 
/administrator/components/com_db8locate/ 
sql/install/mysql/install.sql 
install.sql contains: 
● CREATE TABLE, table name (plural): 
#__db8locate_items 
● ID field, fieldname (singular) 
component-name_singular-view_id: 
db8locate_item_id (in Joomla: “id”) 
● title 
● PRIMARY KEY (`db8locate_item_id`) = ID field 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
1.3 basic component – SQL definition 
/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 DDeeuuttsscchhllaanndd 22001144
1.4 basic component – XML manifest 1/2 
/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 DDeeuuttsscchhllaanndd 22001144
1.4 basic component – XML manifest 2/2 
/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 DDeeuuttsscchhllaanndd 22001144
1.5 basic component – view list 
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
<?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" 
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>
1.6 basic component – view form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
<?xml version="1.0" encoding="UTF-8"?> 
● 
●<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"> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
● <field name="title" type="text" 
● class="inputbox" 
● label="JGLOBAL_TITLE" 
● required="true" 
● Size="50" /> 
● </fieldset> 
●</form>
1. basic component – installation 
Via Extensions > Extension Manager > Discover 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
1. basic component (back-end) 
● List view 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
1. basic component (back-end) 
● Form view 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
1. basic component (back-end) 
● List view after couple of new & save 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
2. language file 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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" 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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 
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?" 
TIP: “Debug Language” & collect all “lables to translate” 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
2. language file
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
3. switch on/off
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 DDeeuuttsscchhllaanndd 22001144
3. switch on/off – database field 
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
Add to <headerset> 
● 
<header name="enabled" type="published" sortable="true" 
tdwidth="8%" /> 
● 
●Add to <fieldset name="items"> 
● <field name="enabled" type="published"/> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
3. switch on/off
3. switch on/off – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
● 
<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> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
3. switch on/off – form 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
4. order
4. order – database field 
New database field “ordering” 
ALTER TABLE `#__db8locate_items` ADD `ordering` INT( 11 ) 
NOT NULL DEFAULT '0'; 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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"/> 
● 
●
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
4. order
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
5. categories
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 DDeeuuttsscchhllaanndd 22001144
5. categories – list 
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
Note: xml has hardcoded SQL for MySQL → should be model instead 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
Add to <headerset> 
● 
<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" /> 
●
5. categories – list 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
5. categories – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
● 
<field name="catid" type="category" 
● extension="com_db8locate" 
● class="inputbox" 
● label="JCATEGORY" 
● required="true" 
● size="1" /> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
5. categories – form 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
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 DDeeuuttsscchhllaanndd 22001144 
}
5. categories – toolbar 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
5. categories – toolbar in Category Manager 
Create button in Category Manager to navigate back to “Items”: 
/administrator/components/com_db8locate/helpers/db8locate.php 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
●<?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::_( 
'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'); 
● } 
●}
5. categories – Category Manager 
Click on “Location Categories”, Result: 
Warning: Invalid argument supplied for foreach() in 
/var/www/rad/libraries/cms/helper/content.php on line 
121 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
6. access levels 
1. Access to application 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
6. access levels application 1/2 
/administrator/components/com_db8locate/access.xml 
●<?xml version="1.0" encoding="utf-8"?> 
●<access component="com_db8locate"> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
●<section name="component"> 
● <action name="core.admin" title="JACTION_ADMIN" 
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>
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_ 
ACCESS_EDITSTATE_DESC" /> 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
● </section> 
● 
●</access>
6. access levels 
2. (Front-end) access to 
database items 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
6. access levels – list 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
7. parameters
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" /> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
● </fieldset> 
● 
●</config>
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
8. multilingual
8. multilingual – database field 
Add new field “language” to store language code 
ALTER TABLE `#__db8locate_items` ADD `language` 
CHAR( 7 ) NOT NULL DEFAULT '*'; 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
8. multilingual – list 
/administrator/components/com_db8locate/views/items/tmpl/form.default.xml 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
Add to <headerset> 
● 
<header name="language" type="language" 
sortable="true" tdwidth="10%" /> 
● 
● 
●Add to <fieldset name="items"> 
<field name="language" type="text" tdwidth="10%" /> 
●
8. multilingual – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
● 
<field name="language" type="contentlanguage" 
label="JFIELD_LANGUAGE_LABEL" > 
● <option value="*">JALL</option> 
● </field> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
●
8. multilingual – form 
/administrator/components/com_db8locate/views/item/tmpl/form.form.xml 
Add to <fieldset> 
● 
<field name="language" type="contentlanguage" 
label="JFIELD_LANGUAGE_LABEL" > 
● <option value="*">JALL</option> 
● </field> 
● 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
●
8. multilingual – list 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
9. “magic fields” 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
10. tags
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 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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>
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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.
11. my own fields... 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
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 DDeeuuttsscchhllaanndd 22001144
11. db8locate – list 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
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 DDeeuuttsscchhllaanndd 22001144 
● 
● if (empty($this->_formData)) { 
● return array(); 
● } else { 
● return $this->_formData; 
● } 
● } 
●}
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 DDeeuuttsscchhllaanndd 22001144
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 DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
12. front-end
12. front-end – basic component 
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 
15:30 to 16:15 hour – Part 2: Front-end 
Programming a simple front-end component using FOF 
Demo with programming, github & local web environment 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
d) tools
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!”) 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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 DDeeuuttsscchhllaanndd 22001144
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
Questions? 
Presentation available at: 
http://www.db8.nl 
Component db8locate available at: 
https://github.com/pe7er/db8locate 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
Peter Martin 
e-mail: info at db8.nl 
website: www.db8.nl 
twitter: @pe7er
Used photos ● Speed Typing - Matthew Bowden http://www.sxc.hu/photo/275499 
● Speedometer – Abdulhamid AlFadhly http://www.sxc.hu/photo/1390189 
● Earth: Night Edition - Europe - Sigurd Decroos http://www.sxc.hu/photo/140879 
● 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 
● 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 
● Retro/Vintage TV set - "meltingdog" http://www.sxc.hu/photo/1440150 
● san sebastian views 1 - ibon san martin http://www.sxc.hu/photo/94018 
● Fragile Parcel - Richard Dudley http://www.sxc.hu/photo/1279274 
● Sparks - Hector Landaeta http://www.sxc.hu/photo/1184243 
JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 
● Tools - J Boontje http://www.sxc.hu/photo/805571 
● signs signs - Jason Antony http://www.sxc.hu/photo/751034

More Related Content

What's hot

Troubleshooting Joomla! problems - Joomladay Germany 2014
Troubleshooting Joomla! problems - Joomladay Germany 2014Troubleshooting Joomla! problems - Joomladay Germany 2014
Troubleshooting Joomla! problems - Joomladay Germany 2014Peter Martin
 
Using Drupal Features in B-Translator
Using Drupal Features in B-TranslatorUsing Drupal Features in B-Translator
Using Drupal Features in B-TranslatorDashamir Hoxha
 
Joomla english for the work group
Joomla english for the work groupJoomla english for the work group
Joomla english for the work groupVicent Selfa
 
Development Setup of B-Translator
Development Setup of B-TranslatorDevelopment Setup of B-Translator
Development Setup of B-TranslatorDashamir Hoxha
 
Easy Blogging With Emacs
Easy Blogging With EmacsEasy Blogging With Emacs
Easy Blogging With EmacsDashamir Hoxha
 
PloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyondPloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyondDavid Glick
 
Joomlapresentation
JoomlapresentationJoomlapresentation
Joomlapresentationjlleblanc
 
JoomlaEXPO Presentation by Joe LeBlanc
JoomlaEXPO Presentation by Joe LeBlancJoomlaEXPO Presentation by Joe LeBlanc
JoomlaEXPO Presentation by Joe LeBlancJohn Coonen
 
Behaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & DrupalBehaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & Drupalsparkfabrik
 
Drupal 8 - Corso frontend development
Drupal 8 - Corso frontend developmentDrupal 8 - Corso frontend development
Drupal 8 - Corso frontend developmentsparkfabrik
 
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
 
Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP ApplicationsPavan Kumar N
 
Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)
Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)
Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)Eric Tiggeler
 
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
 
Overlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MyOverlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MySteve McMahon
 
Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Tom Brander
 
Best practices for joomla extensions developers
Best practices for joomla extensions developersBest practices for joomla extensions developers
Best practices for joomla extensions developersFrancesco Abeni
 

What's hot (20)

Troubleshooting Joomla! problems - Joomladay Germany 2014
Troubleshooting Joomla! problems - Joomladay Germany 2014Troubleshooting Joomla! problems - Joomladay Germany 2014
Troubleshooting Joomla! problems - Joomladay Germany 2014
 
Using Drupal Features in B-Translator
Using Drupal Features in B-TranslatorUsing Drupal Features in B-Translator
Using Drupal Features in B-Translator
 
Php 7 evolution
Php 7 evolutionPhp 7 evolution
Php 7 evolution
 
Joomla english for the work group
Joomla english for the work groupJoomla english for the work group
Joomla english for the work group
 
Development Setup of B-Translator
Development Setup of B-TranslatorDevelopment Setup of B-Translator
Development Setup of B-Translator
 
Easy Blogging With Emacs
Easy Blogging With EmacsEasy Blogging With Emacs
Easy Blogging With Emacs
 
PloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyondPloneNG: What's new in Plone 4.2, 4.3, and beyond
PloneNG: What's new in Plone 4.2, 4.3, and beyond
 
OpenCms Days 2015 Advanced Solr Searching
OpenCms Days 2015 Advanced Solr SearchingOpenCms Days 2015 Advanced Solr Searching
OpenCms Days 2015 Advanced Solr Searching
 
Joomlapresentation
JoomlapresentationJoomlapresentation
Joomlapresentation
 
JoomlaEXPO Presentation by Joe LeBlanc
JoomlaEXPO Presentation by Joe LeBlancJoomlaEXPO Presentation by Joe LeBlanc
JoomlaEXPO Presentation by Joe LeBlanc
 
Behaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & DrupalBehaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & Drupal
 
Drupal 8 - Corso frontend development
Drupal 8 - Corso frontend developmentDrupal 8 - Corso frontend development
Drupal 8 - Corso frontend development
 
Pluggin creation
Pluggin creationPluggin creation
Pluggin creation
 
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...
 
Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP Applications
 
Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)
Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)
Creating a multilingual site in Joomla 3 (Joomla 3 Beginner's Guide)
 
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
 
Overlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh MyOverlays, Accordions & Tabs, Oh My
Overlays, Accordions & Tabs, Oh My
 
Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Django, What is it, Why is it cool?
Django, What is it, Why is it cool?
 
Best practices for joomla extensions developers
Best practices for joomla extensions developersBest practices for joomla extensions developers
Best practices for joomla extensions developers
 

Similar to Developing a Joomla 3.x Component using RAD FOF- Part 1: Back-end - Joomladay Germany 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
 
Mageguru - magento custom module development
Mageguru -  magento custom module development Mageguru -  magento custom module development
Mageguru - magento custom module development Mage Guru
 
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
 
R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06zeesniper
 
crtical points for customizing Joomla templates
crtical points for customizing Joomla templatescrtical points for customizing Joomla templates
crtical points for customizing Joomla templatesamit das
 
Symfony2 Introduction Presentation
Symfony2 Introduction PresentationSymfony2 Introduction Presentation
Symfony2 Introduction PresentationNerd Tzanetopoulos
 
Joomlapresentation
JoomlapresentationJoomlapresentation
Joomlapresentationguestf44ffc
 
Drupal 8 what to wait from
Drupal 8   what to wait fromDrupal 8   what to wait from
Drupal 8 what to wait fromAndrii Podanenko
 
Drupal 8 - Core and API Changes
Drupal 8 - Core and API ChangesDrupal 8 - Core and API Changes
Drupal 8 - Core and API ChangesShabir Ahmad
 
Joomla! Components - Uma visão geral
Joomla! Components - Uma visão geralJoomla! Components - Uma visão geral
Joomla! Components - Uma visão geralFábrica Livre
 
OA Framwork Presentation.pptx
OA Framwork Presentation.pptxOA Framwork Presentation.pptx
OA Framwork Presentation.pptxwadierefky1
 
Advance Component Development by Azrul Rahim
Advance Component Development by Azrul RahimAdvance Component Development by Azrul Rahim
Advance Component Development by Azrul RahimJohn Coonen
 
Spring_Boot_Microservices-5_Day_Session.pptx
Spring_Boot_Microservices-5_Day_Session.pptxSpring_Boot_Microservices-5_Day_Session.pptx
Spring_Boot_Microservices-5_Day_Session.pptxPrabhakaran Ravichandran
 
Getting started with drupal 8 code
Getting started with drupal 8 codeGetting started with drupal 8 code
Getting started with drupal 8 codeForum One
 
Java Unit Testing with Unitils
Java Unit Testing with UnitilsJava Unit Testing with Unitils
Java Unit Testing with UnitilsMikalai Alimenkou
 
Introduction to Mangento
Introduction to Mangento Introduction to Mangento
Introduction to Mangento Ravi Mehrotra
 

Similar to Developing a Joomla 3.x Component using RAD FOF- Part 1: Back-end - Joomladay Germany 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
 
Mageguru - magento custom module development
Mageguru -  magento custom module development Mageguru -  magento custom module development
Mageguru - magento custom module development
 
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
 
R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06R12 d49656 gc10-apps dba 06
R12 d49656 gc10-apps dba 06
 
crtical points for customizing Joomla templates
crtical points for customizing Joomla templatescrtical points for customizing Joomla templates
crtical points for customizing Joomla templates
 
Readme
ReadmeReadme
Readme
 
Symfony2 Introduction Presentation
Symfony2 Introduction PresentationSymfony2 Introduction Presentation
Symfony2 Introduction Presentation
 
Magento
MagentoMagento
Magento
 
Joomlapresentation
JoomlapresentationJoomlapresentation
Joomlapresentation
 
Drupal 8 what to wait from
Drupal 8   what to wait fromDrupal 8   what to wait from
Drupal 8 what to wait from
 
Drupal 8 - Core and API Changes
Drupal 8 - Core and API ChangesDrupal 8 - Core and API Changes
Drupal 8 - Core and API Changes
 
Magento++
Magento++Magento++
Magento++
 
Joomla! Components - Uma visão geral
Joomla! Components - Uma visão geralJoomla! Components - Uma visão geral
Joomla! Components - Uma visão geral
 
OA Framwork Presentation.pptx
OA Framwork Presentation.pptxOA Framwork Presentation.pptx
OA Framwork Presentation.pptx
 
Advance Component Development by Azrul Rahim
Advance Component Development by Azrul RahimAdvance Component Development by Azrul Rahim
Advance Component Development by Azrul Rahim
 
Spring_Boot_Microservices-5_Day_Session.pptx
Spring_Boot_Microservices-5_Day_Session.pptxSpring_Boot_Microservices-5_Day_Session.pptx
Spring_Boot_Microservices-5_Day_Session.pptx
 
Getting started with drupal 8 code
Getting started with drupal 8 codeGetting started with drupal 8 code
Getting started with drupal 8 code
 
Java Unit Testing with Unitils
Java Unit Testing with UnitilsJava Unit Testing with Unitils
Java Unit Testing with Unitils
 
Mangento
MangentoMangento
Mangento
 
Introduction to Mangento
Introduction to Mangento Introduction to Mangento
Introduction to Mangento
 

More from 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
 

More from 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
 

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
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
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
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
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 

Recently uploaded (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
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
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
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...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 

Developing a Joomla 3.x Component using RAD FOF- Part 1: Back-end - Joomladay Germany 2014

  • 1. Developing a Joomla Component using RAD/FOF Part 1: Back-end Peter Martin, www.db8.nl. twitter: @pe7er Joomladay.de – 12+13 september 2014
  • 2. Presentation Overview a)Introduction b)Rapid Application Development (RAD) / FOF c)Developing a Joomla back-end component: db8locate (Part 2: Developing a Joomla front-end component: db8locate Demo with programming, github & local web environment) >>> Sheets available: www.db8.nl <<< >>> Component: https://github.com/pe7er/db8locate <<< JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 3. a) Introduction ● Your own webapplication: programming everything from scratch ● PHP/MySQL/HTML/CSS/JavaScript ● Joomla component: Joomla = Framework ● Data to/from database – Database object ● Layout – Template ● Rights Management – Access Control List (ACL) ● MVC → template overrides ● Plugins – hook into events in own component JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 4. a) Functionality component back-end ● Category list ● Display list of categories ● New / Edit a category ● Delete categories ● Publish/unpublish categories JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ● Categorie form ● Display form of a category ● Save a category ● List of items ● Display list of items ● New / Edit an item ● Delete item(s) ● Publish/unpublish item(s) ● Item form ● Display form of an item ● Save an item
  • 5. a) Functionality component front-end ● Display list of categories ● Display a single category ● Display list of items ● Display single item JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 6. b) Rapid Application Development (RAD) JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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 DDeeuuttsscchhllaanndd 22001144
  • 8. Rapid Application Development (RAD) ● RAD = Framework on Framework (since Joomla 3.2) ● Extension of Joomla! Platform, Not stand-alone Joomla's MVC classes & similar to Joomla's MVC API ● Backwards compatibile ● Less code → faster development & less bugs ● Convention over configuration -> FOF convention regarding naming of functions and database field names -> automatic (“automagic”) functionality ● Bootstrap, jQuery, JSON ● Hierarchical MVC (HMCV) – display component views at other places (other views, componenten, modules) JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 9. RAD/ FOF/ F0F ? ● FOF (F O F) – Akeeba etc ● RAD – FOF implementation in Joomla > version 3.2 ● F0F (F zero F) – Fork of FOF JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 10. c) Joomla Component with FOF JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 11. 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 / Eclipse / PHPStorm / your ”weapon of choice” JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 12. “db8 locate” component Goal: 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 DDeeuuttsscchhllaanndd 22001144
  • 13. 1. basic component (back-end) JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 14. 1. basic component (back-end) 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 JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 15. 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 DDeeuuttsscchhllaanndd 22001144
  • 16. 1.2 basic comp. – dispatcher config /administrator/components/com_db8locate/fof.xml ●<?xml version="1.0" encoding="UTF-8"?> ●<fof> JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ● <backend> ● <dispatcher> ● <option name="default_view">items</option> </dispatcher> ● </backend> ●</fof>
  • 17. 1.3 basic component – SQL definition ● Create SQL installation file: /administrator/components/com_db8locate/ sql/install/mysql/install.sql install.sql contains: ● CREATE TABLE, table name (plural): #__db8locate_items ● ID field, fieldname (singular) component-name_singular-view_id: db8locate_item_id (in Joomla: “id”) ● title ● PRIMARY KEY (`db8locate_item_id`) = ID field JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 18. 1.3 basic component – SQL definition /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 DDeeuuttsscchhllaanndd 22001144
  • 19. 1.4 basic component – XML manifest 1/2 /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 DDeeuuttsscchhllaanndd 22001144
  • 20. 1.4 basic component – XML manifest 2/2 /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 DDeeuuttsscchhllaanndd 22001144
  • 21. 1.5 basic component – view list /administrator/components/com_db8locate/views/items/tmpl/form.default.xml JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 <?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" 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>
  • 22. 1.6 basic component – view form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml <?xml version="1.0" encoding="UTF-8"?> ● ●<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"> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ● <field name="title" type="text" ● class="inputbox" ● label="JGLOBAL_TITLE" ● required="true" ● Size="50" /> ● </fieldset> ●</form>
  • 23. 1. basic component – installation Via Extensions > Extension Manager > Discover JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 24. 1. basic component (back-end) ● List view JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 25. 1. basic component (back-end) ● Form view JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 26. 1. basic component (back-end) ● List view after couple of new & save JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 27. 2. language file JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 28. 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" JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 29. 2. language file .ini → large file for all language lables com_db8locate /administrator/components/com_db8locate/ language/en-GB/en-GB.com_db8locate.ini 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?" TIP: “Debug Language” & collect all “lables to translate” JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 32. 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 DDeeuuttsscchhllaanndd 22001144
  • 33. 3. switch on/off – database field /administrator/components/com_db8locate/views/items/tmpl/form.default.xml Add to <headerset> ● <header name="enabled" type="published" sortable="true" tdwidth="8%" /> ● ●Add to <fieldset name="items"> ● <field name="enabled" type="published"/> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 35. 3. switch on/off – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> ● <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> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 36. 3. switch on/off – form JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 38. 4. order – database field New database field “ordering” ALTER TABLE `#__db8locate_items` ADD `ordering` INT( 11 ) NOT NULL DEFAULT '0'; JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 39. JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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"/> ● ●
  • 42. 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 DDeeuuttsscchhllaanndd 22001144
  • 43. 5. categories – list /administrator/components/com_db8locate/views/items/tmpl/form.default.xml Note: xml has hardcoded SQL for MySQL → should be model instead JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 Add to <headerset> ● <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" /> ●
  • 44. 5. categories – list JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 45. 5. categories – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> ● <field name="catid" type="category" ● extension="com_db8locate" ● class="inputbox" ● label="JCATEGORY" ● required="true" ● size="1" /> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 46. 5. categories – form JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 47. 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 DDeeuuttsscchhllaanndd 22001144 }
  • 48. 5. categories – toolbar JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 49. 5. categories – toolbar in Category Manager Create button in Category Manager to navigate back to “Items”: /administrator/components/com_db8locate/helpers/db8locate.php JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ●<?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::_( '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'); ● } ●}
  • 50. 5. categories – Category Manager Click on “Location Categories”, Result: Warning: Invalid argument supplied for foreach() in /var/www/rad/libraries/cms/helper/content.php on line 121 JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 51. 6. access levels 1. Access to application JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 52. 6. access levels application 1/2 /administrator/components/com_db8locate/access.xml ●<?xml version="1.0" encoding="utf-8"?> ●<access component="com_db8locate"> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ●<section name="component"> ● <action name="core.admin" title="JACTION_ADMIN" 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>
  • 53. 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_ ACCESS_EDITSTATE_DESC" /> JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ● </section> ● ●</access>
  • 54. 6. access levels 2. (Front-end) access to database items JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 55. 6. access levels – list JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 57. 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" /> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ● </fieldset> ● ●</config>
  • 59. 8. multilingual – database field Add new field “language” to store language code ALTER TABLE `#__db8locate_items` ADD `language` CHAR( 7 ) NOT NULL DEFAULT '*'; JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 60. 8. multilingual – list /administrator/components/com_db8locate/views/items/tmpl/form.default.xml JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 Add to <headerset> ● <header name="language" type="language" sortable="true" tdwidth="10%" /> ● ● ●Add to <fieldset name="items"> <field name="language" type="text" tdwidth="10%" /> ●
  • 61. 8. multilingual – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> ● <field name="language" type="contentlanguage" label="JFIELD_LANGUAGE_LABEL" > ● <option value="*">JALL</option> ● </field> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ●
  • 62. 8. multilingual – form /administrator/components/com_db8locate/views/item/tmpl/form.form.xml Add to <fieldset> ● <field name="language" type="contentlanguage" label="JFIELD_LANGUAGE_LABEL" > ● <option value="*">JALL</option> ● </field> ● JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ●
  • 63. 8. multilingual – list JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 64. 9. “magic fields” JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 65. 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 JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 67. 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 JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 68. JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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>
  • 69. JJoooommllaaddaayy DDeeuuttsscchhllaanndd 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.
  • 70. 11. my own fields... JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 71. 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 DDeeuuttsscchhllaanndd 22001144
  • 72. 11. db8locate – list JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 73. 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 DDeeuuttsscchhllaanndd 22001144 ● ● if (empty($this->_formData)) { ● return array(); ● } else { ● return $this->_formData; ● } ● } ●}
  • 74. 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 DDeeuuttsscchhllaanndd 22001144
  • 75. 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 DDeeuuttsscchhllaanndd 22001144
  • 77. 12. front-end – basic component 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 15:30 to 16:15 hour – Part 2: Front-end Programming a simple front-end component using FOF Demo with programming, github & local web environment JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 79. 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!”) JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144
  • 80. 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 DDeeuuttsscchhllaanndd 22001144
  • 82. Questions? Presentation available at: http://www.db8.nl Component db8locate available at: https://github.com/pe7er/db8locate JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 Peter Martin e-mail: info at db8.nl website: www.db8.nl twitter: @pe7er
  • 83. Used photos ● Speed Typing - Matthew Bowden http://www.sxc.hu/photo/275499 ● Speedometer – Abdulhamid AlFadhly http://www.sxc.hu/photo/1390189 ● Earth: Night Edition - Europe - Sigurd Decroos http://www.sxc.hu/photo/140879 ● 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 ● 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 ● Retro/Vintage TV set - "meltingdog" http://www.sxc.hu/photo/1440150 ● san sebastian views 1 - ibon san martin http://www.sxc.hu/photo/94018 ● Fragile Parcel - Richard Dudley http://www.sxc.hu/photo/1279274 ● Sparks - Hector Landaeta http://www.sxc.hu/photo/1184243 JJoooommllaaddaayy DDeeuuttsscchhllaanndd 22001144 ● Tools - J Boontje http://www.sxc.hu/photo/805571 ● signs signs - Jason Antony http://www.sxc.hu/photo/751034