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

Thema: Eigene JView/JModel für Formularziel

  1. #1
    Neu an Board
    Registriert seit
    04.08.2010
    Beiträge
    22
    Bedankte sich
    23
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Frage Eigene JView/JModel für Formularziel

    Guten Nachmittag/Abend!

    ich habe eine eigene Komponente und eine JView/JModel beinhaltet ein Formular.
    Jetzt stellt sich die Frage, wo ich die Daten des Formulars verarbeiten soll/kann.
    Soll ich dafür ein eigenes JView/JModel-Paar anlegen?

    Vielen Dank im Voraus!
    MfG
    JoomlaIstCool!

  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

    submit in controller abfangen / abfragen (task=xzy) public function xyz() ...
    jmodel instanz holen und post daten an model uebergeben. fuer gewoehnlich $model->store( ...$vorgefiltertedaten... ); im model bestenfalls eine jtable instanz holen $table = $this->getTable('name'); und mit $table->save($datenwiezuvor); "speichern".
    JTable::save(); ruft intern die methoden bind(); check(); store(); und checkin auf und erlaubt so ein overload der methoden zum durchreichen auftretender fehler vom tiefsten punkt (schreiben in die datenbank) bis hin zurueck zum aufruf (controller). ebenso werden hier mit der methode check(); eventuelle felder auf php ebene validiert (titel zu lang ? boeser code ? umwandlungen etc.) und oder konvertiert ... you name it.

    fehler beim ablauf in jtable ? jtable fragt datenbank nach fehler, setzt diesen im internen array und gibt false zurueck. model reagiert auf false in dem es jtable nach dem fehler fragt und diesen wiederum intern setzt. controller fragt wie es aussieht und stellt bei einem fehler fest das es eine fehlermeldung gibt, auf die es zu reagieren gillt. redirect, anzeigen der fehlermeldung ... mit dem finger auf jemanden zeigen.

    formulare sollten unbedingt den token check beinhalten. "wohin" dein formular geschickt wird, wird bestimmt durch das form action attribut und den uebergebenen hidden fields deines formulars. gibt es eine danke oder uebersichtsseite, bietet sich an nach erfolgreichen eintrag in die datenbank oder versandt einer e-mail, auf ein anderes layout der gleichen view zu lenken.

  3. Erhielt Danksagungen von:


  4. #3
    Neu an Board
    Registriert seit
    04.08.2010
    Beiträge
    22
    Bedankte sich
    23
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Erstmal Danke für deine Antwort.

    Hast du vielleicht irgendein Beispielcode, momentan ist es für mich ein wenig kompliziert dies zu verstehen.
    Also ich habe jetzt meine Hauptcontrollerklasse so umgewandelt, ich gebe zu nicht sehr viel:
    PHP-Code:
    class PscmController extends JController
    {
      function 
    display()
      {
        
    parent::display();
      }
      function 
    newcode()
      {
        
    $model $this->getModel("PscmModelCodelist");
        
    /* Was jetzt? */
      


    Laut Dokumentation gibt es doch keine Methode "store" für JModel, muss ich die selber definieren?
    Und kann ich statt JTable auch einfach eine Instanz von JFactory::getDBO nehmen?

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

    jetzt wirds ein wenig ... viel. du hast rest, store gibt es nicht. die gilt es zu erstellen, ja. die methode kann natuerlich auch jeden anderen namen haben. allerdings habe ich selten eine komponente gesehen in der dieser vorgang nicht store genannt wurde. zumindest nicht, sofern es um das schreiben von daten in die datenbank geht.

    dir steht im model ueber $this->_db bereits ein dbo objekt zur verfuegung. wenn, dann arbeite damit. auch beim auslesen der daten. faelschlicherweise sieht man hier oft $db = JFactory::getDbo(); ... $query ... loadObjectList();. $this->_db->_getList(); macht genau dies. es reicht also hier den query zu uebergeben. aber, zurueck zum schreiben ...

    ich wuerde die daten immer ueber die bind methode an das jtable objekt knuepfen anstatt den query selbst zu schreiben. wenn die daten ueber mehrere tabellen geschrieben werden, muss man abwaegen. das gute daran ist, du hast stets das objekt und kannst auf fehler reagieren, ... reset, delete usw. es spart enorm viel zeit.

    beispielcode, beispielcode
    helfen dir stichpunkte ? nimms mir nicht uebel, ... jetzt noch schluessigen copy- & pastebaren code schreiben, phuh - zum einen ist das eher ein platz fuer das wiki, 2. ich bin voellig ko fuer heute

    //controller
    public function [task]() ...
    token check
    jrequest (pre-filter)
    model holen
    daten uebergeben (store wie auch immer)
    bei fehler reagieren (redirect, fehlerausgabe, task ausloesen ...)

    //model
    public function [store]() ...
    jtabel holen
    daten uebergeben
    bei fehler reagieren (fehler holen, fehler setzen ... return true/false)

    //
    public function [save]() ...
    save ruft bind, check, store auf - im mindestfall reicht es check als ueberladene funktion in der eigenen jtable klasse zu nutzen um die eigentliche validierung vorzunehmen und oder daten, datenbankgerecht zu formatieren / umzuwandeln.
    anschliessend gehts mit true / false zurueck

    ich hoffe du kannst damit etwas anfangen,...

  6. Erhielt Danksagungen von:


  7. #5
    Neu an Board
    Registriert seit
    04.08.2010
    Beiträge
    22
    Bedankte sich
    23
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Nocheinmal Danke Matrikular, aber ehrlich gesagt kann ich mit diesem "Code" nicht wirklich viel anfangen.
    Wie generiert/prüft man ein Token? Bei Google fand ich nichts.
    Ich habe fmir diese Seite durchgelesen und irgendwie erscheint es mir als müsste man einen eigenen Controller für ein Formularziel machen?

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

    Standard

    Du brauchst erst einen zweiten Controller, wenn sich die task wiederholen. Sprich, wenn du nur einmal in deiner kompletten Komponente "store" machst, kannst du das in den Standardcontroller packen. Wenn du das zwei mal brauchst (und zwar mit unterschiedlicher Funktionalität), dann brauchst du zwei Controller oder musst ein store anders bennen (store2, store3...)

  9. Erhielt Danksagungen von:


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

    Standard

    Danke bembelimen. So langsam verstehe ich alles

    Aber was ich noch nicht richtig verstanden habe ist JTable, muss ich davon eine Klasse ableiten und wie genau?
    Und eben das mit dem Token, wie das genau geht.


    Vielen Dank schon mal im Voraus!!!

  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

    Ich beantworte ab 18:30 Uhr fuer 30-60 Minuten, je nach Interesse / Beteiligung Fragen zum Thema.

  12. Erhielt Danksagungen von:


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

    Standard

    Guten Abend,

    ich beschäftige mich auch gerade mit dem Thema und kann dir eigentlich empfehlen mal in die Dateien /components/user/controller.php und in die passenden Models einen Blick reinzuwerfen. Dort wird eben dieses gemacht. Ich lese mich da auch gerade ein.

    Viel Erfolg!

    Gruß Thylo

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

    Standard Erste Fortschritte

    Guten Morgen,

    nachdem ich mir die Umsetzung in anderen Komponenten dazu angesehen habe, habe ich nun versucht das Problem zu lösen.

    Mein Controller sieht folgendermaßen aus:
    PHP-Code:
    class CommunityController extends JController {
      
      function 
    __construct() {
      
      
    parent::__construct() ;
      
      
    $this->registerTask('formsent' 'sentform');
      
      }
     
      
      public function 
    sentform() {
      
      
    JRequest::checkToken() or jexit'Invalid Token' );
      
      
    $user     JFactory::getUser();
      
    $userid JRequest::getVar'id'0'post''int' );
      
      if (
    $user->get('id') == || $userid == || $userid <> $user->get('id')) {
                
    JError::raiseError403JText::_('Access Forbidden') );
                return;
        }
      
      
    $return JURI::toString();
      
      
    //holt das komplette Request-Array
      
    $post JRequest::get'post' );
      
    $post["name"] = JRequest::getVar('addname''''post''string') ;
      
    $post["interest"] = JRequest::getVar('addinterest''''post''string') ;
      
      
    $model->getModel('edit') ;
      
      if (
    $model->store($post)) {
                
    $msg    JText::_'Your settings have been saved.' );
            return 
    true ;    
        } else {
                
    //$msg    = JText::_( 'Error saving your settings.' );
                
    $msg    $model->getError();
            }

            
            
    $this->setRedirect$return$msg );
      } 
    Mithilfe von JController::registerTask() habe ich einen neuen Task names "formsent" registriert und die entsprechende Funktion(sentform) eingetragen, die bei auftreten des Task "formsent" aufgerufen werden soll.

    Mein Model (edit.php) :
    PHP-Code:
    class CommunityModelEdit extends JModel {

        public function 
    store($data) {
        
        
    $table $this->getTable('edit');
        
        
        if (!
    $table->bind($data)) {
                
    $this->setError($this->_db->getErrorMsg());
                return 
    false;
            }
        if (!
    $table->check()) {
                
    $this->setError($table->getError());
                return 
    false;
            }
        
        if (!
    $table->save()) {
        
    $this->setError($table->getError());
                return 
    false;
        }
        
        return 
    true 
    }
    //Für das simple Laden der Einträge aus der Datenbank:

    function loadData($ident) {
        
        
    $table $this->getTable('edit') ;
        
        
    $table->load($ident);
        
        return 
    $table ;
        }
         
       } 
    Die View-Datei:
    PHP-Code:
    class CommunityViewEdit extends JView {

           function 
    display($tpl null) {
           
           
    $user JFactory::getUser();
           
    $model $this->getModel();
          
           
           
    $formdetails $model->loadData($user->id) ;
           
           
    $this->assignRef('formdetails'$formdetails);
           
    parent::display($tpl);
           }

    Ich habe mir gedacht, dass ich hier nichts mehr ändern muss, weil die Seite ja nochmal neu geladen werden soll nach dem Absenden des Formulars einfach nur die (neuen) Daten aus der Datenbank laden soll.

    Und zu guter Letzt noch das Formular:
    PHP-Code:
    <?php

    // JURI-Objekt laden
    $uri JFactory::getURI();

    ?>  
      
    <form action="<?php echo $uri->toString() ;?>" method="post" name="showUserfields" class="form-validate">

    <table cellpadding="4" cellspacing="1" border="0" width="100%">
    <tr>
     <td width="10%"><?php echo JText::_'Name:' ); ?>:</td>
     <td><input class="inputbox" type="text" size="50" value="<?php echo $this->formdetails->name ?>" name="addname" /></td>
     </tr>
     <tr>
     <td width="10%"><?php echo JText::_'Interessen: '); ?></td>
     <td><input class="inputbox" type="text" size="50" maxlenght="250" value="<?php echo $this->formdetails->interest ?>" name="addinterest" /></td>
     </tr>
     <tr>
     <td width=10%"><?php echo JText::_'Ausgabe der Variablen' ); ?></td>
     <td><textarea rows="20" cols="60" value="<?php echo var_dump($this->formdetails) ;?>" />
     </textarea></td>
     </tr>

    <tr><td><input type="submit" value="Speichern" name="absenden" /></td><tr>
    <tr><td><input type="reset" value="Felder resetten" /></td></tr>


    <tr><td><input type="hidden" name="active" /></td></tr>  
    <tr><td><input type="hidden" name="option" value="com_community" /></td></tr>
    <tr><td><input type="hidden" task="formsent" /></td></tr>
    </table> 
    </form>
    Es funktioniert nur leider nicht, allerdings auch kein Fehler angezeigt.
    (Fehler berichten: Maximum im Backend)

    Ich könnte mir vorstellen, dass das JTable-Objekt nicht weis, in welche Reihe innerhalb der Tabelle die neuen Daten eingetragen werden müssen. Irgendwie müsste ja die Id des Benutzer berücksichtigt werden, wie bei JTable::load() im Model.

    Vielen Dank im Voraus

    Gruß Thylo

+ 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