05.01.2015 Views

Joomla! 1.5 Extensions - webdevFulda

Joomla! 1.5 Extensions - webdevFulda

Joomla! 1.5 Extensions - webdevFulda

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!