Joomla! 1.5 Extensions - webdevFulda
Joomla! 1.5 Extensions - webdevFulda
Joomla! 1.5 Extensions - webdevFulda
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
4. Web Development Fulda Treffen<br />
<strong>Joomla</strong>! <strong>1.5</strong> <strong>Extensions</strong><br />
Erstellung von Plugins, Modulen und Komponenten<br />
Achim Fischer<br />
Donnerstag, 3. September 2009
Basics:<br />
• PHP<br />
• MySQL<br />
Donnerstag, 3. September 2009
Extension Typen:<br />
• Plugins<br />
• Module<br />
• Komponenten<br />
Donnerstag, 3. September 2009
Worin unterscheiden<br />
sich die 3 Typen<br />
Donnerstag, 3. September 2009
Was sind die jeweiligen<br />
Einsatzgebiete<br />
Donnerstag, 3. September 2009
Plugins<br />
Ereignisgesteuert<br />
wie z.B. Datenbank Trigger<br />
Beispiel:<br />
Ein Plugin das beim Anzeigen von Content, Smilie<br />
Code mit Smilies ersetzt<br />
Donnerstag, 3. September 2009
Module<br />
Werden an Modulpositionen des Templates angezeigt.<br />
Unterstützen häufig Komponenten<br />
Beispiel:<br />
Letzte 10 Einträge im Forum<br />
Donnerstag, 3. September 2009
Komponenten<br />
Werden im Hauptbereich des Templates angezeigt<br />
Entsprechen Applikationen<br />
Beispiele:<br />
Diskussions Forum<br />
Kleinanzeigenmarkt<br />
Donnerstag, 3. September 2009
Donnerstag, 3. September 2009<br />
Plugins
Plugins<br />
• Observer Pattern<br />
• Einklinken in Systemevents<br />
• Ändern von Systemfunktionalität ohne<br />
ändern von Systemcode<br />
Donnerstag, 3. September 2009
Plugins<br />
bestehen aus<br />
1 XML Datei<br />
1 PHP Datei<br />
Donnerstag, 3. September 2009
Plugins: discussions.xml<br />
<br />
<br />
System - Discussions<br />
Codingfish Limited<br />
March 2009<br />
Copyright (C) 2009 Codingfish Limited. All rights reserved.<br />
http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL<br />
info@codingfish.com<br />
www.codingfish.com<br />
1.0<br />
Plugin for Codingfish Discussions<br />
<br />
discussions.php<br />
<br />
<br />
<br />
Donnerstag, 3. September 2009
Plugins: discussions.xml<br />
<br />
<br />
System - Discussions<br />
Codingfish Limited<br />
March 2009<br />
Copyright (C) 2009 Codingfish Limited. All rights reserved.<br />
http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL<br />
info@codingfish.com<br />
www.codingfish.com<br />
1.0<br />
Plugin for Codingfish Discussions<br />
<br />
discussions.php<br />
<br />
<br />
<br />
Donnerstag, 3. September 2009
Plugins: discussions.xml<br />
<br />
<br />
System - Discussions<br />
Codingfish Limited<br />
March 2009<br />
Copyright (C) 2009 Codingfish Limited. All rights reserved.<br />
http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL<br />
info@codingfish.com<br />
www.codingfish.com<br />
1.0<br />
Plugin for Codingfish Discussions<br />
<br />
discussions.php<br />
<br />
<br />
<br />
Donnerstag, 3. September 2009
Plugins: Gruppen<br />
Es gibt 8 Core Groups:<br />
authentication<br />
content<br />
editors<br />
editors-xtd<br />
search<br />
system<br />
user<br />
xmlrpc<br />
Eigene Gruppen sind möglich<br />
Donnerstag, 3. September 2009
Plugins: Gruppen<br />
Zu beachten:<br />
Nur jeweils 1 Plugin mit demselben Namen pro Gruppe<br />
Es gibt reservierte Namen in den einzelnen Gruppen z.B.<br />
cache, debug, legacy, log und remember in system<br />
Donnerstag, 3. September 2009
Plugins: discussions.php<br />
nameQuote('#__discussions_users') . ' SET '.<br />
$db->nameQuote('user_id').' = '.$user['id'];<br />
$db->setQuery( $sql);<br />
$db->query();<br />
}<br />
else { // user is updated<br />
// currently not needed<br />
} <br />
}<br />
}<br />
Donnerstag, 3. September 2009
Plugins: plg_discussions.zip<br />
discussions.xml<br />
+<br />
discussions.php<br />
=<br />
plg_discussions.zip<br />
Donnerstag, 3. September 2009
Plugins: Installationsort<br />
Donnerstag, 3. September 2009
Donnerstag, 3. September 2009<br />
Module
Module: Modul Positionen im Template<br />
Beispiel:<br />
...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
...<br />
Donnerstag, 3. September 2009
Module<br />
bestehen<br />
mindestens aus<br />
1 XML Datei<br />
1 PHP Datei<br />
Donnerstag, 3. September 2009
Module: mod_discussions_recent.xml<br />
<br />
<br />
<br />
Discussions RecentX<br />
Codingfish Limited<br />
info@codingfish.com<br />
www.codingfish.com<br />
August 2009<br />
Copyright (C) 2009 Codingfish Limited. All rights reserved.<br />
http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL<br />
1.0<br />
Module for Codingfish Discussions. Displays recent X forum postings<br />
<br />
mod_discussions_recentx.php<br />
<br />
<br />
Donnerstag, 3. September 2009
Module: mod_discussions_recent.php<br />
get( 'number', 10 );<br />
$db = & JFactory::getDBO();<br />
$posts = null;<br />
$query = 'SELECT cat_id, thread, subject, DATE_FORMAT( date, "%d.%m.%Y %k:%i") AS createdate' .<br />
' FROM #__discussions_messages' .<br />
' WHERE published = 1 AND cat_id != 10 AND cat_id != 11 AND cat_id != 12' .<br />
' ORDER BY date DESC LIMIT ' . $number;<br />
$db->setQuery($query);<br />
$posts = $db->loadObjectList();<br />
if ($db->getErrorNum()) {<br />
JError::raiseWarning( 500, $db->stderr() );<br />
}<br />
if (count($posts)) {<br />
foreach ($posts as $post) {<br />
$link = "/forums/thread/" . $post->cat_id . "/" . $post->thread . ".html";<br />
echo "";<br />
echo $post->subject;<br />
echo "";<br />
echo "";<br />
echo $post->createdate;<br />
echo "";<br />
}<br />
}<br />
Donnerstag, 3. September 2009
Module: mod_discussions_recentx.zip<br />
mod_discussions_recentx.xml<br />
+<br />
mod_discussions_recentx.php<br />
=<br />
mod_discussions_recentx.zip<br />
Donnerstag, 3. September 2009
Module: Installationsort<br />
Donnerstag, 3. September 2009
Module: Website -> Template Position „right“<br />
Donnerstag, 3. September 2009
Donnerstag, 3. September 2009<br />
Komponenten
Komponenten:<br />
• Werden im Hauptbereich des Templates angezeigt<br />
• Entsprechen Applikationen/Programmen<br />
Donnerstag, 3. September 2009
Komponenten:<br />
2 Bereiche<br />
• Frontend<br />
• Backend<br />
Donnerstag, 3. September 2009
Komponenten<br />
bestehen aus<br />
1 XML Datei<br />
und<br />
Unmengen an PHP, CSS, SQL, Images,...<br />
Donnerstag, 3. September 2009
Komponenten: Verzeichnisstruktur (Frontend)<br />
Donnerstag, 3. September 2009
Komponenten: discussions.xml (Auszug)<br />
<br />
<br />
<br />
<br />
<br />
<br />
install.mysql.utf8.sql<br />
install.mysql.sql<br />
uninstall.mysql.sql<br />
uninstall.mysql.sql<br />
<br />
<br />
<br />
assets<br />
classes<br />
includes<br />
models<br />
views<br />
index.html<br />
discussions.php<br />
controller.php<br />
router.php<br />
<br />
<br />
Discussions<br />
<br />
Configuration<br />
Categories<br />
Threads<br />
<br />
<br />
install.mysql.utf8.sql<br />
install.mysql.sql<br />
uninstall.mysql.sql<br />
<br />
<br />
Donnerstag, 3. September 2009
Komponenten: discussions.xml (Auszug)<br />
<br />
<br />
<br />
<br />
<br />
<br />
install.mysql.utf8.sql<br />
install.mysql.sql<br />
uninstall.mysql.sql<br />
uninstall.mysql.sql<br />
<br />
<br />
<br />
assets<br />
classes<br />
includes<br />
models<br />
views<br />
index.html<br />
discussions.php<br />
controller.php<br />
router.php<br />
<br />
<br />
Discussions<br />
<br />
Configuration<br />
Categories<br />
Threads<br />
<br />
<br />
install.mysql.utf8.sql<br />
install.mysql.sql<br />
uninstall.mysql.sql<br />
<br />
<br />
Donnerstag, 3. September 2009
Komponenten: install.mysql.utf8.sql (Auszug)<br />
CREATE TABLE IF NOT EXISTS `#__discussions_users` (<br />
`user_id` int(11) NOT NULL,<br />
`view` tinyint(1) NOT NULL DEFAULT '0',<br />
`ordering` tinyint(1) NOT NULL DEFAULT '0',<br />
`posts` int(11) NOT NULL DEFAULT '0',<br />
`status` tinyint(1) NOT NULL DEFAULT '0',<br />
`avatar` varchar(100) DEFAULT 'user.png',<br />
`signature` text,<br />
`titel` varchar(100) NOT NULL,<br />
PRIMARY KEY (`user_id`)<br />
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;<br />
INSERT INTO `#__discussions_users` ( user_id)<br />
SELECT id FROM `#__users` ORDER BY id asc;<br />
Donnerstag, 3. September 2009
Komponenten: discussions.php<br />
execute(JRequest::getCmd('task', 'display'));<br />
// redirect<br />
$controller->redirect();<br />
Donnerstag, 3. September 2009
Komponenten: controller.php<br />
Komponenten: index.php (Index Model, Auszug)<br />
class DiscussionsModelIndex extends JModel {<br />
function getCategories() {<br />
$db =& $this->getDBO();<br />
// Load the categories<br />
if (empty($this->_data)) {<br />
$user =& JFactory::getUser();<br />
$logUser = new CUser( $user->id);<br />
if ( $logUser->isModerator()) { // show me all categories <br />
$query = "SELECT c.id, c.parent_id, c.name, c.description, c.image, c.show_image, c.published,<br />
c.counter_posts, c.counter_threads,<br />
DATE_FORMAT( c.last_entry_date, '%d.%m.%Y %k:%i') AS last_entry_date, c.last_entry_user_id, u.username<br />
FROM ".$db->nameQuote('#__discussions_categories')."c LEFT JOIN (".$db->nameQuote('#__users')." u)<br />
ON u.id=c.last_entry_user_id<br />
WHERE c.published='1' ORDER by c.ordering ASC";<br />
}<br />
else { // only show the public forums (privates are hidden)<br />
$query = "SELECT c.id, c.parent_id, c.name, c.description, c.image, c.show_image, c.published,<br />
c.counter_posts, c.counter_threads,<br />
DATE_FORMAT( c.last_entry_date, '%d.%m.%Y %k:%i') AS last_entry_date, c.last_entry_user_id, u.username<br />
FROM ".$db->nameQuote('#__discussions_categories')."c LEFT JOIN (".$db->nameQuote('#__users')." u)<br />
ON u.id=c.last_entry_user_id<br />
WHERE c.private='0' AND c.published='1' ORDER by c.ordering ASC"; <br />
}<br />
}<br />
$this->_data = $this->_getList($query);<br />
return $this->_data;<br />
}<br />
} // class<br />
Donnerstag, 3. September 2009
Komponenten: index.php (Index View)<br />
get('Categories');<br />
$this->assignRef('categories', $categories);<br />
// display the view<br />
parent::display();<br />
Donnerstag, 3. September 2009
Komponenten: tmpl/default.php (Index Template, Auszug)<br />
categories as $category ) :<br />
catLink = JRoute::_('index.phpoption=com_discussions&view=category&catid='.<br />
$category->id );<br />
echo "".$category->name."";<br />
echo „“;<br />
echo $category->description;<br />
.<br />
.<br />
.<br />
endforeach;<br />
Donnerstag, 3. September 2009
Komponenten: Discussions<br />
Donnerstag, 3. September 2009
Die Erstellung<br />
einer kompletten<br />
<strong>Joomla</strong>! <strong>1.5</strong> MVC Komponente<br />
...<br />
Donnerstag, 3. September 2009
ei Interesse<br />
demnächst<br />
in diesem Theater :-)<br />
Donnerstag, 3. September 2009
Literatur<br />
Mastering <strong>Joomla</strong>! <strong>1.5</strong><br />
Extension and Framework Development<br />
James Kennard<br />
Learning <strong>Joomla</strong>! <strong>1.5</strong><br />
Extension Development<br />
Joseph L. LeBlanc<br />
Donnerstag, 3. September 2009
Kontakt<br />
achim.fischer@codingfish.com<br />
http://www.codingfish.com<br />
http://www.facebook.com/afischer<br />
http://twitter.com/codingfish<br />
Donnerstag, 3. September 2009
Vielen Dank<br />
Achim Fischer<br />
Donnerstag, 3. September 2009