5 Dinge, die du über Mage::getModel() vielleicht nicht weißt

Im letzten Artikel haben wir uns mit einer Magento-Grundlage beschäftigt: dem Laden von Models über die Methode Mage::getModel(). Damit war aber noch nicht alles gesagt, denn es gibt ein paar Informationen und Kniffe, die euch die Arbeit mit diesem Befehl erleichtern und die Einsatzmöglichkeiten erweitern.

[toc levels=3 title=“Inhalt“]

1. Groß-/Kleinschreibung bei Mage::getModel()

Gerade zu Beginn fragt man sich bei Magento immer wieder: wann muss man denn in den Konfigurationsdateien und speziell bei der Klassen-Id von Mage::getModel() die Groß-/Kleinschreibung beachten? Die unbefriedigende Antwort: es kommt darauf an. Wenn man über Mage::getModel() ein Model lädt, scheint es manchmal so, als ob der Shop nach Lust und Laune Fehler wirft, egal was man tut.

Die Wahrheit ist aber:

  • Magento bearbeitet die von euch angegebene Klassen-Id und schreibt das allererste Zeichen sowie das erste Zeichen nach jedem „_“ groß. Verwendet ihr Kleinbuchstaben, so werden sie automatisch durch große ersetzt.
  • Die Groß-/Kleinschreibung mitten in einem Wort wird nicht verändert.
  • Wird ein vollständiger Klassenname angegeben (siehe Tipp 3), wird jedoch gar nichts verändert.

Ein paar Beispiele:

Mage::getModel('gruppe/eins_zwei'); // => Emzee_Gruppe_Model_Eins_Zwei
Mage::getModel('gruppe/Eins_zwei'); // => Emzee_Gruppe_Model_Eins_Zwei
Mage::getModel('gruppe/eins_Zwei'); // => Emzee_Gruppe_Model_Eins_Zwei
Mage::getModel('gruppe/Eins_Zwei'); // => Emzee_Gruppe_Model_Eins_Zwei
Mage::getModel('gruppe/eins_zweidrei'); // => Emzee_Gruppe_Model_Eins_Zweidrei
Mage::getModel('gruppe/eins_zweiDrei'); // => Emzee_Gruppe_Model_Eins_ZweiDrei
Mage::getModel('gruppe/Eins_Zweidrei'); //=> Emzee_Gruppe_Model_Eins_Zweidrei
Mage::getModel('gruppe/Eins_ZweiDrei'); //=> Emzee_Gruppe_Model_Eins_ZweiDrei
Mage::getModel('emzee_gruppe_model_eins_zweidrei'); //=> emzee_gruppe_model_eins_zweidrei
Mage::getModel('emZEe_Gruppe_modeL_EINS_ZweiDRei'); //=> emZEe_Gruppe_modeL_EINS_ZweiDRei

2. Beim Laden Variablen an das Model übergeben

Wenn ihr Mage::getModel() aufruft, könnt ihr als zweiten Parameter ein Array oder Objekt übergeben. Dieses Argument wird beim Laden des Models an den Constructor weiter gereicht und kann dort verarbeitet werden. Falls ein Model bestimmte Daten benötigt, um zu funktionieren, könnt ihr die Anforderungen im Constructor definieren und sicher sein, dass ihr immer ein lauffähiges Model erhaltet.

// In einer beliebigen Datei das Model mit den Constructor-Argumenten erstellen
$arg1 = new stdClass();
$arg2 = 'foo';
$model = Mage::getModel('beispiel/klasse', array("arg1" => $arg1, "arg2" => $arg2));

// in app/code/local/Emzee/Beispiel/Model/Klasse.php die Klasse erstellen
class Emzee_Beispiel_Model_Klasse extends Mage_Core_Model_Abstract
{

	/**
	 * Stellt mit den benötigten Argumenten ein jederzeit lauffähiges Model her.
	 *
	 * @param array $arguments
	 * @return void
	 */
	public function __construct(array $arguments)
	{
		$this->setArg1($arguments['arg1']);
		$this->setArg2($arguments['arg2']);
	}

}

3. Vollständige Klassennamen anstatt der Klassen-Id angeben

Üblicherweise wird ein Model nach dem Schema Mage::getModel(‚group/klasse‘) geladen. Man kann stattdessen aber auch einen vollständigen Klassennamen angeben:

$model = Mage::getModel('Mage_Catalog_Model_Product');

Sobald kein „/“ im String aufgetaucht, versucht Magento, die angegebene Klasse direkt zu laden. Eine Warnung vorweg: das sollte man nur ,acjem, wenn man weiß, was man tut. Normalerweise will man, dass von Extensions überschriebene Klassen verwendet werden. Falls man jedoch in einem Einzellfall auf die Funktionalität einer überschriebenen Methode angewiesen ist, kann man auf diesen Trick zurück greifen.

4. Die Gruppe kann in config.xml über <class> oder <model> definiert werden

Der erste Teil der Klassen-Id, die Gruppe (z.B. „catalog“), wird normalerweise so in der config.xml eines Moduls definiert:

<?xml version="1.0"?>
<config>
	<modules>
        <Firma_Modul>
            <version>0.0.1</version>
        </Firma_Modul>
    </modules>
	<global>
		<models>
			<gruppe>
				<class>Firma_Modul_Model</class>
			</gruppe>
		</models>
	</global>
</config>

Man sollte <class> verwenden, denn das ist der Standard. Wenn <class> leer ist (und nur dann), wird jedoch auch in <model> gesucht. Für eine eigene Gruppe würde somit auch das funktionieren:

<?xml version="1.0"?>
<config>
	<modules>
        <Firma_Modul>
            <version>0.0.1</version>
        </Firma_Modul>
    </modules>
	<global>
		<models>
			<gruppe>
				<model>Firma_Modul_Model</model>
			</gruppe>
		</models>
	</global>
</config>

5. Immer dieselbe Instanz mittels Mage::getSingleton() verwenden

Manchmal möchte man nicht mit jedem Aufruf von Mage::getModel() eine neue Instanz des Objekts erhalten, sondern immer genau dieselbe Instanz. Das ist vor allem dann nützlich, weil man sonst mehrere Kopien eines Objekts hat und die Änderungen der einen Kopie nicht in der anderen Kopie übernommen werden.

Um immer dieselbe Instanz zu verwenden, ruft man statt Mage::getModel(‚klassen/id‘) die Methode
$model = Mage::getSingleton('klassen/id');
auf. Beim ersten Call wird die Klasse in der Registry gespeichert (wer mit „Registry“ nichts anfangen kann: im Prinzip handelt es sich um ein Array, in dem Variablen gespeichert werden) und bei späteren Aufrufen wird die Klasse wieder aus der Registry herausgeholt.

Achtung: der Einsatz von Singletons ist nur manchmal sinnvoll. Wenn ihr z.B. Mage::getSingleton(‚catalog/product‘) verwendet, könnt ihr nicht einfach so das Produkt mit der Id 1 und das mit der Id 2 parallel vorhalten. Hinter dem Singleton versteckt sich immer nur das eine Objekt. Singletons sind eher ein Thema, wenn man zum Beispiel mit dem aktuellen User (der die Seite aufgerufen hat) oder seinem Warenkorb arbeitet, denn davon soll es pro Aufruf garantiert nur ein Stück geben.

Eine Antwort

  1. 24.07.2011

    […] 5 Dinge, die du über Mage::getModel() vielleicht nicht weißt […]