Hallo,
ich habe bisher durch „try and error“ mehr oder weniger alles hinbekommen was ich wollte, bezüglich Oxid und PHP OOP. Allerdings möchte ich das Ganze nun strukturierter und „richtig(er)“ angehen. Ich habe in den letzten Tagen viel zu Oxid und PHP OOP gelesen und ich denke, dass ich viel Grundlegendes verstanden habe. Allerdings gibt es noch einige Sachen die ich ganz verstehe und dazu hätte ich paar Fragen.
Mit oxNew und einem verweis per namespace auf die User-Klasse, erstelle ich ein neues Objekt und kann dann auf die entsprechenden Eigenschaften und Methoden dieser Klasse zugreifen. Soweit klar.
$user= oxNew(\OxidEsales\Eshop\Application\Model\User::class);
Jetzt gibt es auch fälle wo kein neues Objekt erzeugt wird aber ein Zugriff auf die Eigenschaften und Methoden dieser Klasse zugreifen trotzdem möglich sind. Beispiel aus der Model/Order.php.
private function isValidPayment($basket)
{
$paymentId = $basket->getPaymentId();
$paymentModel = oxNew(EshopPayment::class);
$paymentModel->load($paymentId);
$dynamicValues = $this->getDynamicValues();
$shopId = $this->getConfig()->getShopId();
...
}
Wie man sieht wird hier kein neues Objekt aus der Klasse Basket erzeugt aber ein Zugriff auf die Eigenschaften und Methoden ist trotzdem möglich.
$paymentId = $basket->getPaymentId();
Liegt es daran, dass das bereits erstellte (wo auch immer) Objekt in die Funktion übergeben wurde? private function isValidPayment($basket)
Allerdings wird in der Order.php kein $Basket Objekt erzeugt. Kann mir das jemand erläutern?
Des Weiteren gibt es auch folgende Fälle:
$oDb = \OxidEsales\Eshop\Core\DatabaseProvider::getDb();
$sQ = “query“;
$oDb->execute($sQ);
Oder
$soxAddressId = \OxidEsales\Eshop\Core\Registry::getSession()->getVariable();
Hier wird ja nicht direkt mit oxNew und einem Verweis auf die Klasse gearbeitet. Greife ich in dem Fall nicht auf die ganze Klasse zu, sondern direkt auf eine Methode dieser Klasse? Aber müsste ich selbst dann nicht mit oxNew ein neues Objekt erstellen? Fragen über Fragen.
Dann habe ich mal ein Testmodul geschrieben. Ganz simpel zum testen.
namespace gajel\boni\Model;
class Order extends Order_parent
{
protected function myFunction()
{
$oDb = \OxidEsales\Eshop\Core\DatabaseProvider::getDb();
$sQ = "update oxuser set oxurl='123456' where oxid='oxdefaultadmin'";
$oDb->execute($sQ);
}
}
Modul wird erkannt aber die eigentliche Funktion wird nicht ausgeführt. Bennen ich die Funktion allerdings in eine bereits bestehende Funktion und arbeite dann mit parent::
wird diese Funktion dann ausgeführt.
namespace gajel\boni\Model;
class Order extends Order_parent
{
protected function _setOrderStatus()
{
parent::_setOrderStatus()
$oDb = \OxidEsales\Eshop\Core\DatabaseProvider::getDb();
$sQ = "update oxuser set oxurl='123456' where oxid='oxdefaultadmin'";
$oDb->execute($sQ);
}
}
Dann wäre noch interessant zu wissen was die “sinnvollere” Methode ist um mit der DB zu kommunizieren. Ganz normal über die Methoden der Klassen (getDb) oder über die sogenannten Magic Getters (https://docs.oxid-esales.com/developer/en/6.1/modules/using_database.html)?
Wie ihr seht, sind da noch eine Frage offen und würde mich freuen wenn wir diese evtl. zusammen “erörtern” können. Sicherlich auch hilfreich für andere die sich in das Thema einarbeiten wollen.
Grüße