Auslagern eines Blocks von der start.tpl auf eine separate Seite

Hallo,

ich versuche gerade den Block “Frisch eingetroffen” von der Startseite auf eine separate Seite zu verlagern. Dazu habe ich einen zusätzlichen Menüpunkt in die inc/infobox.tpl eingetragen über den die neue “novelties.tpl” aufgerufen wird - das funktioniert auch. In der novelties.tpl steht der Block:
[{if ($oView->getNewestArticles()|@count)>0 }]

[{/if}]
aus der start.tpl.
Dummerweise bekomme ich die Fehlermeldung:

Function ‘getNewestArticles’ does not exist or is not accessible! (Info)

Was mache ich falsch http://www.oxid-esales.com/sites/all/modules/smileys/packs/example/puzzled.png

Gruß Uwe

Hallo,

ich wäre Euch dankbar, wenn ich irgendeinen Tipp erhalten könnte und wenn es der ist, das das Thema zu weit geht, hier nicht hingehört oder was ähnliches.

Gruß Uwe

Hallo Uwe,

keine Angst, Dein Eintrag geht nicht zu weit und gehört ganz genau hier hin.

Wenn Du schreibst “… das funktioniert auch …”, meinst Du was ganz genau, was funktioniert?

Kurz darauf schreibst Du, dass Du eine Fehlermeldung bekommst, dass es also nicht funktioniert?

Gruß


Marco Steinhäuser
Community Guide
OXID eSales AG

Hallo Marco,

ich habe mir mit “Glossy Accordion Menu” ein eigenes Menü für diverse Contentseiten eingerichtet. Die Seitenaufrufe lege ich im infobox.tpl an. Da steht dann entweder ein Verweis auf eine CMS-Seite aus dem Admin-Bereich (funktioniert hervorragend) oder wie in diesem Fall auf eine separete tpl-Datei, die den entsprechenden Code-Block enthält.

Was funktioniert, ist das Aufrufen der Seite “novelties.tpl”. Was nicht funktioniert ist das korrekte Ausführen des Code-Blocks, der ursprünglich aus der start.tpl stammt.

Ich hoffe, ich habe mich jetzt etwas verständlicher ausgedrückt.

Gruß Uwe

Ich weiß nicht ob du hier an der richtigen Stelle fragst. Du versuchst eine Funktion aufzurufen: $oView->getNewestArticles(), diese ist von der Startseite aus verfügbar, in deinem neuen Template ist diese Funktion aber nicht verfügbar. Darum bekommst du die Fehlermeldung: Function ‘getNewestArticles’ does not exist or is not accessible!

Ich kenn mich weder mit php noch mit den Funktionen genau genug aus um dir helfen zu können. Vielleicht fragst du mal im Entwicklerforum wie du diese Funktion auch in einem anderen Template nutzen kannst. Denn so wie es scheint ist $oView->getNewestArticles() keine globale Funktion die man von überall aufrufen kann.

LG Carolin

http://www.andro-shop.com Oxid PE 4.0.1

Hallo Uwe,

wie sieht der Link zu den neuen Seite aus? Denn ob und welche Funktionen im Template vorhanden sind hängt damit zusammen welche view Klasse (php) benützt wird. Also poste einfach mal den Link zu deiner “novelities” und ich kann dir sicher weiter helfen.

Hallo Carolin,

danke für die Antwort. Du hast das Thema erkannt. Im Prinzip ist mir klar, dass die Funktion nur für die Startseite verfügbar ist (siehe views/start.php). Da auch ich mich mit PHP nicht auskenne (ich versuche langsam hinter die Geheimnisse objektorientierter Programmierung zu kommen), brauche ich auch nur einen kleinen Hinweis, dann wirds schon gehen.

Gruß Uwe

Hallo Uwe,

bitte sag mir doch wie dein Link aussieht. Das ist wirklich relevant, denn z.T. abhängig von der View stehen dir Objekte und Methoden im Template zur Verfügung…

Hallo MaFi,

der Link steht in der infobox.tpl und sieht folgendermaßen aus:

