+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Welche Verbindungen zwischen Model-View-Controller existieren automatisch?

  1. #1
    War schon öfter hier
    Registriert seit
    05.12.2006
    Beiträge
    107
    Bedankte sich
    7
    Erhielt 9 Danksagungen
    in 9 Beiträgen

    Standard Welche Verbindungen zwischen Model-View-Controller existieren automatisch?

    Hi,

    ich beschaeftige mich seit ein paar Tagen mit dem MVC-Kram unter Joomla. Das MVC-Muster hab ich soweit verstanden. Was mir allerdings noch Probleme bereitet ist, was das Joomla-Framework an automatischer Arbeit erledigt.
    Ich habe hier die Auto-Komponente von Hagen Graf:

    /administrator/components/com_auto/views/auto/view.html.php:
    Code:
    <?php
    
    // Check to ensure this file is included in Joomla!
    defined('_JEXEC') or die();
    
    jimport( 'joomla.application.component.view' );
    
    class AutosViewAuto extends JView
    {
    	/**
    	 * display method of Hello view
    	 * @return void
    	 **/
    	function display($tpl = null)
    	{
    		$auto		=& $this->get('Data');	
                    $isNew		= ($auto->id < 1);
    
    		$text = $isNew ? JText::_( 'New' ) : JText::_( 'Edit' );
    		JToolBarHelper::title(   JText::_( 'Auto' ).': <small>[ ' . $text.' ]</small>' );
    		JToolBarHelper::save();
    		if ($isNew)  {
    			JToolBarHelper::cancel();
    		} else {
    			// for existing items the button is renamed `close`
    			JToolBarHelper::cancel( 'cancel', 'Close' );
    		}
    
    		$this->assignRef('auto',		$auto);
    
    		parent::display($tpl);
    	}
    }
    Und
    /components/com_auto/views/auto/view.html.php:
    Code:
    <?php
    /* Hagen Graf - cocoate.com - Nov. 2007 */
    jimport( 'joomla.application.component.view');
    /**
     * HTML View class for the auto Component
     */
    class AutoViewAuto extends JView
    {
    	function display($tpl = null)
    	{
    		$model	  = &$this->getModel();
      		$rows     = $model->getAutoList();		
                    $this->assignRef('rows'  , $rows);
    		parent::display($tpl);
    	}	
    }
    ?>
    Warum kann ich im ersten Code direkt auf getData() im Model zugreifen (und warum komme ich ueber $this dran?) und warum muss ich im zweiten Code mir erst noch das Model mit GetModel() holen, um auf getAutoList() zugreifen zu koennen?

    Gruss,
    Kharlanki
    Geändert von Kharlanki (27.02.2011 um 12:16 Uhr) Grund: geloest-Prefix gesetzt

  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

    Eine direkte Antwort ohne Erklärung befindet sich am Ende dieses Posts.


    Obgleich du dich im Umgang mit dem MVC-Pattern bereits sicher fühlst, erlaube mir kurz zu zitieren:
    Die Pseudovariable $this ist verfügbar, falls eine Methode aus einem Objektkontext heraus aufgerufen wird. $this ist eine Referenz auf das aufrufende Objekt (üblicherweise das Objekt, zu dem die Methode gehört, aber möglicherweise ein anderes Objekt, falls die Methode statisch aus dem Kontext eines zusätzlichen Objektes aufgerufen wird).
    Quelle: http://www.php.net/manual/de/language.oop5.basic.php

    $this steht also innerhalb der Klasse fuer das instanziierte Objekt wobei mit $this->FUNCTIONNAME(); oder $this->VARNAME; auf Member Funktionen und Variablen zugegriffen werden kann. $this->get(); ist eine solche Funktion.

    Wenn wir jetzt noch ein Stück weiter ausholen:
    Jede eigene View Klasse ist von JView abgeleitet und erbt somit (bei entsprechender Sichtbarkeit) alle Methoden und Variablen. Im Vorfeld wurde der View bereits ein Standard Model bereitgestellt, bzw. die View weiß wo sie entsprechend zugewiesene Model findet.

    $this->get(); wird in der Api-Dokumentation folgendermaßen beschrieben:
    get (line 344)

    Method to get data from a registered model or a property of the view

    * return: The return value of the method
    * access: public

    mixed &get (string $property, [string $default = null])

    * string $property: The name of the method to call on the model, or the property to get
    * string $default: The name of the model to reference, or the default value [optional]
    Schauen wir uns dazu die Funktion genauer an:
    PHP-Code:
        /**
         * Method to get data from a registered model or a property of the view
         *
         * @access    public
         * @param    string    The name of the method to call on the model, or the property to get
         * @param    string    The name of the model to reference, or the default value [optional]
         * @return mixed    The return value of the method
         */
        
    function &get$property$default null )
        {

            
    // If $model is null we use the default model
            
    if (is_null($default)) {
                
    $model $this->_defaultModel;
            } else {
                
    $model strtolower$default );
            }

            
    // First check to make sure the model requested exists
            
    if (isset( $this->_models[$model] ))
            {
                
    // Model exists, lets build the method name
                
    $method 'get'.ucfirst($property);

                
    // Does the method exist?
                
    if (method_exists($this->_models[$model], $method))
                {
                    
    // The method exists, lets call it and return what we get
                    
    $result $this->_models[$model]->$method();
                    return 
    $result;
                }

            }

            
    // degrade to JObject::get
            
    $result parent::get$property$default );
            return 
    $result;

        } 
    Was heißt das nun? Die $this->get(); Funktion sucht im Model nach einer Funktion mit dem Namen der als Parameter übergeben wurde. Oft wird hier $this->get('Data'); benutzt was nichts anderes macht als im Model getData() aufzurufen sofern dort die Funktion existiert.

    Dieser Funktion kann über einen so erfolgten Aufruf allerdings kein Parameter übergeben werden. Um das möglich zu machen, oder gegebenenfalls auf andere Funktionen als der aus dem Standard Model zuzugreifen, holt man sich das Model mit $this->getModel(); bzw. $this->getModel('NAME'); und kann dann wie gewohnt die gleichen Funktionen direkt und mit oder ohne Parameter aufrufen.

    Beispiel: $model->getData(); | $model->getData($filter);

    In welchen Fällen es nötig ist vorher das Model zu holen, hängt davon ab ob Funktionen verteilt über verschiedene Model, oder vielleicht sogar ein globales Model abgerufen werden. Man könnte an dieser Stelle pingelig sein und sagen, dass Parameter im Controller dem Model State zugewiesen werden sollten, anstatt intern über den Contructor oder der View aber ... keine der Core Komponenten hält sich strickt daran also, ... who cares most?

    Ich hoffe der Ausflug war nicht zu weit und bringt ein wenig Klarheit, vielleicht auch für andere Suchende.

    Direkte Antwort:
    Da jede View von der JView erbt, kannst du sowohl im Front- als auch Im Backend mit $this->get(); ($this->get('AutoList')) auf die Funktionen zugreifen ohne vorher das Model holen zu müssen.

  3. Erhielt Danksagungen von:


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

    Hallo Sven

    Deine Posts hier im Forum sind so schick, dass ich es echt bedauere in letzter Zeit so wenig von Dir im Wiki zu lesen

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

  5. Erhielt Danksagungen von:


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

    Zitat Zitat von elkuku Beitrag anzeigen
    [...], dass ich es echt bedauere in letzter Zeit so wenig von Dir im Wiki zu lesen [...]
    guilty, guilty as charged
    "ich bin erkaeltet" ist keine entschuldigung, oder ?
    Geändert von Matrikular (25.02.2011 um 00:50 Uhr) Grund: f5f7f8

  7. #5
    War schon öfter hier
    Registriert seit
    05.12.2006
    Beiträge
    107
    Bedankte sich
    7
    Erhielt 9 Danksagungen
    in 9 Beiträgen

    Standard

    Wow! Danke fuer diese sehr ausfuehrliche und wirklich hilfreiche Antwort!
    Bin da aus anderen Foren (bes. Linux-Foren) eher RTFM-oder lmgtfy.com-Antworten gewohnt.

  8. #6
    Neu an Board
    Registriert seit
    08.03.2011
    Ort
    Reichenbach
    Beiträge
    74
    Bedankte sich
    3
    Erhielt 4 Danksagungen
    in 4 Beiträgen

    Standard

    Zitat Zitat von elkuku Beitrag anzeigen
    Hallo Sven

    Deine Posts hier im Forum sind so schick, dass ich es echt bedauere in letzter Zeit so wenig von Dir im Wiki zu lesen

    Trau Dich :P

    Ich liebe dieses Forum :-)

+ Antworten

Lesezeichen

Berechtigungen

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