Neuste Artikel anzeigen

Hallo

Ich möchte eine Erweiterung erstellen, mit welcher die neusten Artikel der letzten 30 Tage angezeigt werden. Dank Hilfe habe ich das untenstehende Modul erhalten (SQL stimmt noch nicht).

Darin wird die Klasse oxView um die Klasse newestArticles erweitert.

<?php 
class newestArticles extends oxView { 
    protected $_sThisTemplate = 'newestarticles.tpl'; 
     
    public function render() { 
        $aList = oxNew('oxarticlelist'); 
        $aList->selectString(' 
            select 
                * 
            from 
                oxarticle 
            order by 
                oxinsert asc, 
                oxtimestamp asc 
        '); 
         
        $this->_aViewData['newestarticles'] = $aList; 
        return parent::render(); 
    } 
}

Ich habe nun das Template ‘newestarticles.tpl’ mit dem folgenden Inhalt erstellt.

[{assign var="template_title" value="Neue Arikel"}] 
[{include file="_header.tpl" title=$template_title location=$template_title}] 
<div class="box">

      [{foreach from=$oView->newestArticles() item=actionproduct name=newestarticles}]
        [{include file="inc/product.tpl" product=$actionproduct testid="action_"|cat:$actionproduct->oxarticles__oxid->value test_Cntr=$smarty.foreach.newestarticles.iteration}]
    [{/foreach}]


</div>
[{ insert name="oxid_tracker" title=$template_title }] 
[{include file="_footer.tpl"}] 

Wenn ich nun das Template über die url /index.php?cl=view&tpl=newestarticles.tpl aufrufe, erhalte ich die Meldung “EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND”

Hat jemand eine Idee, an was es liegen kann, dass ich keine Daten ausgeben kann?

Soweit ich das sehen konnte wird die Meldung erzeugt, wenn es eine Klasse nicht bzw. gar nicht definiert ist. Vielleicht sollte man die Fehlermeldung im OXID ändern, und dort den Namen der Klasse mit angeben die fehlt => core/oxutilsobject.php

ach mist, ich wollte schon die ganze zeit antworten.

du hast simpel einen fehler beim URL aufruf gemacht.

/index.php?cl=newestArticles

muss es heissen. der cl parameter muss immer den klassennamen enthalten. der “tpl” parameter ist nicht falsch, aber in dem fall nicht nötig :slight_smile:

Danke für die Antwort. Hat auch was gebraucht. Nun bekomme ich eine neue Fehlermeldung.:stuck_out_tongue:
Und zwar scheint die Funktion “getActiveLangAbbr” nicht verfügbar zu sein.

Function 'getActiveLangAbbr' does not exist or is not accessible! (newestArticles) 

ich kenne da zufällig jemanden, der das Module erstellen kann… Mail per PM :wink:

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:

  1. Die init() Methode am Anfang kannst du weglassen. Es reicht, wenn du zu Beginn deiner Klasse folgendes schreibst:
    protected $_sThisTemplate = ‘newestarticles.tpl’;

  2. 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.

  1. 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.

  2. 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

Hallo,

danke für die hinweise aber so richtig werde ich immernoch nicht richtig schlau daraus.
Gibt es hier nicht irgendwo eine Idiotensichere Anleitung für Anfänger um das von Grund auf zu verstehen.Wie es im Oxid mit Modulen und Klassen… gehalten wird.

Also das hat nun eigentlich kaum was mit Oxid zu tun - das ist eigentlich alles recht gängige Praxis der objektorientierten Programmierung unter PHP.
Evtl. schaust du mal hier nach: http://www.anzido-akademie.de (neue Termine gibt’s in Kürze)

mfg
urban

Danke übrigens für deine Ausführungen. Die Auslagerung der Methode in ein Core-Modul hat noch nicht geklappt. Werde ich aber auch noch hinbekommen.

Betreffend Rene’s Frage. Es stimmt schon, dass man die Grundkenntnisse aus fast jedem PHP-Buch lernen kann. Für Oxid-Spezifische Probleme wie zum Beispiel “Warum kann man einige Klassen nicht überladen?” oder “Welche Klasse sollte ich erweitern, wenn ich eine Funktion xy einbauen will” gibt es darin aber keine Infos. Da wäre es wirklich gut, wenn es einige Tutorials geben würde.