Eigene Aktion auslesen / Modul

Hi zusammen,

möchte mehrere verschiedene Aktionen ausgeben und hab mir dafür die
oxArticleList erweitert:


<?php

class womenlist extends oxArticleList
{
    protected $_oWomenList;
    
			public function getWomenArticles(){
				if(!$this->_oWomenList){
				$this->_oWomenList = oxNew("oxarticlelist");
				$this->_oWomenList->loadAktionArticles("oxwomen");
			}
		return $this->_oWomenList;
		}
}

So möchte ich dann übers Tempalte zugreifen, aber das passt natürlich hinten und vorne noch nicht:



[{foreach from=$oView->getWomenArticles() item=accessoryproduct name=test_women}]
  [{include file="inc/last_seen_product.tpl" size="small" product=$accessoryproduct}]
[{/foreach}]


Muss da noch ein Getter mit rein?
Wie muss ich jetzt das Ganze im Backend unter Module zuweisen?
Ist das oxView?

Vielen Dank und allerbeste Grüße vom Chris

Habs jetzt folgendermaßen versucht, leider kommt immer noch die nachstehende
Fehlermeldung.

Modulaufruf im Admin:


oxarticlelist => womenlist

Modul:


<?php

class womenlist extends womenlist_parent
{
    protected $_oWomenList;
    
			public function getWomenArticles(){
				if(!$this->_oWomenList){
				$this->_oWomenList = oxNew("oxarticlelist");
				$this->_oWomenList->loadAktionArticles("oxwomen");
			}
		var_dump($this->_oWomenList);
		return $this->_oWomenList;
		}
}

Template:


[{include file="inc/rightlist.tpl" list=$oView->getWomenArticles() altproduct=$product test_Type=women}]

Die Fehlermeldung:


Function 'getWomenArticles' does not exist or is not accessible! (Start)

Wäre toll, wenn mir da jemand einen Tip geben könnte.

Allerbeste Grüße und Danke,

Chris

Die Fehlermeldung sagt, dass die Funktion im View Start nicht verfügbar ist.

Bring es also dort unter. Nicht oxarticleslist erweitern sondern start oder sogar oxubase wenn es in mehreren Views verfügbar sein soll. Aber Vorsicht: Erweiterung von oxubase kann sich nachteilig auf die Performance auswirken.

Gruß
Stefan

Hi Stefan,

vielen Dank für Deinen Hinweis. Das heißt also, dass ich das Modul
so eintragen muss:


oxstart => womenlist

Ich möchte das Teil eigentlich “Crossover” zur Verfügung haben.
Also dann doch:


oxubase => womenlist

Oxubase wird ja von Articlelist extended, soweit ich das richtig sehe.

Besten Dank und viele Grüße,

Chris

Okay, ich habs, es muss
start => womenlist heißen, dann werden die Datensätze auch aus der eigenen Aktion ausgelesen :slight_smile:

Natürlich muss man auch Artikel da reinhängen :wink: Hatte ich nämlich vergessen.

Vielen Dank und allerbeste Grüße vom Chris

Nicht oxstart sondern nur start.

Ok, du hast es schon selbst bemerkt.

Noch ne weitere Frage, wie hänge ich das Modul der oxubase an? Wenn ich die Modulzuweisung wieder ändere, is wieder die “Nicht gefunden” Fehlermeldung präsent.

Vielen Dank nochmal für Deinen Hinweis :slight_smile:

Allerbeste Grüße vom Chris

Hier also noch die komplette Lösung:

  • Neues Modul mit Namen ownbenefits.php unter Module in einem eigenen Ordner ownbenefits mit folgendem Inhalt anlegen:

<?php

class ownbenefits extends ownbenefits_parent
{
    protected $_oMenList;
    protected $_oWomenList;    
    
			public function getMenArticles(){
				if(!$this->_oMenList){
				$this->_oMenList = oxNew("oxarticlelist");
				$this->_oMenList->loadAktionArticles("oxmen"); // Aktionsname
			}
			
		return $this->_oMenList;
		}
		
			public function getWomenArticles(){
				if(!$this->_oWomenList){
				$this->_oWomenList = oxNew("oxarticlelist");
				$this->_oWomenList->loadAktionArticles("oxwomen"); // Aktionsname
			}
		return $this->_oWomenList;
		}		
		
}

