Ich wollte mich mal näher mit der Entwicklung von Zusatzfunktionen beschäftigen, war da aber leider nicht ganz erfolgreich. :mad:
Als Beispiel wollte ich eine Artikel-Liste von “N Zufallsprodukten” und die Artikel-Liste mit “Top N”-Produkten im Template verfügbar machen.
Um systematisch vorzugehen, habe ich zunächst die gewünschte Funktionalität entwickelt, indem ich direkt die betreffenden “core”- und “view”-Module geändert habe. Funktionell habe ich dabei jeweils analog die vorhandene “[B]Top5[/B]”-Liste nachgebildet.
Dies erforderte Änderungen in “[B]core/oxarticlelist.php[/B]”, “[B]views/alist.php[/B]” und “[B]views/oxubase.php[/B]”.
[B] Damit gelang es mir, die gewünschte Funktionalität zu realisieren.[/B]
Dann wollte ich diese [B]direkten [/B]Änderungen in den Shop-Modulen wieder entfernen, und diese in neue zugehörige Klassen-Module verlagern, wie man das halt so machen soll.
Zunächst habe ich im Verzeichnis “[B]modules/articlelist[/B]” ein Programm “[B]myarticlelist.php[/B]” angelegt, und dieses in Admin/Module mit “[B]oxarticlelist => articlelist/myarticlelist[/B]” aktiviert.
Dieses enthält die vorher direkt in “oxarticlelist.php” enthaltenen neuen Methoden, und ist wie folgt aufgebaut:
class myarticlelist extends myarticlelist_parent
{
public function loadTopNArticles($iArticles)
{
//has module?
$myConfig = $this->getConfig();
if ( !$myConfig->getConfigParam( 'bl_perfLoadPriceForAddList' ) ) {
$this->_blLoadPrice = false;
}
$sArticleTable = getViewName('oxarticles');
$sSelect = "select * from $sArticleTable ";
$sSelect .= "where ".$this->getBaseObject()->getSqlActiveSnippet()." and $sArticleTable.oxissearch = 1 ";
//$sSelect .= "and $sArticleTable.oxparentid = '' and $sArticleTable.oxsoldamount>0 ";
$sSelect .= "and $sArticleTable.oxsoldamount>0 ";
$sSelect .= "order by $sArticleTable.oxsoldamount desc limit $iArticles";
$this->selectString($sSelect);
}
public function loadRandomArticles($iArticles)
{
//has module?
$myConfig = $this->getConfig();
if ( !$myConfig->getConfigParam( 'bl_perfLoadPriceForAddList' ) ) {
$this->_blLoadPrice = false;
}
$sArticleTable = getViewName('oxarticles');
$sSelect = "select * from $sArticleTable ";
$sSelect .= "where ".$this->getBaseObject()->getSqlActiveSnippet()." and $sArticleTable.oxissearch = 1 ";
//$sSelect .= "and $sArticleTable.oxparentid = '' ";
$sSelect .= "order by rand() limit $iArticles";
$this->selectString($sSelect);
}
}
[B]Mit dieser Änderung funktionierte das Ganze weiterhin wie gewünscht![/B]
Dann habe ich im Verzeichnis “[B]modules/articlelist[/B]” ein Programm “[B]myoxubase.php[/B]” angelegt, und dieses in Admin/Module mit “[B]oxubase => articlelist/myoxubase[/B]” aktiviert.
Dieses enthält die vorher direkt in “oxubase.php” enthaltenen neuen Methoden, und ist wie folgt aufgebaut:
class myoxubase extends myoxubase_parent
{
/**
* Template variable getter. Returns Top N article list
*
* @return array
*/
public function getTopNArticleList($iArticles=BESTSELLERS_ITEMS)
{
if ( true || $this->_aTopNArticleList === null ) {
$this->_aTopNArticleList = false;
$myConfig = $this->getConfig();
if ( $myConfig->getConfigParam( 'bl_perfLoadAktion' ) ) {
// top 5 articles
$oArtList = oxNew( 'oxarticlelist' );
$oArtList->loadTopNArticles($iArticles);
if ( $oArtList->count() ) {
$this->_aTopNArticleList = $oArtList;
}
}
}
return $this->_aTopNArticleList;
}
/**
* Template variable getter. Returns Top N article list
*
* @return array
*/
public function getRandomArticleList($iArticles=CAROUSEL_PRODUCTS)
{
if ( true || $this->_aRandomArticleList === null ) {
$this->_aRandomArticleList = false;
$myConfig = $this->getConfig();
if ( $myConfig->getConfigParam( 'bl_perfLoadAktion' ) ) {
// random articles
$oArtList = oxNew( 'oxarticlelist' );
$oArtList->loadRandomArticles($iArticles);
if ( $oArtList->count() ) {
$this->_aRandomArticleList = $oArtList;
}
}
}
return $this->_aRandomArticleList;
}
}
Wenn jetzt aber in “[B]oxubase.php[/B]” der Code zum Laden der Listen in “[B]_loadActions[/B]”
protected function _loadActions()
{
$this->_aViewData['articlebargainlist'] = $this->getBargainArticleList();
$this->_aViewData['aTop5Articles'] = $this->getTop5ArticleList();
$this->_aViewData['aTopNArticlesList'] = $this->getTopNArticleList();
$this->_aViewData['aRandomArticlesList'] = $this->getRandomArticleList();
}
ausgeführt werden soll, dann meldet OXID-Shop, dass die Routine “getTopNArticleList()” [B]nicht definiert [/B]sei!
Mit dem Debugger (PhpEd) habe ich verifiziert, dass “[B]modules/articlelist/myoxubase.php[/B]” geladen wurde.
Ebenso, dass die Klasse “myoxubase” mit ihren Methoden definiert ist.
Warum “getTopNArticleList()” nicht definiert ist verstehe ich jetzt nicht mehr so recht, da ja durch die Modul-Klasse “myoxubase” diese Methode definiert sein sollte…
Was mache ich falsch?
Any idea, anybody?
Vielen Dank für jede Hilfe…