Wie bekommt die View die Daten vom Model?

  • Servus miteinander,
    nachdem mir nichts mehr einfällt, die sicherlich total simple Frage ans Forum.
    Ich will eine Komponente entwickeln, in der zwei Abfragen erfolgen sollen. Zum einen werden alle Daten abgerufen, zum zweiten möchte ich den größten Wert einer Kategorie ermitteln.
    Im Model habe ich mir das so vorgestellt:

    Code
    class KursplanungModelKursplanung extends JModelList{    protected function getListQuery()    {        $db = $this->getDbo();        $query = $db->getQuery(true);        $query->from('#__kursplanung');        $query->select('*');        return $query;    }    protected function einWert()    {        $db = $this->getDbo();        $query = $db->getQuery(true);        $query->select('MAX("endeJahr")');        $query->from('#__kursplanung');        return $query;    }}


    Die View dazu schaut folgedermaßen aus:

    Code
    class KursplanungViewKursplanung extends JViewLegacy
    {
        protected $items;
    
        function display($tpl = null)
        {
            $this->items = $this->get('Items');
            parent::display($tpl);
        }
    }


    Alle Daten kann ich problemlos anzeigen lassen, was muss ich wie und wo machen, um auf den einzelnen Wert der zweiten Abfrage zugreifen zu können.
    Herzlichen Dank für alle nützlichen Hinweise
    Bertl

  • Guten Abend,


    ich würde es wie folgt abhandeln.
    würde dann etwa wie folgt aussehen:

    Code
    class KursplanungModelKursplanung extends JModelList
    {
        protected function getListQuery()
        {
            $db = $this->getDbo();
            $query = $db->getQuery(true);
    $query->select(array('xyz', 'MAX("endeJahr") AS endJahr')); 
    ->from($db->quoteName('#__kursplanung'));
            return $query;
        }


    //xyz steht hierbei für alle Spalten die sie benötigen.
    um nun das größte Endjahr auszulesen verwendest du in deinem TMPL $row->endJahr; .


    Ich hoffe dies löst ihr Problem, falls es dies nicht tut, habe ich noch eine andere Variante zur Verfügung.


    Mit freundlichen Grüßen
    Jonas

  • Hi Jonas,
    erstmal vielen Dank für die Unterstützung, leider komme ich damit noch nicht weiter. Im Einzelnen:

    • in Deinem Code Zeile 8, fehlt da am Anfang $query?
    • bisher konnte ich mit folgendem Code auf die gesamte Abfrage zugreifen:
    • PHP
      <table>
      
      
      <?php foreach ($this->items as $item) : ?>
      <tr>    
          <td><?php echo $item->kurs; ?></td>
      </tr>
      <?php endforeach; ?>
      </table>


    • das geht jetzt nicht mehr, der Zugriff über $this->items ist nicht mehr möglich.
    • Hier die Fehlermeldungen zur Ausgabe: echo $row->endJahr;
    • Zitat

      Notice: Undefined variable: row in C:\Users\Bertl1\Documents\xampp\htdocs\j341neu\components\com_kursplanung\views\kursplanung\tmpl\default.php on line 83Notice: Trying to get property of non-object in C:\Users\Bertl1\Documents\xampp\htdocs\j341neu\components\com_kursplanung\views\kursplanung\tmpl\default.php on line 83



    Gibt es eine Idee, was ich wie anders machen könnte.


    Vielen Dank
    Bertl

  • Wie du richtig vermutest musste es eher so heissen(obwohl das nicht wirklich schön ist):


    Code
    $query->select(array('*', 'MAX("endeJahr") AS endJahr'))->from($db->quoteName('#__kursplanung'));


    In deinem code musst du aber immer den Fall abfangen dass $this->items leer ist. Sonst gibts eben diese Fehlermeldung: Trying to get property of non-object


    Die zweite Meldung: $row ist nicht definiert. Du musst schon $this->items abfragen. Vielleicht so:

    Code
    $endjahr = !empty($this->items) ? $this->items[0]->endeJahr : 0;



    Disclaimer: nicht getestet

  • Danke Christiane für die Hinweise,


    Der Code

    Code
    $query->select(array('*', 'MAX("endeJahr") AS endJahr'))->from($db->quoteName('#__kursplanung'));


    führt dazu, dass mir nur ein Datensatz angezeigt wird (an der Schleife foreach habe ich nichts verändert). Keine Ahnung, was ich da jetzt falsch mache.
    $endjahr ist leer, jedenfalls wird mir nichts angezeigt.


    So richtig verstehe ich die Denke des MCV nicht. Wieso kann ich nicht einfach eine zweite Abfrage machen, das Ergebnis durchreichen und darauf zugreifen. Mir würde die Lösung viel einfacher erscheinen, als alles in ein Array zuverpacken und dann nicht dranzukommen ?(
    Freue mich auf weitere Anregungen.
    Gruß Bertl

  • Zitat

    So richtig verstehe ich die Denke des MCV nicht. Wieso kann ich nicht einfach eine zweite Abfrage machen, das Ergebnis durchreichen und darauf zugreifen. Mir würde die Lösung viel einfacher erscheinen, als alles in ein Array zuverpacken und dann nicht dranzukommen


    Es hat nichts mit MVC zu tun. Eher mit Objektorientiert. Ist aber viel zu erklären. Das $this->get('Items') ruft ja eine Methode der Elternklasse JModelList auf. Deshalb gibst du bei getListQuery() nur ein query-Objekt zurück, und die paren-klasse macht den eigentlichen Datenbankzugriff.


    Deine zweite Abfrage ist in der parent-klasse nicht enthalten. Dort musst du die query selber ausführen und das Ergebnis zurück geben.


    Code
    public function einWert()    {        $db = $this->getDbo();        $query = $db->getQuery(true);        $query->select('MAX("endeJahr")');        $query->from('#__kursplanung');$db->setQuery($query);$result = $db->loadResult();        return $result;    }


    und in der view:


    Code
    $endjahr = $this->einWert();
  • Danke Christiane, dass Du noch Geduld aufbringst. Anbei meine rudimentären Ansätze. Der Gedanke ist folgender. In einem Balkendiagramm sollen die Kurse über die entsprechenden Monate angezeigt werden. Beginnend immer ab dem aktuellen Monat und endend mit dem letzten Kurs + z. B. drei Monate. Dafür wollte ich dieses Maxwert haben. Die Datei gibts hier https://www.dropbox.com/s/7uwu…/com_kursplanung.zip?dl=0
    , habe nicht herausgefunden, wie ich Dateien hier hochladen kann.
    Gruß Bertl

  • Guten Morgen Christiane,


    vielen Dank für Deine Mühe. Nachdem ich die beiden Dateien ausgetauscht habe erhalte ich folgende Fehlermeldung:

    Zitat

    Fatal error: Call to undefined method KursplanungViewKursplanung::endJahr() in C:\Users\Bertl1\Documents\xampp\htdocs\j341neu\components\com_kursplanung\views\kursplanung\view.html.php on line 12


    Für mich ist die Meldung auch klar, da mir das grundlegende Verständnis fehlt: Was hat die Funktion einWert() mit $endJahr zu tun?
    Ich gebe jetzt mal auf und löse das ganze erstmal über eine feste Laufzeit (3 Jahre ab Monatsdatum).


    Viele Grüße


    Bertl


    PS: kommen zu den Joomla Stammtischen in München nur Profis oder gibt es dabei auch Anfänger?

  • Da hast du natürlich recht, ich war schon zu lang im Dienst ;) Aber trotzdem lerne die Grundlagen der objektorientierten Programmierung sonst kommst du nicht weit.
    Also nenn die Methode so:


    Code
    public function getEndJahr()


    und ruf sie so:


    Code
    $this->endJahr = $this->get('EndJahr')


    Zur JUG München sind gerade Anfänger eingeladen und willkommen!

  • Hallo Christiane,
    eine kleine Nachfrage hat sich noch ergeben.
    Wenn ich statt einem Wert, zwei Werte haben will, dann müsste dies doch mit folgender veränderter Abfrage gehen (loadRow() statt loadResult()):


    Es gelingt mir aber nicht, dann auf die Daten zuzugreifen. Alle meine Versuche scheitern an:

    Zitat

    Undefined variable: endJahr in oder
    Undefined property


    Es tut auch eine Anregung ...


    Viele Grüße Bertl

  • Guten Morgen,


    statt der Abfrage:
    alt: $query->select('MAX(endeJahr);
    neu: $query->select('MAX(endeJahr),id, endeMonat');


    und statt
    alt: $result = $db->loadResult();
    neu: $result = $db->loadRow();


    Wenn ich es richtig verstanden habe, liefert loadResult() nur einen Wert, loadRow() dagegen einen Datensatz. Aber wie komme ich jetzt an die einzelnen Werte heran.


    Viele Grüße


    Bertl

  • Schade dass @Re:Later nicht da ist, er erklärt gerne ;) Nun, wenn du das wirklich willst, was in deiner Query steht, wo ich nicht so sicher bin:


    Was gibt dir loadRow() zurück? Ein Array.

    Zitat


    Method to get the first row of the result set from the database query as an array. Columns are indexed numerically so the first column in the result set would be accessible via $row[0], etc



    Also bekommst du deine Werte als $result[0] usw.

  • Auch wenn Du es nicht glaubst (und mich vielleicht für ... hältst, selbstverständlich hatte ich diese Version schon ausprobiert):
    die Meldung lautet:

    Code
    Notice: Undefined variable: result in C:\Users\Bertl1\Documents\xampp\htdocs\j341neu\components\com_kursplanung\views\kursplanung\tmpl\default.php on line 67


    Gruß Bertl