Im Template dann folgendes eintragen:
(Für die Mädels dann natürlich entsprechend umbauen)


[{if $oView->getMenArticles()}]
[{include file="inc/start_rightlist.tpl" list=$oView->getMenArticles() altproduct=$product test_Type=man}]
[{/if}]

Im Backend unter Grundeinstellungen -> Systemeinstellungen -> Module noch folgendes eintragen:


start -> ownbenefits/ownbenefits

Im Backend im Modul Kundeinformationen eine neue Aktion anlegen und in der
Datenbank entsprechend umbenennen und dann in der jeweiligen loadAktionArticles entsprechend eintragen. Man kann natürlich auch die kryptische ID verwenden.

Natürlich auch noch entsprechende Artikel in der Aktion zuweisen net vergessen!

Das wars :slight_smile:

Viele Grüße vom Chris

[QUOTE=coarsy;41048]Noch ne weitere Frage, wie hänge ich das Modul der oxubase an? [/QUOTE]
Gar nicht.

oxubase kann man nicht überladen…

Mit oxubase funktioniert das Einbinden nicht. Das muss irgendwas mit Beschränkungen im Oxid-System zu tun haben.

Ich hatte die Funktion testhalber mal in oxubase direkt reingeschrieben. Dann funktioniert es. Das ist aber natürlich kein akzeptables Vorgehen.

Probiert habe ich auch das Modul mehreren Views zuzuweisen:

z. B. so:


start => womenlist/womenlist
content => womenlist/womenlist

Damit hatte ich die Funktion dann sowohl in start.tpl als auch in content.tpl zur Verfügung.

@avenger

Gibt es bezüglich des Überladens von Klassen eine Dokumentation: was geht und was nicht geht?

Hi Stefan,

hier ist ne Liste:
http://www.oxid-esales.com/forum/showthread.php?p=39646

Und hier:
http://wiki.oxidforge.org/List_of_not_overloadable_classes

Hallo coarsy,

danke, ist eine sehr nützliche Info.

Hat das mal jemand getestet? Ich erhalte folgende Meldung…

Warning: Cannot modify header information - headers already sent by (output started at /var/www/443/modules/ownbenefits/ownbenefits.php:15) in /var/www/443/core/oxutilsserver.php on line 107

Hi Roland,

bei mir läuft das ohne Probleme und auch ohne Warnings :slight_smile:
Eingebunden auf der Startseite und in System aufgerufen mit:

start => ownbenefits/ownbenefits

Allerbeste Grüße vom Chris

Danke, nun funktioniert es. War ein Schreibfehler im Code. Welche Klasse muss ich nun noch überladen, wenn ich die Produkte auch auf den Kategorienseiten anzeigen will?

Bitte, bitte! Hast Du content => ownbenefits/ownbenefits schon probiert? Ansonsten einfach mal sämtliche Klassen durchprobieren, irgendeine muss ja tun :slight_smile:

Hi zusammen mal wieder,

muss diese Thematik nochmal aufgreifen.
Zwar hätte ich gerne, dass die Funktion loadAktionArticles alles via Zufall wieder gibt.
Wie überlade ich quasi die ursprüngliche Funktion in oxarticlelist mit meiner modifizierten Funktion
um updatesicher zu bleiben?

Möchte also nur das SQL wie folgt ändern:


        $sSelect = "select $sArticleFields from oxactions2article
                              left join $sArticleTable on $sArticleTable.oxid = oxactions2article.oxartid
                              left join oxactions on oxactions.oxid = oxactions2article.oxactionid
                              where oxactions2article.oxshopid = '$sShopID' and oxactions2article.oxactionid = $sActionID and $sActiveSql
                              and $sArticleTable.oxid is not null and " .$oBaseObject->getSqlActiveSnippet(). "
                              order by rand() LIMIT 15";

Das muss doch irgendwie eleganter gehen, als im Core rumzupfuschen…

Allerbeste Grüße und Dankeschön vom Chris

<?php // yourclass Als Modul eintragen: oxarticlelist => yourclass
class yourclass extends oxArticleList 
  {
  public function loadAktionArticles( $sActionID )
    {       	
		...
    }
}

Meine Güte, das war ja jetzt wirklich easy :slight_smile:

Ich danke Dir vielmals!

Schönen Abend noch und beste Grüße vom Chris