<a class="menuitem" href="[{ oxgetseourl ident=$oViewConf->getSelfLink()|cat:"cl=info&tpl=novelties.tpl" }]" >[{ oxmultilang ident="NOVELTIES" }]</a>

Für eine Hilfe wäre ich dankbar.

Gruß Uwe

Moin Uwe,

genau da liegt das Problem. Mit dem “cl=info” lädst du die View Klasse “info.php” und hast in der Variable “oiew” dann alle Methoden dieser Viewklasse zur Verfügung. Leider ist die Methode “getNewestArticles” in der View Klasse “start.php” definiert. Bei der “start.php” kann man aber leider nicht das Standardtemplate mit “tpl=XYZ” überschreiben. So fällt mir als einfachste Möglichkeit nur ein das du eine eigene Viewklasse anlegst (angeleht an info.php) und dort die “getNewestArticles” definierst.

Ich hoffe ich konnte helfen.

Mathias

Hallo MaFi,

ich habe es fast vermutet. Wäre es möglich als Link-Parameter “cl=start” mitzugeben ? Ansonsten erst mal Danke, das hat mir schon geholfen.

Gruß Uwe

Hi Uwe,

wie oben schon gesagt kannst du nicht “cl=start” mitgeben, denn dann wird auf jeden Fall die start.tpl gerendert und nicht dein Template

Grüße

Mathias

Hallo Mathias,

hat zwar etwas etwas gedauert, bin mir auch nicht sicher, ob das wirklich die feine englische Art war, wie ich das gebaut habe, aber meine erste View-Klasse für die Neuheitenseite funktioniert. Letzte Frage zu dem Thema:

Jetzt steht bei mir in der URL für diese Seite so aus: http://localhost/index.php?cl=novelties

Das ist nicht so toll. Wie könnte ich das so hinbekommen, dass da etwas Klartext steht?

Gruß Uwe

Hallo Uwe,

was genau ist mit “Klartext” gemeint? Kannst Du vielleicht kurz erörtern, wie Du die nichtfeinenglische Art eingebaut hast? Geht es vielleicht um sog. “sprechende URLs”?

Gruß


Marco Steinhäuser
Community Guide
OXID eSales AG

Kannst du anstatt der URL nicht unter “SEO” im Adminbereich was anderes definieren?

Hallo zusammen,

mit nicht feiner englischer Art meinte ich meine Klasse. Ich habe einfach einen Teil des Codes aus der info.php und start.php in meiner Klasse wiederverwendet, aber nicht die in vorher genannten Dateien enthaltenen Klassen zu erweitern. Dadurch entsteht natürlich doppelter Code -> nicht die feine englische Art.

Caroline,

bestend Dank. Habe den Hinweis umgesetzt. Funktioniert alles so wie gewollt.

Gruß Uwe

Hallo Uwe,

wann immer Du eine neue View anlegst wirst ein bisschen doppelten Code haben. So musst du ja die Funktion “render” für jede View definieren. Jedoch spielst du auf die komplette Kopie der Methode “getNewestArticles” an. In diesem Fall musst du eine Kopie nutzen, da diese Methode nur für eine einzelne View gedacht war. Willst eine Methode in allen Templates nutzen schreibe eine Erweiterung der “oxviewconfig”. Deren Methoden sind in allen Views vorhanden.

Grüße

Mathias

Schon gut - hab’s hinbekommen. Allerdings in oxview statt oxviewconfig.

/**
* Newest article list
*
* @var array
*/
protected $_aNewArticleList = null;

/**
* Template variable getter. Returns newest article list
*
* @return array
*/
public function getNewestArticles()
{
if ( $this->_aNewArticleList === null ) {
$this->_aNewArticleList = array();

            $oArtList = oxNew( 'oxarticlelist' );
            $oArtList->loadNewestArticles();
            if ( $oArtList->count() ) {
                $this->_aNewArticleList = $oArtList;
            }
        
    }
    return $this->_aNewArticleList;
}

—>oxview.php

start.php überschreibt sowohl die Methode als auch die Eigenschaft. Bis jetzt funzt alles.

Warum sind diese Funktionen eigentlich nur in start definiert? Die gehören doch nun wirklich in die Superklasse aller Views. (Wink…Betonpfeiler)