Joomla Updateserver 1x1

geschrieben von Alexander Grözinger

Montag, 16 April 2018 20:26 Publiziert in development
Artikel bewerten

Was habe ich geflucht bis ich den Updateserver am laufen hatte. Daraus entstand auch die Motivation meine Erfahrungen hier niederzuschreiben. Auch als kleiner Reminder für mich selbst, damit ich nicht ständig in dieselben Probleme renne.

Joomla ist eine Zicke. Und zwar eine große. Hält man sich nicht 100% exakt an die Konventionen, läuft gar, aber auch überhaupt gar nichts. Das Problem an der Geschichte: Die Doku. Zumindest finde ich die Doku an der einen oder anderen Stelle nicht klar genug. Ich versuche das hier mal verständlicher niederzuschreiben.

 

 

Grundlagen zum Joomla Updatesystem

Um die Thematik rund um das Bereitstellen von Updates über das Joomla eigene Updatesystem besser zu verstehen, habe ich einen Ausflug in den Sourcecode gewagt. Dabei fand ich heraus, dass für Joomla die folgenden Eigenschaften wichtig sind, wenn es darum geht zu prüfen, ob es für eine installierte Erweiterung ein Update gibt:

array( 
    'element' => $current_update->get('element'), 
    'type' => $current_update->get('type'), 
    'client_id' => $current_update->get('client_id'), 
    'folder' => $current_update->get('folder'), 
)  

Diese vier Eigenschaften ließt Joomla aus der .xml Datei aus, die Ihr auf eurem Updateserver bereitstellt. Dann prüft Joomla, ob es in seiner #__extensions Datenbank einen Eintrag findet, der zu diesen vier Parametern passt. Stimmt schon einer dieser Parameter nicht, findet Joomla die Extension nicht und wir bekommen ein Problem.

Am Anfang steht das Manifest

Über diese Datei wird Joomla klar gemacht, um was für eine Art Erweiterung es sich handelt, wie diese heißt und, und, und. Die offizielle Joomla Dokumentation ist an dieser Stelle gar nicht mal so schlecht und auf jeden Fall einen Blick wert.

Offiziele Joomla Manifest Dokumentation

Auf die, aus meiner Sicht, wichtigen Punkte möchte ich hier kurz eingehen. Dabei geht es aber nur um die Themen, die wichtig sind um einen Updateserver zum Rennen zu bekommen. Zeigen möchte ich dies Anhand einer meiner Komponenten (Sponsorswall).

Folgende beiden Möglichkeiten gibt es, die Manifest Datei zu benennen: manifest.xml oder <extension_name>.xml.

sponsorswall.xml

