+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Übergeben von einer Variablen von einer View in ein neues Model

  1. #1
    Neu an Board
    Registriert seit
    24.04.2010
    Beiträge
    7
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard Übergeben von einer Variablen von einer View in ein neues Model

    Hallo!

    Da ich ein "Neuling" im Bereich Joomla!-Komponenten-Programmierung bin und auch in PHP nicht zu 100% sattelfest bin, stehe ich jetzt an einem Punkt wo ich leider nicht mehr weiter komme.

    Allgemein:
    Wir programmieren derzeit eine Joomla! Komponente für die Landesmusikschule wo wir ein eigenes Datenmodell in die Joomla! Datenbank integriert haben und dort unsere Daten abspeichern.

    Mein Problem:
    Für das Frontend habe ich jetzt eine View entwickelt die alle Lehrer aus einer Tabelle ausliest. Diese funktioniert jetzt auch schon so weit. Weiters habe ich einen Link auf jede einzelne Zeile in der Tabelle gelegt (
    Code:
    $link = JRoute::_( 'index.php?option=com_mso&view=lehrerdetail&layout=lehrerdetail&Itemid='. $lehrer->lehrerID );
    ). Wenn man auf diesen klickt sollte man dann in eine neue View kommen wo die Details des Lehrers angezeigt werden (Foto, Werdegang, etc).

    Mein Problem ist jetzt, dass ich im Model "lehrerdetail" die ID aus der URL benötige.
    mit den Funktionen "$_GET('Itemid')" bzw "<?php var_dump(JRequest::getInt('Itemid')); ?>" funklioniert das Auslesen leider nur in der neuen View.

    Ich benötige aber diese ID im Model z.B. in der Funktion getLehrerDetailLehrer.
    Hier habe ich schon probiert die id als Übergabeparameter zu übergeben und diese mit den oben genannten Funktionen in der view.html.php auszulesen. Das hat aber leider auch nicht funktioniert.

    Code:
    function getLehrerDetailLehrer($id) {
    		$db =& JFactory::getDBO();
    		$query = 'SELECT
          				LehrerID,
          				LVorname,
          				LNachname,
          				LTitel,
          				LFotopfadgr
          			FROM
          				mso_Lehrer
          			WHERE
          				LehrerID = ' . $id . ';';
    
    		$db->setQuery( $query );
    		$lehrerdetaillehrer = $db->loadObjectList();
    		return $lehrerdetaillehrer;
    	}

    Ich hoffe ich habe mein Problem ausführlich genug beschrieben und hoffe ihr könnt mir schnell helfen.
    Danke schon im Voraus.

    lg

  2. #2
    Hat hier eine Zweitwohnung
    Registriert seit
    14.01.2006
    Ort
    Nienburg
    Alter
    32
    Beiträge
    1.237
    Bedankte sich
    115
    Erhielt 471 Danksagungen
    in 368 Beiträgen

    Standard

    schaut euch die weblinks komponente im backend an. insbesondere das model. es ist zwar auch in der weblinks komponente nicht alles optimal geloest, allerdings ist sie die sauberste der in joomla integrierten komponenten.
    weiterhin, uebertreibt es nicht mit den views und layouts. es ist zwar gut vorzugeben was wie wo wann genau passiert, allerdings kann und darf man sich bestimmte eigenheiten zu nutze machen. das vereinfacht die arbeit ein wenig.

    beispiel: com_auflistung => standard view ohne angabe einer view = "auflistung". fuer diese view wird angenommen, dass das standard model ebenfalls "auflistung" heisst, und sofern dazu eine jtable instanz benoetigt wird, reicht spaeter $table = $this->getTable(); // $table->load() etc.
    das zu ladende layout ist, wenn nicht anderweitig festgelegt immer default.php. auch wenn es nicht falsch ist hier bereits ein anderes als das default layout zu nutzen, in der praxis hat es sich (zumindest fuer mich) bewaehrt, nur dann explizit layouts zu laden, wenn diese auch gebraucht werden.
    das ist natuerlich geschmackssache und wenn in eurem beispiel mehrere layouts fuer die view "lehrerdetail" zur verfuegung stehen sollen, ist das selbstverstaendlich nicht falsch. ist das standard verhalten der view lediglich die detailansicht und existiert im besten fall nur noch ein form layout, kann man sich wieder eingige abfragen sparen.

    ich hab jetzt leider ein wenig weit ausgeholt - eventuell ist euch das auch alles bereits bekannt.
    kurz: id (nicht itemid) im constructor des models ueber jrequest holen. (siehe weblinks model constuctor) hier sind wir dann auch an der stelle auf die ich eigentlich hinaus wollte. vorsicht beim verwenden von &Itemid statt &id ! Itemid wird als variable zur identifizierung eines menuelinks verwendet und einigen urls angehangen. es kann also passieren das die von euch erwartete id nicht der entspricht, die in der url steht bzw. dann im model verwendet wird.

    abschliessend: im model steht bereits eine jdatabase instanz bereit => $this->_db (JFactory::getDBO(); ist ueberfluessig)
    weitere informationen: http://api.joomla.org/Joomla-Framewo...on/JModel.html

  3. #3
    Neu an Board
    Registriert seit
    24.04.2010
    Beiträge
    7
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Dankesehr für die schnelle Antwort. :-)

    wenn ich dich jetzt richtig verstanden habe dann sollte mein model "lehrerdetails" etwa so aussehen:

    Code:
    class MsoModelLehrerDetail extends JModel {
    
    	var $_id = null;
    	
    	function __construct()
    	{
    		parent::__construct();
    
    		$id = JRequest::getVar('Teacherid',  0, '', 'int');
    		$this->setId((int)$id);
    	}
    
    	function setId($id)
    	{
    		$this->_id		= $id;
    	}
    
    	function getLehrerDetailLehrer() {
    		$db =& JFactory::getDBO();
    		$query = 'SELECT
          				LehrerID,
          				LVorname,
          				LNachname,
          				LTitel,
          				LFotopfadgr
          			FROM
          				mso_Lehrer
          			WHERE
          				LehrerID = ' . $this->_id . ';';
    
    		$db->setQuery( $query );
    		$lehrerdetaillehrer = $db->loadObjectList();
    		return $lehrerdetaillehrer;
    	}
    
            ... [weitere Funktionen]
    
    }

    und die dazugehörige View "lehrerdetail" :


    Code:
    <table width="50  %">
    <?php var_dump($lehrerdetaillehrer); ?>
    <?php var_dump($lehrerdetailwerdegang); ?>
    <?php var_dump($lehrerdetailaktivitaet); ?>
    <?php var_dump($lehrerdetailfach); ?>
    <?php var_dump(JRequest::getInt('Teacherid')); ?>
    	<tr>
    		<td>&nbsp;<?php echo $lehrerdetaillehrer->LFotopfadgr;?></td>
    		<td align="center">&nbsp;<?php echo $lehrerdetaillehrer->LVorname;?>
    		&nbsp;<?php echo $lehrerdetaillehrer->LNachname; ?></td>
    	</tr>
    ...
    wobei die var_dump oben nur zum Testen verwendet werden.
    und leider wird jetzt bei diesen Tests immer null ausgegeben... außer beim letzten (JRequest) hier liefert es mir die richtige ID zurück.
    doch ich kann sie leider nicht im Model verwenden.

    Wenn die "view.html.php" noch benötigt wird um das Problem zu lösen:

    Code:
    class MsoViewLehrerDetail extends JView
    {
    	function display($tpl = null) { 
    	     $model =& $this->getModel();
    	     
    	     $lehrerdetaillehrer = $model->getLehrerDetailLehrer(); 
    	     $lehrerdetailwerdegang = $model->getLehrerDetailWerdegang();
    	     $lehrerdetailaktivitaet = $model->getLehrerDetailAktivitaet();
    	     $lehrerdetailfach = $model->getLehrerDetailFach();
    	    
    	     $this->assignRef( 'lehrerdetaillehrer', $lehrerdetaillehrer); 
    	     $this->assignRef( 'lehrerdetailwerdegang', $lehrerdetailwerdegang);
    	     $this->assignRef( 'lehrerdetailaktivitaet', $lehrerdetailaktivitaet);
    	     $this->assignRef( 'lehrerdetailfach', $lehrerdetailfach);
    
    	     parent::display($tpl); 
    	} 
    }

    Wenn ich diese Komponente dann in meinem Joomla! teste, dann steht in der URL oben zwar die richtige ID, kann sie aber leider im Model nicht auslesen...

    Ich würde mich sehr über weitere Tips freuen.
    Danke schon im Voraus für eure Hilfe. :-)




    lg

  4. #4
    Joomla Guru Avatar von elkuku
    Registriert seit
    14.06.2006
    Ort
    Guayaquil - Südamerika
    Beiträge
    1.689
    Bedankte sich
    74
    Erhielt 517 Danksagungen
    in 397 Beiträgen

    Standard

    Puh.. da weiss man immer gar net wo anfangen glaub der matrikular hat auch schon alles geschrieben.. Ich kann ja noch ein bissi Code beisteuern.. also

    idR hast Du in Deinem Model (das Model) eine Funktion mit dem Name z.Beispiel getData()
    model.php
    PHP-Code:
    function getData()
    {
       
    /*
        * Merke: interger values holt man mit getInt()
        */
       
    $id JRequest::getInt('Teacherid'); 

       
    //.. Database Query blabla...

       
    $data $db->loadObjectList()
       
       return 
    $data;

    Dann kommt in wenig Joomla! magic und du bekommst in Deinem View (der View) mit $this->get('data'); diese Funktion des Models aufgerufen.
    view.html.php
    PHP-Code:
    function display()
    {
       
    //-- Die Daten über die Funtion getData() des Models holen
       
    $data $this->get('data');

       
    //-- Die Daten dem View übergeben
       
    $this->assignRef('data'$data);

       
    //-- ODER
       
    $this->data $this->get('data');

       
    parent::display();

    Danach kannst Du in Deinem Template darauf über das $this Objekt der Viewklasse in dem es sich befindet zugreifen
    default.php
    PHP-Code:
    echo $this->data->LVorname;

    // oder auch mal
    var_dump($this->data); 
    Das wärs soweit.. ah - Warum machst Du das ganze mit Lehrern und nicht mit hübschen Mitschülerinnen ? Ist das 'ne Vorgabe ?

    Für PHP code hier im Forum nimmst Du am besten das Knöpfchen mit dem PHP drauf - dann wird's bunter..

    Bei weiteren Fragen kannst Du auch gerne einmal im Wiki vorbeischauen und vielleicht auch etwas mitschreiben http://wiki.joomla-nafu.de
    Gruß,
    Nikolai
    Hilf mit: Deutsche Joomla! Dokumentation Help testing: EasyCreator Noch Fragen ? Forum.Joomla-Nafu.de

  5. #5
    Moderator Avatar von Lacki
    Registriert seit
    27.04.2006
    Ort
    Direkt um die Ecke
    Beiträge
    8.739
    Bedankte sich
    337
    Erhielt 3.614 Danksagungen
    in 2.973 Beiträgen

    Standard

    Thema gehört aber eindeutig nicht in "Joomla 1.5 - Komponenten" sondern "Entwicklungsumgebung Joomla 1.5 - Komponenten", habe es mal verschoben.

  6. #6
    Neu an Board
    Registriert seit
    24.04.2010
    Beiträge
    7
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    ja ich wusst leider auch nicht wo ich anfangen sollte
    aber wie gesagt... bin ein php-Neuling :-)

    Danke fürs verschieben.

    Ja das mit den Lehrern ist vorgegeben da es, wie schon erwähnt als Projekt für die Landesmusikschule gedacht ist.

    Danke für eure Hilfe, habe is damit geschafft die Daten auszulesen, nur jetzt komme ich zum nächsten für mich unerklärlichen Problem.

    mit var_dump teste ich meine ausgelesenen Daten und es gibt mir auch etwas zurück.

    PHP-Code:
    array
      
    => 
        
    object(stdClass)[127]
          public 
    'Werdegangbez' => string 'Studium am Bruckner - Konservatorium Linz ' (length=42
    nur leider ist das nicht alles...!

    richtig wäre:

    Studium am Bruckner - Konservatorium Linz – staatliche Lehrbefaehigungspruefung im Hauptfach Blockfloete\n
    Leiter der Landesmusikschule Grein 1994 – 1998\n
    Autor von Literatur fuer Blockfloete\n
    Cembalobauer mit internationaler Reputation seit 1986

    ... es stoppt also genau bei " - ".
    der Datentyp den ich in der Datenbank für das verwende ist varchar(1000). Ich habe es auch schon mit longtext probiert, nur da stieß ich auf das selbe Problem.

    Dann ist mir aufgefallen das immer wenn im Text ein 2. Bindestrich ist, gestoppt wird.
    Jetzt habe ich den Bindestrich nach "Linz" gelöscht, und siehe da, es wird bis "... 1994 " ausgelesen.
    Warum ist das so?



    Edit:

    Weiters stoße ich auf das Problem, dass wenn ich in meinem Model bei der Funktion in der ich die zugehörigen Fächer zum Lehrer zuordne, immer noch
    PHP-Code:
    null 
    zurückbekomme.
    Liegt hier ein Problem mit dem "Aliasing" vor? - Denn das habe ich in meine anderen, funktionierenden, Funkltionen nicht verwendet.

    Wenn ich diese Funktion ganz normal in meiner Kommandozeile auf der DB teste, also als $id eine ID von einem Lehrer einsetze, bekomme ich das richtige Ergebnis.


    Funktion im Model:

    PHP-Code:
    function getLehrerDetailFach() {
            
    $db =& JFactory::getDBO();
            
    $id JRequest::getInt('Teacherid');
            
    $query4 'SELECT
                       f.Fachbez
                      FROM
                          mso_Fach as f,
                          mso_Lehrer_Fach as lf,
                          mso_Lehrer as l
                      WHERE
                       l.LehrerID = ' 
    $id ' and
                       lf.LehrerID = ' 
    $id 'and
                       lf.FachID = f.FachID;'
    ;
            
    $db->setQuery$query4 );
            
    $lehrerdetailfach $db->loadObjectList();
            return 
    $lehrerdetailfach;
        } 
    lg
    Geändert von vax99 (25.04.2010 um 12:27 Uhr)

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

    Standard

    Spontan würde ich sagen, dass du ein JOIN nutzen solltest, für dein Vorhaben.

    PHP-Code:
    [...]

    private 
    $_subjects null;

    public function 
    getLehrerDetailFach() {

        
    $this->_loadSubjects();

        return 
    $_subjects;

    }

    private function 
    _loadSubjects() {

        if(empty(
    $this->_subjects)) {
     
            
    $query $this->_buildSubjectsQuery();
     
            
    $this->_subjects $this->getList($query);
     
        }

    }

    private function 
    _buildSubjectQuery() {

        
    $where $this->_buildSubjectsQuery();

    // Dein Query macht so keinen Sinn, es fehlt die Verbindung
    //von #__Lehrer zu den anderen Tabellen, musst du noch ergänzen.
    // Dazu einfach noch ein INNER JOIN

        
    $query '
                SELECT
                    f.'
    .$this->_db->nameQuote('Fachbez').'
                FROM
                    '
    .$this->_db->nameQuote('#__Fach').' as f
                INNER JOIN
                    '
    .$this->_db->nameQuote('#__Lehrer_Fach').' as lf
                ON
                    f.'
    .$this->_db->nameQuote('FachID').'=lf.'.$this->_db->nameQuote('FachID').'
                WHERE
                    '
    .$where
        
    ;

        return 
    $query;

    }

    private function 
    _buildSubjectsWhere() {

        
    $where = array();

        
    $id JRequest::getInt('Teacherid');

        
    $where[] = 'lf.'.$this->_db->nameQuote('LehrerID').'='.$id

        
    $where = ( count$where ) ? ' WHERE (' implode') AND ('$where ) . ')' '' );
     
        return 
    $where;



    Du solltest dir auch angewöhnen, Tabellenfelder in Englisch und klein zu schreiben, das macht das ganze einfacher.

    Zusätzlich kannst du auch mal hier schauen.

    Und nein, mein Code ist nicht ausführbar, sollte nur als Skizze angesehen werden, wie du es machen könntest.

  8. #8
    Neu an Board
    Registriert seit
    24.04.2010
    Beiträge
    7
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Vorweg:
    Dass die Tabellenbezeichnungen nicht engl. sind, ist leider ein Verbrechen meiner Projektmitglieder über das ich mich auch schon beschwert habe


    Danke für deinen Tip mit dem Join, jedoch funktioniert dieser auch nicht wirklich.
    hier meine Implementierung:

    PHP-Code:
    SELECT
                             f
    .Fachbez
                        FROM
                             mso_Fach 
    as f,
                             
    mso_Lehrer as l
                         INNER JOIN
                             mso_Lehrer_Fach 
    as lf
                         ON
                            f
    .FachID lf.FachID
                        WHERE
                             l
    .LehrerID ' . $id . ' and
                             
    lf.LehrerID ' . $id . 'and
                             
    lf.FachID f.FachID;; 

    wenn ich diese Query wieder in der Kommandozeile meiner DB teste, bekomme ich eine richtige Lösung.


    dh. statt $id einfach eine TestID einfügen. --> richtiges Ergebnis.



    Edit:
    Weiters kann ich mit var_dump die Daten aus den Variablen auslesen, aber mit $this->lehrerdetaillehrer->LVorname bekomme ich leider keine Daten in der View. (?)



    Möchte mich mal zwischendurch für die Hilfe bedanken und bitte euch mir bitte weiterhin zu helfen.

    lg
    Geändert von vax99 (26.04.2010 um 12:11 Uhr)

  9. #9
    Wohnt hier Avatar von oldlady
    Registriert seit
    17.09.2008
    Ort
    München
    Beiträge
    4.848
    Bedankte sich
    357
    Erhielt 1.408 Danksagungen
    in 1.289 Beiträgen

    Standard

    Tabellenfelder in Englisch und klein zu schreiben
    Etwas off-topic ... klein is klar, aber wieso englisch? Das sehe ich nie ein, es klingt zwar komisch wenn man den code vorliest aber sonst --- da seh ich immer geliche welche tabellen von mir stammen.

    Zum Thema: Lass dir die query mit echo als string anzeigen bevor sie durchgeführt wird, dann siehst du es am ehesten, ob $id falsch belegt ist oder ob diese Konstruktion
    ' . $id . ' funktioniert.
    Grüße, Christiane
    Joomla braucht dich!

  10. #10
    Neu an Board
    Registriert seit
    24.04.2010
    Beiträge
    7
    Bedankte sich
    0
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    engl. darum, weil es einfach leichter zum Lesen ist.

    habe ich schon probiert und die Query ist richtig und es wird auch die richtige ID übergeben, nur hald leider kein Ergebnis...

+ Antworten
Seite 1 von 2 1 2 LetzteLetzte

Lesezeichen

Berechtigungen

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