+ Antworten
Ergebnis 1 bis 9 von 9

Thema: Variable enhält keinen Wert bei Übergabe ans Template

  1. #1
    Neu an Board
    Registriert seit
    14.10.2009
    Beiträge
    38
    Bedankte sich
    7
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard Variable enhält keinen Wert bei Übergabe ans Template

    Guten Abend,

    ich beschäftige mich gerade mit der Joomla API und versuche mein Verständnis durch die Erstellung einer Test-Komponente zu festigen. Doch leider klappt nicht alles, so wie ich mir das vorgestellt habe. Ich habe probiere das ganze lokal über Xampp 1.7.3 aus.

    Die Komponente soll derzeit eigentlich nur den Username des aktuellen Benutzer ausgeben. Später soll die Komponente für eine Profilansicht verwendet werden.

    Zunächst ein Ausschnitt aus dem Model im Ordner /models(ich denke Controller brauche ich weiter zu posten, weil da eh nicht mehr als der Standardinhalt drin ist):
    PHP-Code:
    defined('_JEXEC') or die ('Restricted access');

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

    class 
    CommunityModelProfile extends JModel {
       
       public 
    $result;

    public function 
    getData($identn)
      {
      
    $query "SELECT * FROM #_users WHERE id = "$identn ;
      
    $this->_db->setQuery($query);
      
      if (!
    $this->_db->query()) {
         echo 
    "<script type='text/javascript'> alert('" $this->_db->getErrorMsg()."') </script>";
         }
       else {
       
       
    $this->result $this->_db->_getList($query);
       return 
    $this->result;
       
       } 
    Im Anschluss folgt die view.html.php (im Ordner /views/profile/):
    PHP-Code:
    class CommunityViewProfile extends JView {
         
        public 
    $userdata;
         
         function 
    display($tpl null) {
          
    $user JFactory::getUser();
          
          
    $model $this->getModel();
            
    $this->userdata $model->getData($user->id);
            
    $this->assignRef('userdata'$userdata);
          
          
    parent::display($tpl);
         } 
    Und zu guter Letzt noch das default Layout. default.php /views/profile/tmpl :
    PHP-Code:
    <html>
    <?php defined('_JEXEC') or die( 'Restricted Access'); 
    ?>

    <div align="center">
      <table width=" 50%">
       <tr>
        <th>Name:</th>
        <td><?php 
         var_dump
    ($this->userdata
         
    ?></td>
        </tr>
      </table></div>
    </html>
    Die Ausgabe lautet NULL. Doch eigentlich müsste ja die Variable $userdata die Daten aus den Feldern des zugehörigen Benutzer enthalten. $userdata müsste doch eigentlich auch ein Object erzeugen mit Eigenschaften, die den selben Namen und Werte haben, wie in der Datenbank angegeben.

    Wenn ich in der deafult.php var_dump($userdata) durch :
    PHP-Code:
     echo $this->userdata->username 
    ersetze, erscheint folgende Fehlermeldung:
    Notice: Trying to get property of non-object in C:\xampp\htdocs\joomla\components\com_community\vi ews\profile\tmpl\default.php on line 10. Die Variable scheint doch noch kein Objekt erzeugt zu haben.
    Ich dachte dies wäre durch die Methode _getList im Model geschehen.


    Könnt ihr mir irgendein Hinweis geben, wo sich Fehler eingeschlichen haben?

    Vielen Dank im Voraus

    Gruß Thylo

  2. #2
    Hat hier eine Zweitwohnung Avatar von JoomDesign
    Registriert seit
    19.03.2006
    Ort
    Berlin, Deutschland
    Beiträge
    1.927
    Bedankte sich
    269
    Erhielt 594 Danksagungen
    in 511 Beiträgen

    Standard

    $model = $this->getModel();
    $this->userdata = $model->getData($user->id);
    $this->assignRef('userdata', $userdata);
    Das rote löschen.
    $model = $this->getModel();
    $userdata = $model->getData($user->id);
    $this->assignRef('userdata', $userdata);

  3. Erhielt Danksagungen von:


  4. #3
    Neu an Board
    Registriert seit
    14.10.2009
    Beiträge
    38
    Bedankte sich
    7
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard

    Danke für deinen Lösungsvorschlag, allerdings bleibt die Ausgabe von var_dump() gleich und der Fehler wird weiterhin ausgegeben.

  5. #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

    Also das erste was mir gleich ins Auge hüpft ist der Tabellenname..

    der 'Prefixreplacer' ist #_..
    Also statt #_users muss es #__users heissen

    Des weiteren..
    Wenn Dein Model zum View passt, es also das 'default model' ist, kommst du mit $this->get('data') im View an die Funktion getData() Deines Models ohne es über eine Variable zu beziehen und die Funktion direkt aufzurufen.

    Um es dann in Deinem Template zu nutzen kannst Du es entweder über assignRef zuweisen oder, wie Du es bereits tust, gleich $this'sen :P

    AssignRef() tut nichts anderes - die Funktion ist glaub ich für Templatebauer gemacht ..

    hF
    Gruß,
    Nikolai
    Hilf mit: Deutsche Joomla! Dokumentation Help testing: EasyCreator Noch Fragen ? Forum.Joomla-Nafu.de

  6. Erhielt Danksagungen von:


  7. #5
    Neu an Board
    Registriert seit
    14.10.2009
    Beiträge
    38
    Bedankte sich
    7
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard

    Danke elkuku!

    var_dump() liefert mir jetzt einen Array mit den Werten aus der Tabelle jos_user aus. (durch Änderung des Präfixes)

    Wenn ich in der default.php jetzt noch eine foreach-Schleife einbaue, funktioniert auch die Ausgabe.
    PHP-Code:
    <html>
    <?php defined('_JEXEC') or die( 'Restricted Access'); 

    foreach(
    $this->userdata as $userdate) {
    ?>

    <div align="center">
      <table width=" 50%">
       <tr>
        <th>Name:</th>
        <td><?php 
         
    echo $userdate->username 
          
         
    ?></td>
        </tr>
      </table><?php ?></div>
      
    </html>
    Nun stelle ich mir die Frage, ob man das nicht auch anders lösen kann. (mit loadObjectList liefer ich ja einen Array aus)

    Doch ist es nicht möglich ein Objekt zu erzeugen, welches die Eigenschaften der Feldnamen(aus der MysQL-Tabelle) und deren jeweilligen Werte besitzt. Liefert das Joomla-Framework eine solche Methode?

    Weil ich frage mich, ob es sinnvoll ist eine foreach-Schleife zu benutzen, wenn von vorneherein klar ist, dass nur ein Datensatz betroffen ist. Der betroffene User ruft ja nur sein eigenes Profil in diesem Fall auf.

    Vielen Dank im Voraus

    Gruß Thylo

  8. #6
    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

  9. Erhielt Danksagungen von:


  10. #7
    Neu an Board
    Registriert seit
    14.10.2009
    Beiträge
    38
    Bedankte sich
    7
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard

    Erstmal Danke! Ich habe es soweit hinbekommen(mithilfe einer foreach-Schleife, obwohl ich mir deren Notwendigkeit in meiner Situation nicht erklären kann) . Die Ausgabe stimmt.

    Nur jetzt wollte ich versuchen, das ganze über ein Objekt zu realisieren, indem ich den Eigenschaften bestimmte Werte aus dem Ergebnis-Array zuweise:
    PHP-Code:
       $this->erg $this->_db->loadObjectList();
         
        
       
       
    $result = new StdClass();
       
       
    //Werte zuweisen
       
    $result->id $this->erg['id'];
       
    $result->username $this->erg['username'];
       
    $result->email $this->erg['email'];   
        
       
       
       return 
    $result 
    In default.php (foreach-Schleife entfernt):

    PHP-Code:
    <th>Name:</th>
        <td><?php 
         
    echo $userdata->username
          
         ?>
    </td>
    Nun wird mir folgende Fehlermeldung angezeigt:

    • Notice: Undefined index: username in C:\xampp\htdocs\joomla\components\com_community\mo dels\profile.php on line 54
    • Notice: Undefined variable: userdata in C:\xampp\htdocs\joomla\components\com_community\vi ews\profile\tmpl\default.php on line 13
      Notice: Trying to get property of non-object in C:\xampp\htdocs\joomla\components\com_community\vi ews\profile\tmpl\default.php on line 13

    Allerdings müsste der Index doch definiert sein, weil in $erg doch der Array mit den Feldname als Keys definiert ist.

    Und zur zweiten Fehlermeldung:
    Ich kann nicht nachvollziehen, wieso die Variable $userdata nicht definiert ist, weil ich sie ja auch über die foreach-Schleife ansprechen kann(in diesem Fall natürlich über $this->userdata). Desweiteren wird ja durch die Methode getData ein Objekt übergeben, demnach sollte man doch auch die Variable $userdata als solches ansprechen können.

    Tut mir Leid, dass ich euch durch mein langsames Lerntempo aufhalte. Hoffentlich bringt mir der Weihnachtsmann ein schickes Buch zum Thema.

    Vielen Dank im Voraus

    Gruß Thylo

  11. #8
    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

    warum immer noch $this->_db->loadObjectList(); ? im grunde macht loadobjectlist nichts anderes als _getlist nur das default parameter gesetzt werden, wenn vorhanden. in meinen links zu jdatabase sind methoden aufgefuehrt, welche dir nur genau ein objekt zurueckliefern wuerden.

    weiterhin ist es, sofern du keine filter auf den query anwenden willst, vielleicht besser statt des plain sql selects eine instanz von jtable zu holen. genauer gesagt (d)eine jtable instanz der auszulesenden tabelle. im model steht dir die methode $this->getTable(); bereit. die erzeugung eines eigenen objektes ist ueberfluessig und mit jtable erhaelst du eine vielzahl von methoden zur manipulation genau des datensatzes, den du auslesen willst.

    dein model laesst generell eine saubere fehlerpruefung vermissen. die javascript alert ausgabe ist eher gefrickel (keine kritik). fuer fehlerausgabe ist die jerror klasse vorgesehen. die eingehende id sollte gefiltert werden und, wenn kein laden ueber jtable erfolgt, die noetigen felder aufgefuehrt werden, statt select * zu verwenden. selbst wenn du alle haben willst. auch hier, quotes nicht vergessen, wobei ... weiter oben bereits erwaehnt, das laden eines datensatzes anhand einer id ueber jtable::load zu empfehlen ist (das von dir gewuenschte objekt inkl. abbildung der datenbankfelder).

    die zuweisung der ausgabe des queries in ein anderes objekt ist nicht noetig. es ist gut das du ein abbild der tabelle moechtest, fuer vieles allerdings gibt es, wie du mehr und mehr feststellen wirst, bereits eine methode / funktion oder einen helper um einen die arbeit zu erleichtern, wenn nicht gar abzunehmen.

    zusammenfassung
    neu machen, sofern vorhanden im model eine instanz von jtable holen (eigene oder vorhandene klasse) mit der id und jtable::load den datensatz laden, wenn fehler diesen abfragen und im model setzen ($this->setError(...)) anschliessend im controller mit jerror darauf reagieren (task: edit / add ?!)

    schau dir jtable / jdatabase / jmodel und co an

  12. #9
    Neu an Board
    Registriert seit
    14.10.2009
    Beiträge
    38
    Bedankte sich
    7
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard erste Erfolge

    Ich kann mich gar nicht genug bedanken für eure Hilfe!

    Ich habe die Tipp beherzigt und nun mal ein bischen was in der Komponente verändert.

    profile.php /models
    PHP-Code:
    defined('_JEXEC') or die ('Restricted access');

    jimport('joomla.application.component.model');
    //jimport( 'joomla.database.table' );

    class CommunityModelProfile extends JModel {
    public function 
    getData($ident)
      {
      
      
    $db JFactory::getDBO() ;

    $table $this->getTable('profile') ;
       
       
    $table->load($ident) ;
       
       return 
    $table ;
    ...... 
    in der View-Datei(view.hmtl.php /views/profile) sieht es nun folgender Maßen aus:
    PHP-Code:
    defined('_JEXEC') or die('Restricted Acesss');
    jimport('joomla.application.component.view');


    class 
    CommunityViewProfile extends JView {
         
        
         function 
    display($tpl null) {
          
    $user JFactory::getUser();
          
          
    $model $this->getModel();
            
    $userdata $model->getData($user->id);
            
    $this->assignRef('userdata'$userdata);
          
         
          
    parent::display($tpl);
         }
       } 
    Weil ich ja die Methode getTable im Model genutzt habe, musste ich dementsprechend ja eine neue Datei erstellen, in die Tabelle definiert ist. (Anfangs dachte ich, dass man direkt den Namen der Datenbank-Tabelle angeben kann).
    profile.php /tables :
    PHP-Code:
    defined('_JEXEC') or die('Restricted access');

    class 
    TableProfile extends JTable {


       var 
    $id 0;
       var 
    $name '';
       var 
    $username '';
       var 
    $email '';
       var 
    $password ''
       var 
    $usertype '';
       var 
    $block 0;
       var 
    $sendEMail 0;
       var 
    $gid 0;


       function 
    TableProfile(& $db) {
             
    parent::__construct('#__users''id'$db) ;
             }
             

    Und zu guter Letzt meine Ausgabe-Datei:
    PHP-Code:
    <?php defined('_JEXEC') or die( 'Restricted Access'); 

    if(!empty(
    $this->userdata)) {

    //foreach($this->userdata as $userdate) {
    ?>

    <div align="center">
      <table width=" 50%">
       <tr>
        <th>Name:</th>
        <td><?php 
         
    //echo $userdate->username ; 
         
    echo $this->userdata->username ;
          
         
    ?></td>
        </tr>
        <tr>
        <td><b>E-Mail Adresse:</b></td>
        <td><?php echo $this->userdata->email ?></td></tr>
        <tr><td>
        <b>Benutzer-Id</b></td>
        <td><?php echo $this->userdata->id ?>
        <tr>
        <th>Ausgabe von der Variablen:</th>
        <td><?php echo var_dump($this->userdata) ; ?></td>
        </tr>  
      
      </table>
      </div>
     <?php  }
    else {
     
     echo 
    "<b> Sie sind nicht eingeloggt, bitte loggen Sie sich ein um Zugriff auf ihr Profill zu erlangen.</b>" ;
     } 
     
    ?>
    Bei der Ausgabe verstehe ich nicht, wieso man die die Variable 'userdata' als Eigenschaft aufrufen muss und nicht das Objekt nutzen kann. Das sollte ja eigentlich die Methode load des JTable-Objekts erledigen.

    Vielen Dank im Voraus!

    Gruß Thylo
    Geändert von Thylo (24.01.2011 um 16:50 Uhr)

+ Antworten

Lesezeichen

Berechtigungen

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