+ Antworten
Ergebnis 1 bis 4 von 4

Thema: Verständnisfrage

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

    Standard Mehrere views mit dem gleichen Model

    Hallo zusammen,

    ich habe heute meinen ersten Versuch gewagt eine Komponente zu entwickeln, mit mäßigem Erfolg. Ich habe die gängigen Tutorials alle gelesen aber die behandeln fast alle nur den 1 Controller, 1 View, 1 Model Fall aber das hilft mir nicht

    Im Prinzip möchte ich, als leichten Einstieg, eine Uploadkomponente entwickeln. Dabei habe ich zum einen ein Formular und zum anderen das Speichern der Daten (Dateien kopieren und Datenbankeintrag). Also nix wildes.

    Mir ist aber nicht ganz klar wie ich diese beiden Aufgaben innerhalb des selben Controllers trenne. Ich vermute mal über Views, ich habs mittlerweile auch geschafft je nach Task einen anderen View aufzurufen, jedenfalls so ungefährt. Aber wenn ich jetzt im einen View ne Funktion aus dem Model benutze sagt er die gäbe es nicht, im anderen View funktioniert sie einwandfrei.

    Ich wäre dankbar wenn mir jemand kurz und knapp erklären könnte was der richtige Ansatz für dieses Problem (Formulareingabe + Speichern) als MVC-Komponente ist und warum Morgen kann ich auch mal meinen aktuellen Code posten.

    Vielen Dank schon mal, Jan
    Geändert von jan83 (25.08.2010 um 23:07 Uhr)

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

    Standard

    Zitat Zitat von jan83 Beitrag anzeigen
    Mir ist aber nicht ganz klar wie ich diese beiden Aufgaben innerhalb des selben Controllers trenne. Ich vermute mal über Views, ich habs mittlerweile auch geschafft je nach Task einen anderen View aufzurufen, jedenfalls so ungefährt. Aber wenn ich jetzt im einen View ne Funktion aus dem Model benutze sagt er die gäbe es nicht, im anderen View funktioniert sie einwandfrei.
    Schlechte Nachricht: dein Ansatz ist falsch

    Controller haben ganz salopp gesagt nur eine Aufgabe: sie führen die "tasks" aus (sicher machen sie im Hintergrund mehr, aber das reicht erstmal als Basiswissen).

    Desweiteren solltest du wissen, dass es einen Standard Task gibt, der immer dann aufgerufen wird, wenn kein anderer Task vorhanden ist: "display".

    Das Wort "display" suggestiert auch sofort für was dieser Task zuständig ist: für das Anzeigen von Informationen. Somit wird immer dieser Task benutzt, wenn ein View angezeigt werden soll. Damit fällt schon mal das "jeder View braucht einen Task" flach. Nun stellt sich die Frage: woher weiß man dann, welcher View aufgerufen werden soll? Das ist im Prinzip ganz einfach, das teilt man dem Controller über die URL (oder anderen Request Variablen) mitgeteilt

    Code:
    index.php?option=com_komponente&view=meinView
    siehe dazu auch hier

    Nun wird also dein View (bzw. Formular) schon mal angezeigt. Wenn es nun abgeschickt wird, soll natürlich etwas mit den Dateien passieren - wir wollen sie verarbeiten und speichern. Also packen wir in das Formular ein verstecktes Feld "task" mit dem Wert "save". Gleichzeitig bauen wir in unseren Controller eine Methode "save". Schicken wir nun das Formular ab, wird automatisch die "save" Methode aufgerufen. In dieser können wir nun mittels JRequest alle eingaben abrufen und validieren, an eine Datenbank übergeben etc. Am ende machen wir noch eine Weiterleitung auf den View "success", der uns einfach eine Erfolgsmeldung ausgibt und/oder nochmals die Eingabe aufzeit. Wichtig dabei ist, dass wir dieses mal keinen Task setzen, damit automatisch wieder "display" genommen wird.

    Code:
    index.php?option=com_komponente&view=success
    Und schon ist dein Formular fertig.

    Nochmal der Ablauf in Kurzfassung: Formular View aufrufen => Formular absenden + incl. Task "save" => per "save" Methode und JRequest, JFile etc. deine Eingaben verarbeiten => Auf Erfolgsview weiterleiten*.

    Um nun noch zu deiner Frage zu kommen, wann man mehrere Controller benötigt: Du brauchst nur einen zusätzlichen Controller, wenn du mehrere gleiche Task hast, die aber verschiedene Funktionen übernehmen sollen. Dies ist meistens im Backend der Fall, wenn man sehr viele "save" Tasks hat. Alternativ kann man auch bei einem Controller bleiben, man muss dann nur ein bisschen kreativ bei der Namenswahl der Task sein.


    * Im Endeffekt reicht es, wenn du nur einen View mit verschiedenen Layouts hast.

  3. Erhielt Danksagungen von:


  4. #3
    Neu an Board
    Registriert seit
    24.08.2010
    Beiträge
    3
    Bedankte sich
    1
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Super, das hat schon mal geholfen. Ich habe die Struktur jetzt besser verstanden. Ich hatte mich auch schon gewundert warum ich mehrere Controller brauchen sollte, das kann ja nicht ganz der Sinn einer MVC-Architektur sein

    Allerdings habe ich trotzdem noch ein Problem. Es geht dabei um die Benutzung der des Models. Und zwar kann ich mit dem gleichen Code aus dem einen View heraus eine Funktion des Models aufrufen, aus dem anderen aber nicht? Es kommt folgender Fehler:

    Code:
    Fatal error: Call to a member function isAuthorizedUser() on a non-object in /.../com_screenshotuploader/views/success/view.html.php on line 14
    Ich vermute das da irgendein Konstruktor nicht aufgerufen wurde, aber warum? Ich habe mittlerweile rausgefunden dass ich ein zweites Model erstellen kann, entsprechend benannt (ScreenshotuploaderModelSuccess), und es dann funktioniert. Aber das kann doch nicht Sinn und Zweck von MVC sein, das ich für jeden View ein neues Model schreiben muss? Ich würde gerne das gleiche Model für alle Views benutzen. Wie geht das?

  5. #4
    Neu an Board
    Registriert seit
    24.08.2010
    Beiträge
    3
    Bedankte sich
    1
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    ah, ich glaube ich habs selbst gefunden:

    PHP-Code:
    &$this->getModel(ScreenshotuploaderModelScreenshotuploader
    könnte mir aber vielleicht jemand verraten warum es "&$this" statt "$this" heißt?

    edit:

    okay, habe das hier gelesen: http://docs.joomla.org/Using_multipl..._MVC_component aber es klappt trotzdem nicht. Daher hier mal mein Code:

    Controller
    PHP-Code:
    <?php
    /*
     * controller
     */

    // no direct access
    defined'_JEXEC' ) or die( 'Restricted access' );

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

    /**
     * Component Controller
     */
    class ScreenshotuploaderController extends JController
    {

        
    /**
         * Method to display the view
         *
         * @access    public
         */
        
    function display()
        {
            if (
    JRequest::getVar('view') == "success") {
                
    $view = &$this->getView'success''html' );
                
    $view->setModel($this->getModel'Screenshotuploader' ), true );
                
    $view->display();
            } else {
                
    parent::display();
            }
        }
        
        function 
    save()
        {
         
    //do validation
        
    $this->setRedirect("index.php?option=com_screenshotuploader&view=success");
        
    $this->redirect();
        }
    }
    ?>
    Default View
    PHP-Code:
    <?php
    /*
     * default view
     */
    // no direct access
    defined'_JEXEC' ) or die( 'Restricted access' );
    jimport'joomla.application.component.view');

    class 
    ScreenshotuploaderViewScreenshotuploader extends JView
        
    {
            function 
    display()
            {
                
    $model $this->getModel();
                
    $usertype $model->isAuthorizedUser();
                
    $this->assignRef'usertype'$usertype );

                
    parent::display();
            }
        }
    ?>
    Template for Default View
    PHP-Code:
    <?php 
    /*
     * template for default view
     */

    // no direct access
    defined('_JEXEC') or die('Restricted access'); ?>

    <h1>Screenshot Uploader</h1>
    <ul>

        <form action='index.php?option=com_screenshotuploader' method='POST' enctype='multipart/form-data'>
            <input type="hidden" name="MAX_FILE_SIZE" value="5000000">
            <input type="hidden" name="task" value="save">
            <label>Upload your file: </label>
            <input type='file' name='uploadedfile'><p>
            <label>Enter set name: </label>
            <input type='text' name='setname'><p>
            <label>Enter game id: </label>
            <input type='text' name='gameid'><p>
            <input type='submit' value='Upload'>
        </form>

    </ul>
    <?php   
             
    if ($this->usertype === true)  {
                echo 
    "This is a super user";
             }
    ?>
    Success View
    PHP-Code:
    <?php
    /*
     * success view
     */
    // no direct access
    defined'_JEXEC' ) or die( 'Restricted access' );
    jimport'joomla.application.component.view');

    class 
    ScreenshotuploaderViewSuccess extends JView
        
    {
            function 
    display()
            {
                
    // $this->setModel("ScreenshotuploaderModelScreenshotuploader", true, "ScreenshotuploaderModelScreenshotuploader");
                
    $usertype $model->isAuthorizedUser();
                
    $this->assignRef'usertype'$usertype );
                
                
    // parent::display();
            
    }
        }
    ?>
    Template for Success View
    PHP-Code:
    <?php 
    /*
     * template for success view
     */

    // no direct access
    defined('_JEXEC') or die('Restricted access'); ?>

    <h1>Screenshot Uploader</h1>
    <ul>

    <?php   
             
    if ($this->usertype === true)  {
                echo 
    "This is a super user";
             }
    ?>

    </ul>
    Model
    PHP-Code:
    <?php
    /*
     * model
     */
     
    //No direct access
    defined('_JEXEC') or die();

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

    class 
    ScreenshotuploaderModelScreenshotuploader extends JModel {
          
        function 
    __construct()
        {
            
    parent::__construct();
        }
              
        function 
    isAuthorizedUser(){
            
    $db $this->getDBO();
            
            
    $user =& JFactory::getUser();
            
    $usertype $user->get('usertype');
            
            if (
    $usertype === "Super Administrator") {
                return 
    true;
            }
            return 
    false;
        }
    }
    ?>
    Geändert von jan83 (25.08.2010 um 09:34 Uhr)

+ Antworten

Lesezeichen

Berechtigungen

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