<extension type="component" version="3.0" method="upgrade"> 
    <name>sponsorswall</name> 
    <version>1.0.0</version> 
     
    <updateservers> 
        <server type="extension" priority="1" 
            name="AGMedia Updateserver"><![CDATA[http://www.agmedia.de/index.php?option=com_ars&view=update&task=stream&format=xml&id=4]]></server> 
    </updateservers>  
</extension> 

Tag-Cheat-Sheet

TagBeschreibung
<extension>
type:
  • component 
  • module 
  • plugin 
  • library 
  • package 
  • template 
  • file 
  • language
version:
  • 3.0
  • 2.5

Support für 2.5 sollte meiner Meinung nach nicht mehr angeboten werden. Das alte Joomla ist zu lange abgekündigt.

method:
  • install
  • upgrade

nur upgrade macht hier Sinn. Wählt Ihr install, dann lässt sich eure Erweiterung nur 1x installieren, aber nicht updaten

<name>

Definiert den Namen der Erweiterung (wird z.B. im Backend bei Erweiterungen => Verwalten als Name angezeigt)

Achtung!
Bei Komponenten baut Joomla aus diesem Wert die element_id der Extension.
Bsp: aus <name>sponsorswall</name> generiert Joomla die element_id com_sponsorswall

<version>

Die Version deiner Erweiterung

z.B. 1.0 oder 1.1.1

Um die Versionen miteinander zu vergleichen nutzt Joomla die PHP Funktion version_compare()

<server>
type:
  • extension
  • collection

collection wird nicht empfohlen. Nähere Info's in offizieller Doku.

priority:

numerischer Wert. Bei mehreren Servern (z.B. Mirror-Servern) wird nach Reihenfolge der Prioriät vorgegangen

name:

frei wählbarer Name für euren Updateserver

Die verflixte element_id

So enorm wichtig und so schlecht dokumentiert. Bei eigentlich jeder Erweiterungsart wird sie anders generiert oder definiert. Wie schon weiter oben beschrieben ist die element_id eines der vier Kriterien die Joomla benutzt um Updates zu identifizieren. Ich zeige hier eine kurze Überischt, wie sich Joomla die element_id generiert, bzw. wie und wo ihr sie selbst festlegt:

Typelement_id
component Die element_id für Komponenten ist, was in der manifest.xml bei <name>Sponsorswall</name> definiert ist. Zusätzlich fügt Joomla hier jedoch den Prefix com_ ein. Hier im Beispiel entsteht dann: com_sponsorswall als element_id.
<extension type="component" version="3.0" method="upgrade"> 
    <name>Sponsorswall</name> 
</extension>
module Die element_id für Module ist, was in der manifest.xml bei module="name-des-modules" definiert ist. Hier im Beispiel: mod_example
<extension type="module" version="3.0" method="upgrade" client="site"> 
    <files> 
        <filename module="mod_example">mod_example.php</filename> 
        <folder>tmpl</folder> 
    </files> 
</extension>
plugin Die element_id für Plugins ist, was in der manifest.xml bei plugin="name-des-plugins" definiert ist. Hier im Beispiel: agmlibloader
<extension type="plugin" version="3.0" group="system" method="upgrade">  
    <files folder="site"> 
        <filename plugin="agmlibloader">agmlibloader.php</filename> 
    </files> 
</extension>
library Die element_id für librarys ist, was in der manifest.xml bei <libraryname>agmlib</libraryname> definiert ist. Hier im Beispiel: agmlib
<extension type="library" method="upgrade" version="3.0"> 
    <libraryname>agmlib</libraryname> 
</extensions>
package Die element_id für packages ist, was in der manifest.xml bei <packagename>sponsorswall</packagename> definiert ist. Zusätzlich fügt Joomla hier jedoch wiederum den Prefix pkg_ ein. Hier im Beispiel entsteht dann: pkg_sponsorswall als element_id.
<extension type="package" version="3.0" method="upgrade"> 
    <packagename>sponsorswall</packagename> 
</extension>
tmpl ?
file ?
lang ?

Der Updateserver

Der Updateserver ist eigentlich nichts anderes, als eine .xml Datei die verschiedene Informationen beinhaltet. Entweder ihr erstellt diese Datei automatisch, wovon ich euch absolut abrate, oder ihr benutzt die beliebte und kostenlose Erweiterung akeeba_release_system. Hier als Beispiel die von ARS (akeeba release system) generierte xml Datei des Updateservers. Ihr findet in dieser Datei die vier elementar wichtigen Parameter wieder element, type, client_id und folder.

<updates> 
    <update> 
        <name> 
            <![CDATA[ AGMedia Sponsorswall ]]> 
        </name> 
        <description> 
            <![CDATA[ AGMedia Sponsorswall ]]> 
        </description> 
        <element>com_sponsorswall</element> 
        <type>component</type> 
        <version>1.0.0</version> 
        <infourl title="Sponsorentafel 1.0.0"> 
            http://www.agmedia.de/index.php/component/ars/?view=Items&release_id=16 
        </infourl> 
        <downloads> 
            <downloadurl type="full" format="zip"> 
                http://www.agmedia.de/index.php/component/ars/?view=Item&task=download&format=raw&id=18&dummy=my.zip 
            </downloadurl> 
        </downloads> 
        <tags> 
            <tag>stable</tag> 
        </tags> 
        <maintainer> 
            <![CDATA[ agmedia.de ]]> 
        </maintainer> 
        <maintainerurl>http://www.agmedia.de/</maintainerurl> 
        <section>Updates</section> 
        <targetplatform name="joomla" version="3.[0123456789]"/> 
        <client>1</client> 
        <folder/> 
    </update> 
</updates> 

Sollte Joomla euer Update nicht finden, dann vergleicht diese vier Werte, wie sie in eurer xml Datei auf dem Updateserver stehen, mit den Werten die in der Tabelle #__extensions eurer Joomla-Datenbank (mysql, etc... ). Nur wenn diese übereinstimmen, findet Joomla euer Update. Natürlich muss die Versionsnummer in der xml Datei auf dem Updateserver größer sein, als die in Joomla installierte Version, aber ich denke das ist logisch und klar ;).

Beispielauszug Mysql Tabelle

 

 

Share: