+ Antworten
Ergebnis 1 bis 5 von 5

Thema: JTable vs. JModel

  1. #1
    War schon öfter hier
    Registriert seit
    28.11.2008
    Beiträge
    149
    Bedankte sich
    22
    Erhielt 4 Danksagungen
    in 4 Beiträgen

    Standard JTable vs. JModel

    Hallo,

    ich möchte an dieser Stelle eine kleine Kritik an der Joomla-Komponenten API anbringen.

    1.) Mit JTable baue ich im Prinzip eine DB-Tabelle nach. Prinzipiell könnte man diese Daten ja auch aus den Metadaten der Datenbank bestimmen. Eigentlich unnötiger Programmieraufwand.

    2.) JTable und JModel widersprechen sich leider ein wenig. Während JModel einen beliebigen Zugriff auf die Datenbank erlaubt (mit JOINs über mehrere Tabellen), ist JTable wohl nur auf einzelne Tabellen beschränkt.

    Das hat zur Folge, dass ich JTable nur für sehr einfach Zugriffe brauchen kann, also Queries ohne JOIN in der Art (in Single Views):

    Code:
    $row =& JTable::getInstance('<MySimpleTable>', 'Table');
    		$cid = JRequest::getVar( 'cid', array(0), '', 'array' );
    		$id = $cid[0];
    		$row->load($id);
    Es wäre schön, wenn es hierfür ein Replacement gäbe, das hier auch komplexere Zugriffe erlauben würde.

    JTable hat ja leider nur den einfachen Constructor

    Code:
    JTable  __construct  (string $table, string $key,  &$db, object $db)
    Wäre es hier an dieser Stelle vielleicht sinnvoll, sich für solche komplexeren Zugriffe jeweilige Klassen von JTable abzuleiten? Es gibt im Prinzip beim DB-Entwurf ja eh immer die gleichen Pattern, die sich auf die Relationen zurückführen lassen.

    Was mir persönlich gar nicht gefällt, ist je ein Model für den Zugriff auf ein Element und eins für die ganze Liste zu instanttieren (vgl. EventList).

    In Summa: JTable sieht zwar smart aus, leistet aber nicht, was es eigentlich können sollte.

    Vielleicht hat ja jemand eine Codestelle, die das widerlegt?

    Gruß, Joomlix

  2. #2
    Verbringt hier viel Zeit
    Registriert seit
    24.01.2006
    Beiträge
    594
    Bedankte sich
    108
    Erhielt 359 Danksagungen
    in 203 Beiträgen

    Standard

    Zitat Zitat von joomlix Beitrag anzeigen
    ich möchte an dieser Stelle eine kleine Kritik an der Joomla-Komponenten API anbringen.
    Dann bist du hier prinzipiell falsch zur Kritik gehts hier lang.

    Zitat Zitat von joomlix Beitrag anzeigen
    1.) Mit JTable baue ich im Prinzip eine DB-Tabelle nach. Prinzipiell könnte man diese Daten ja auch aus den Metadaten der Datenbank bestimmen. Eigentlich unnötiger Programmieraufwand.
    Wird in 1.6 so gehandhabt.

    Zitat Zitat von joomlix Beitrag anzeigen
    2.) JTable und JModel widersprechen sich leider ein wenig. Während JModel einen beliebigen Zugriff auf die Datenbank erlaubt (mit JOINs über mehrere Tabellen), ist JTable wohl nur auf einzelne Tabellen beschränkt.
    Falsch, diese zwei Klassen stehen nicht in Konkurrenz zueinander. Wenn du von irgendwo einen Datenbankzugriff (lesen oder schreiben) machst, dann nutzt du immer JModel, niemals direkt JTable. Innerhalb JModel steht dir dann bei Bedarf JTable ($this->getTable()) holen und nutzen.

    JTable selbst ist dann (wie der Name es verrät) für genau eine Tabelle verantwortlich. Auf diese Tabelle kannst du nun mittels JTable deine gewünschten Datenbankoperationen ausführen (meistens Speichern, manchmal Lesen)

    Zitat Zitat von joomlix Beitrag anzeigen
    Was mir persönlich gar nicht gefällt, ist je ein Model für den Zugriff auf ein Element und eins für die ganze Liste zu instanttieren (vgl. EventList).
    Zu instanzierst eigentlich kein Model (oder habe ich dich falsch verstanden?). Du schreibst halt für zwei verschiedene Aufgaben zwei verschiedene Methoden (siehe hier). Willst du nur genau einen Eintrag aus der Datenbank lesen, kannst du es in etwa so lösen:

    PHP-Code:
    public function getFoo() {
        
    $this->_loadFoo();
        return 
    $this->_foo;
    }

    private function 
    _loadFoo() {
        if (empty(
    $this->_foo) {
            
    $id JRequest::getInt('id');
            
    $table $this->getTable('FooTable');
            if (
    $table->load($id)) {
                
    $this->_foo $table;
            }
            else {
                
    $this->_foo false;
            }
        }
        return 
    true;

    Zitat Zitat von joomlix Beitrag anzeigen
    In Summa: JTable sieht zwar smart aus, leistet aber nicht, was es eigentlich können sollte.
    Mein Fazit ist: JTable leistet genau das was es soll: Das Manipulieren und Auslesen von genau einer Tabelle.
    Geändert von bembelimen (17.08.2010 um 21:38 Uhr)

  3. Erhielt Danksagungen von:


  4. #3
    War schon öfter hier
    Registriert seit
    28.11.2008
    Beiträge
    149
    Bedankte sich
    22
    Erhielt 4 Danksagungen
    in 4 Beiträgen

    Standard

    Zitat Zitat von bembelimen Beitrag anzeigen
    Dann bist du hier prinzipiell falsch zur Kritik gehts hier lang.
    Danke für den Hinweis
    Zitat Zitat von bembelimen Beitrag anzeigen
    Wird in 1.6 so gehandhabt.
    Gut so.

    Zitat Zitat von bembelimen Beitrag anzeigen
    Falsch, diese zwei Klassen stehen nicht in Konkurrenz zueinander. Wenn du von irgendwo einen Datenbankzugriff (lesen oder schreiben) machst, dann nutzt du immer JModel, niemals direkt JTable. Innerhalb JModel steht dir dann bei Bedarf JTable ($this->getTable()) holen und nutzen.
    Vielleicht sollte ich das PACKT-Ebook wieder löschen? Dort ist genau mein angegebenes Beispiel zu finden. Ich denke aber, die Methode "instance()" wird es ja nicht umsonst geben !?!
    Zitat Zitat von bembelimen Beitrag anzeigen
    JTable selbst ist dann (wie der Name es verrät) für genau eine Tabelle verantwortlich. Auf diese Tabelle kannst du nun mittels JTable deine gewünschten Datenbankoperationen ausführen (meistens Speichern, manchmal Lesen)



    Zu instanzierst eigentlich kein Model (oder habe ich dich falsch verstanden?). Du schreibst halt für zwei verschiedene Aufgaben zwei verschiedene Methoden (siehe hier). Willst du nur genau einen Eintrag aus der Datenbank lesen, kannst du es in etwa so lösen:

    PHP-Code:
    public function getFoo() {
        
    $this->_loadFoo();
        return 
    $this->_foo;
    }

    private function 
    _loadFoo() {
        if (empty(
    $this->_foo) {
            
    $id JRequest::getInt('id');
            
    $table $this->getTable('FooTable');
            if (
    $table->load($id)) {
                
    $this->_foo $table;
            }
            else {
                
    $this->_foo false;
            }
        }
        return 
    true;

    Mein Fazit ist: JTable leistet genau das was es soll: Das Manipulieren und Auslesen von genau einer Tabelle.

    JTable hätte ich persönlich unabhängiger von JModel gesehen wie Du.
    Dass es einen Zugriff aus JModel auf JTable gibt, sagt ja per se gar nichts aus.
    Ich werde mir aber diesbezüglich mal genauer die Joomla-Library ansehen.

  5. #4
    Verbringt hier viel Zeit
    Registriert seit
    24.01.2006
    Beiträge
    594
    Bedankte sich
    108
    Erhielt 359 Danksagungen
    in 203 Beiträgen

    Standard

    Zitat Zitat von joomlix Beitrag anzeigen
    Vielleicht sollte ich das PACKT-Ebook wieder löschen? Dort ist genau mein angegebenes Beispiel zu finden. Ich denke aber, die Methode "instance()" wird es ja nicht umsonst geben !?!

    JTable hätte ich persönlich unabhängiger von JModel gesehen wie Du.
    Dass es einen Zugriff aus JModel auf JTable gibt, sagt ja per se gar nichts aus.
    Ich werde mir aber diesbezüglich mal genauer die Joomla-Library ansehen.
    Das liegt einfach daran, dass Joomla! manchmal recht schwammig das MVC Prinzip umgesetzt hat und es diverse "Abkürzungen" gibt, ob die aber sauber sind, muss jeder selbst entscheiden.

  6. #5
    War schon öfter hier
    Registriert seit
    28.11.2008
    Beiträge
    149
    Bedankte sich
    22
    Erhielt 4 Danksagungen
    in 4 Beiträgen

    Standard

    Zitat Zitat von bembelimen Beitrag anzeigen
    Das liegt einfach daran, dass Joomla! manchmal recht schwammig das MVC Prinzip umgesetzt hat und es diverse "Abkürzungen" gibt, ob die aber sauber sind, muss jeder selbst entscheiden.
    Ich glaube auch, dass gerade diese Schwammigkeit den Änfängern enorme Schwierigkeiten bereitet. Ich habe mir einmal RubyOnRails angesehen, da ist wirklich alles stringenter.

    Ich freue mich auf weitere Diskussion mit Dir hier im Forum

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein