Hallo Roland,
wie an anderer Stelle angedeutet, will ich hier gerne ein paar hilfreiche Tipps zu deinem Problem geben. Ich gehe dabei mal von dem Code-Beispiel aus, das du an erwähnter anderer Stelle gepostet hattest, da dieses ja schon einige Verbesserungen enthielt im Vergleich zu dem hier geposteten:
<?php
class newestarticles extends oxUBase {
public function init()
{
parent::init();
$this->_sThisTemplate = 'newestarticles.tpl';
}
public function render()
{
$this->_aViewData['newestarticles'] = $this->getnewarticles();
parent::render();
return $this->_sThisTemplate;
}
public function getnewarticles()
{
$sQuery = "SELECT * FROM oxarticles LIMIT 10";
$aList = oxNew('oxarticlelist');
$this->_aList = $aList->selectString($sQuery);
return $this->_aList;
}
}
?>
Fangen wir mal beim Hauptproblem an:
Die Methode selectString() - die ursprünglich in oxList definiert ist, sorgt dafür, dass das aktuelle Klassen-Objekt (oxArticleList) eine Eigenschaft _aArray bekommt, die genau die Liste von Objekten enthält, die du benötigst. Diese Eigenschaft ist aber protected, weshalb man im Rahmen einer view-Klasse nicht darauf zugreifen kann.
Für genau diesen Fall gibt es aber einen getter: oxList::getArray(). Dieser getter liefert dir die gewünschte Liste zurück. Prinzipiell muss der ensprechende Aufruf also in etwa so aussehen:
<?php
public function getNewArticles()
{
$sQuery = "SELECT * FROM oxarticles LIMIT 10";
$oArticleList = oxNew('oxarticlelist');
$oArticleList->selectString($sQuery);
return $oArticleList->getArray();
}
Im Template kannst du nun genau in derselben Art und Weise auf die Werte zugreifen wie es OXID in den Standard-Templates auch tut.
Nun gibt es aber noch ein paar Dinge zum Lösungsansatz generell zu sagen:
-
Die init() Methode am Anfang kannst du weglassen. Es reicht, wenn du zu Beginn deiner Klasse folgendes schreibst:
protected $_sThisTemplate = ‘newestarticles.tpl’;
-
Es ist unnötig, den Returnwert von $this->getnewarticles() in das array $this->_aViewData zu packen, wenn du im Template direkt die Methode getNewArticles() aufrufst:
[{foreach from=$oView->getNewArticles() item=actionproduct name=newestarticles}]
...
[/foreach]
Du rufst ja hier den getter getNewArticles() direkt auf. Das $this->_aViewData würdest du nur benötigen, wenn du auf eine Variable $newestarticles zugreifen wolltest. Wenn du beides tust, verschwendest du Ressourcen, weil die Methode getNewArticles() 2 x aufgerufen wird.
-
Der Inhalt der Methode getNewArticles() hat in einer view-Klasse im Grunde nichts zu suchen. Das ist core-Funktionalität, die in einem Modul der Klasse oxArticleList untergebracht werden sollte. Vielleicht willst du diese Liste mit neuen Artikeln ja irgendwann mal auch an anderer Stelle anzeigen - dann müsstest du denselben Code auch noch in eine weitere view-Klasse packen. Das ist nicht gut - ein und dieselbe Funktionalität sollte auch nur einmal als Code vorkommen.
-
Ich rate dazu, sich für eine Namenskonvention für Klassen- und Methodennamen zu entscheiden. CamelCase ist dafür heute weitgehend Standard. Außerdem macht es Sinn, den Typ einer Variable durch den vorangestellten Kleinbuchstaben zu kennzeichnen. oxNew() z. B. instanziiert ein Objekt. Daher sollte der Rückgabewert immer $oSomething heißen. $aList = oxNew(‘oxArticleList’) macht nicht wirklich Sinn.
Ich hoffe, das war einigermaßen verständlich und hilfreich.
mfg
urban