2016-05-14 10 views
2

Joomla-Komponenten verwenden das MVC-Modell. Component Creator ist ein weit verbreitetes Tool, dessen bezahlte Ebene die Erstellung von Multi-Table-Views mit SQL-Import unterstützt. Entwickler bauen auch Komponenten von Grund auf neu nach Joomla-Dokumentation.Wie kann ich mehrere Modelle in einer Ansicht für eine Joomla 3.x-Komponente enthalten, die mit Component Creator erstellt wurde

Ich möchte eine erweiterte Komponente erstellen, die als "Dashboard" Daten aus mehreren Datenbanktabellen mit allen Administrator-Back-End-und Besucher-Front-End-CRUD (CREATE, READ, UPDATE, DELETE) Funktionen von Joomla. Dies bedeutet, dass ich mehrere Modelle (aus der MVC-Philosophie) brauche, die aus mehreren Datenbanktabellen auf dem Bildschirm gleichzeitig zeichnen.

Joomla Documentation schlägt folgende Code in das „Controller-Task-Verfahren“ eingesetzt werden, um die Informationen zur Verfügung stellen:

$view = $this->getView('model-a', 'html'); 
$view->setModel($this->getModel('model-a'), true); 
$view->setModel($this->getModel('model-b')); 
$view->display(); 

und rufen dann später auf den Modellen mit den in den Ansichten anzeigen Methode:

Diese in der Joomla-Dokumentation enthaltenen Anweisungen sind jedoch nicht ausreichend oder nicht kompatibel mit der Komponente, die beim Ausführen des bereitgestellten Joomla Hello World Tutorial-Lernprogramms oder von Komponenten aus dem Handbuch erstellt wurde y verwendetes und beliebtes Tool zum Erstellen von Komponenten. Entweder lädt die Komponente die Seite nicht, wenn sie aufgerufen wird, oder sie gibt die Daten nicht einfach mit einer einfachen Kopie an die Ansicht weiter und fügt sie in einen der mehreren Controller ein, die vom Komponenten-Ersteller oder vom Joomla Hallo Welt-Lernprogramm erstellt wurden.

Wie kann ich mehrere Modelle in derselben Ansicht für eine Joomla 3.X-Komponente aufrufen?

+0

Sie können jedes Modell innerhalb der Ansicht aufrufen, indem Sie $ modell = JModel :: getInstance ('MODEL_NAME', 'COMPONENT_NAME') verwenden; $ items = $ modell-> getItems(); Die Verwendung der Syntax -> get ('items') ist nur in einer Ansicht gültig (da get() eine Methode der View-Klasse ist) –

+0

@Amit Ray 'JModel' funktioniert nicht, aber' JModelLegacy' funktioniert mit Joomla 3.5.1 . Wenn ich 'JModel' verwende, erhalte ich den folgenden Fehler in meinen Serverprotokollen:' PHP Fataler Fehler: Aufruf zu undefinierter Methode JModel :: getInstance() in/var/www/html/components/com_komponentenname/views/multiviewname/view. html.php'. JModelLegacy wirft den Fehler nicht und die Seite wird ordnungsgemäß geladen. –

+0

Sorry mein Fehler, ich habe den Legacy-Teil vergessen. Aber hat das das Problem gelöst? –

Antwort

2

Ich konnte erfolgreich mehrere Modelle aus der gleichen Sicht verwenden, indem Sie direkt in den zwei Ansicht Dateien zu ordnungsgemäß gebildeten Modellen aufrufen. Ich habe die Joomla-Dokumentation nicht befolgt, weil ich keinen der möglichen Controller geändert habe (einer ist der Controller für die gesamte Komponente und der andere Controller ist View-spezifisch). Ich habe auch nicht die in der Joomla-Dokumentation bereitgestellten Funktionen verwendet, da diese Fehler erzeugt haben.

Laut richtigen Joomla MVC Konvention ist eine Ansicht, die von zwei Dateien in der jeweiligen Ansicht Verzeichnis und Unterordner erstellt:

  • /site/views/multiviewname /view.html.php (die vergeht Modell der Ansicht)
  • /site/views/multiviewname /tmpl/default.php (die die HTML-Vorlage hat)

diese dat anzuzeigen geändert werden Beide brauchen a von mehr als einem Modell zur gleichen Zeit. Dies funktioniert unter der Annahme, dass alle anderen Ansichten, Controller und Modelle ordnungsgemäß erstellt wurden, wie dies bei Verwendung des Tools "Komponenten-Creator" automatisch geschieht. Meine Komponente hatte Hunderte von Dateien, einschließlich CSS, Back-End-Verwaltung, Installation, Sprache, etc. Alle diese wurden in Momenten mit der Komponente Creator Tool erstellt.

Der gekürzte, aber immer noch voll funktionsfähig Code ist wie folgt:

/site/views/multiviewname /view.html.php

<?php 

jimport('joomla.application.component.view'); 

class ComponentnameViewMultiviewname extends JViewLegacy 
{ 
// $items is for the default model 
    protected $items; 
// $ItemsOtherModel is for second model. Notice the '$' used here but not elsewhere 
    protected $ItemsOtherModel; 

    public function display($tpl = null) 
    { 
     $app = JFactory::getApplication(); 
     $this->state = $this->get('State'); 
     $this->items = $this->get('Items'); 
     $this->pagination = $this->get('Pagination'); 
     $this->params  = $app->getParams('com_componentname'); 

// sets default model 
     $this->setModel($this->getModel('model-a'), true); 
// sets second model & uses 'JModelLegacy,' contrary to documentation 
     $this->setModel(JModelLegacy::getInstance('model-b', 'componentnameModel')); 
// assigns array from the second model to 'ItemsOtherModel.' there is no '$' sign used. 
     $this->ItemsOtherModel = $this->get('Items','model-b'); 

     parent::display($tpl); 
    } 

} 

/site/views/multiviewname /tmpl/default.php

<?php 

echo "<h3>Items from default model</h3> "; 
echo var_dump($this->items); 

echo "<h3>items from secondary model</h3> "; 
// notice that the '$' is absent from 'ItemsOtherModel' 
echo var_dump($this->ItemsOtherModel); 

Dieser Durchbruch nach Tagen der Forschung nur möglich war. Das bezahlte Tool Component Creator war von unschätzbarem Wert, um mich mit wohlgeformtem Code zu starten, der den Joomla MVC-Komponentenstandards entspricht. Nach der Arbeit mit und der Überprüfung aller Dateien für Tage, fand ich die Eingabeaufforderung, die ich in this google groups thread benötigt, meine Aufmerksamkeit auf die JModelLegacy Klasse, gefunden bei der Suche google nach Begriffen aus der PHP Fehlermeldung PHP Notice: Undefined index: links auf meinem Server beim Versuch, die zu verwenden offiziell dokumentierte Methoden.

Diese Seite, die im Browser gerendert wird, löscht einfach alle Informationen von der Datenbanktabelle zur Seite, aber die weitere Entwicklung kann das formatierte und funktionale Dashboard erzeugen, das ich letztendlich benötigen werde.

Dieser Code dient zum Anzeigen von Informationslisten im Gegensatz zu mehreren einzelnen Elementen. Die Joomla-Dokumentation zum Hinzufügen mehrerer Modelle zu einer Ansicht ist für mehrere einzelne Elemente anstelle von Arrays von Elementen eingerichtet, die hier gezeigt werden.