Probleme bei erstem eigenen Modul

Hallo an alle!
Nach tagelangem Testen und nachlesen muss ich euch doch noch mit ner Anfängerfrage belästigen :wink:

Ich bin gerade dabei ein erstes eigenes Modul zu erstellen.
Ich schaffe es aber einfach nicht, dass die erstellte Funktion im Template nutzbar wird.

Meine metadata.php:


<?php
$sMetadataVersion = '1.0';

/**
 * Module information
 */
$aModule = array(
    'id'           => 'test',
    'title'        => 'test',
    'description'  => '',
    'thumbnail'    => '',
    'version'      => '1.0',
    'author'       => '',
    'extend'       => array(
        'oxubase' 	=> 'test/test'
    )
);
?>

Meine test.php:


<?php
class test extends test_parent //oxUBase
{
	public function testAusgabe(){
		return 'OK';
	}
}
?>

Das Modul ist im Backend aktiviert, unter “Installierte Shop-Module” wird das Modul auch angezeigt.

Die Ausgabe soll im Template start.tpl mit

[{$oView->testAusgabe()}]

erfolgen.
Das funktioniert aber nicht, in EXCEPTION_LOG.txt gibt’s den Eintrag

oxSystemComponentException-oxException (time: 2013-05-06 10:27:36): [0]: Function 'testAusgabe' does not exist or is not accessible! (Start)

Oxid-Version: 4.7.3 CE

Ich hoffe ihr habt vielleicht einen Tipp wo der Fehler liegen könnte, vielen Dank schon mal für eure Hilfe!

Grüße
Timm

oxubase ist nicht erweiterbar: http://wiki.oxidforge.org/Tutorials/List_of_not_overloadable_classes

[QUOTE=leofonic;123077]oxubase ist nicht erweiterbar[/QUOTE]

Hallo Frank,
danke für den Tipp. Ich hatte es zunächst erfolglos mit alist versucht. Die Klasse ist aber wohl auch nicht generell erweiterbar.

Zur Erklärung meines Ziels:
Ich möchte zur Anzeige von Angeboten als Datenherkunft nicht die Funktion getBargainArticleList aus alist.php verwenden, da ich ja dann vorher im Backend manuell die Artikel auswählen muss.
Die Ausgabe soll über

[{include file="widget/product/list.tpl" products=$oView->getBargainArticleList()}]

erfolgen (einige Parameter zur Übersichtlichkeit weggelassen).

Es sollen alle Artikel angezeigt werden, die einen UVP angegeben haben. Ich konnte dazu leider keine fertige Lösung finden und möchte nun die Funktionen getBargainArticleList aus alist.php und loadActionArticles aus oxarticlelist.php kopieren und modifizieren.

Wie du durch meine Frage sicher schon bemerkt hast, bin ich Oxid-Neuling.
Ist meine geplante Vorgehensweise überhaupt sinnvoll oder gibt es hier einen besseren Weg?
Welche Klasse erweitere ich für diesen Zweck?

@timm
Du möchtest wohl die oxviewconfig erweitern…
[U]Metadata.php:[/U]

/**
 * Module information
 */
$aModule = array(
    'id'           => 'sk_config',
    'title'        => 'SK Viewklasse',
    'description'  => 'Module for making Feeds globaly visible.',
    'thumbnail'    => '',
    'version'      => '1.0',
    'author'       => 'SK',
    'extend'       => array(
        'oxviewconfig' => 'sk/sk_config'
    )

Als Beispiel meine erweiterte oxviewconfig:

class sk_config extends sk_config_parent {

    protected $_blLoadActions = null;

    protected $_aTopArticleList = null;

    protected $_aNewArticleList = null;

    protected $_oFirstArticle = null;

    protected $_oCatOfferArticle = null;

    protected $_oCatOfferArtList = null;

protected function _getLoadActionsParam()
    {
        if ( $this->_blLoadActions === null ) {
            $this->_blLoadActions = false;
            if ( $this->getConfig()->getConfigParam( 'bl_perfLoadAktion' ) ) {
                $this->_blLoadActions = true;
            }
        }
        return $this->_blLoadActions;
    }

public function getReduziert()
    {
        if ( $this->_aArticleList === null ) {
            $this->_aArticleList = array();
            if ( $this->_getLoadActionsParam() ) {
                // start list
                $oArtList = oxNew( 'oxarticlelist' );
                $oArtList->loadActionArticles( 'oxreduced' );
                if ( $oArtList->count() ) {
                    $this->_aArticleList = $oArtList;
                }
            }
        }
        return $this->_aArticleList;
    }

    ...
    
    public function getIsUvp() {
    
    ....
    }

}

Vielleicht hilft es Dir etwas beim Verständnis.
Bei mir dient dieses Modul dazu, die Aktionen im ganzen Shop sichtbar zu machen.
Normalerweise sind diese nur von der Startseite sichtbar, dann kann die aufrufende Funktion nicht mehr initialisiert werden.

[B]und nun im Template mit [{$oViewConf->getReduziert()}][/B]

LG
Stephan

Du möchtest wohl die oxviewconfig erweitern…

Hallo Stefan,
das war der entscheidende Hinweis, vielen Dank!

Zwar funktionierte es mit meinem Modul trotzdem nicht sofort, nachdem ich aber Modulordner und -dateien nochmal neu erstellt hatte, lief alles.

Also, Problem gelöst! :slight_smile:

Hallo zusammen,

ich habe auch etwas in der Richtung gesucht. Echt super. Danke!

Jetzt würde ich das gerne noch dahingehend erweitern, dass ich eine Funktion habe mit der ich alle Aktionen abrufen kann, die aktiv sind.

Hat da jemand eine Hilfe.

Grüße

keno


$oActionList = oxnew('oxactionlist');
$oActionList->getList();

[QUOTE=leofonic;123264]


$oActionList = oxnew('oxactionlist');
$oActionList->getList();

[/QUOTE]

Hallo. Vielen Dank. Das ist es.

Und gibt es auch die Möglichkeit, aktionen in CMS-Seiten aufzurufen?

Grüße
Keno

klar, diese findest du mit der Hilfe der Forensuche.
Und es gibt noch eine Sourcecode Dokumentation, in der man nach Klassen und Funktionen suchen kann bzw. schauen, was es für Klassen und Funktionen gibt und was sie machen: http://docu.oxid-esales.com/CE/sourcecodedocumentation/

[QUOTE=vanilla thunder;123271]klar, diese findest du mit der Hilfe der Forensuche.
Und es gibt noch eine Sourcecode Dokumentation, in der man nach Klassen und Funktionen suchen kann bzw. schauen, was es für Klassen und Funktionen gibt und was sie machen: http://docu.oxid-esales.com/CE/sourcecodedocumentation/[/QUOTE]

Ja danke. Ich bin mir im klaren darüber. Und habe diese auch schon gelesen.
Man muss ja nicht gleich so losbellen.
ICH MÖCHTE AUCH KEINE KOMPLETTLÖSUNGEN HABEN. ^^

Und da hakt es grad mal wieder. Ich habe mir wie im Beispiel oben die ‘actionlist’ mit getList() ausgeben lassen.
Da die benötigten ClassMember aber protected sind, habe ich versucht mit phps ReflectionClass an die Werte zu kommen. Scheint aber nicht zu funktioniern. Und laut Doku gibt es auch sonst keine funktion, mit der ich da ran komme.
Ich sehe es jedenfalls nicht.

public function getActivatedActions()
	{
		$oActionList = oxnew('oxactionlist');
		$this->_actionClass = $oActionList->getList();
		$reflect = new ReflectionClass($this->_actionClass);
		//$property = $reflect->getProperties();
		 
		$property = $reflect->getProperty('_aArray');
		foreach ($property as $key => $value)
		{
			foreach ($value as $k => $v)
			{
				echo $k ." ". $v."<br/>";
			} 
		}
	}

geht es nur darum, ob die Action als aktiv geschaltet ist??
Vielleicht hilft Dir das

  1. Die Action ID=$aid (zb foreach aid aus aid-array)
  2. $oAction=oxNew( “oxactions” );
  3. $oAction->load( $aid );
  4. if ($oAction->oxactions__oxactive->value ==“1”) { dann bin ich aktiv}

[QUOTE=keno;123299]
Da die benötigten ClassMember aber protected sind, habe ich versucht mit phps ReflectionClass an die Werte zu kommen. Scheint aber nicht zu funktioniern. Und laut Doku gibt es auch sonst keine funktion, mit der ich da ran komme.
Ich sehe es jedenfalls nicht.[/QUOTE]
Welche Class-Member, für was benötigt? Ein bisschen was musst du schon erzählen.

Hallo.

Ich dachte es mir so.
Es sollen im Template alle aktiven Aktionen angezeigt werden.
Wenn ich es jetzt so mache, wie in dem Beispiel vor mir, dann müsste man jedesmal ,wenn neue Aktionen hinzukommen das im Template erweitern.
Deshalb erst abfragen welche sind aktiv, ids merken per foreach mit der funktion

public function getActionList($action)
	{
		if ( $this->_aArticleList === null )
		{
			$this->_aArticleList = array();
			if ( $this->_getLoadActionsParam() )
			{
				// start list
				$oArtList = oxNew( 'oxarticlelist' );
				$oArtList->loadActionArticles( $action );
				if ( $oArtList->count() )
				{
					$this->_aArticleList = $oArtList;
				}
			}
		}
		return $this->_aArticleList;
	}

laden.

Somit würde beim aktivieren/deaktivieren alles gleich uptodate sein.

Grüße
Keno

! Ein Banner ist auch eine Aktion und würde somit mitgeladen werden !
Also mach eine DB Query auf oxactions mit select oxid … where oxactive=1 und oxtype!=3, dann hast Du ein Resultset der OXIDs. Dann kannst Du zu jeder dieser Oxids die oxnew(oxactions) laden und die ganzen Actions in einem 2dimensionalen array ( array_name[index=action_nr][index2=actionarticle] ) an Dein TPL übergeben

[QUOTE=kalina.0404;123310]! Ein Banner ist auch eine Aktion und würde somit mitgeladen werden !
Also mach eine DB Query auf oxactions mit select oxid … where oxactive=1 und oxtype!=3, dann hast Du ein Resultset der OXIDs. Dann kannst Du zu jeder dieser Oxids die oxnew(oxactions) laden und die ganzen Actions in einem 2dimensionalen array ( array_name[index=action_nr][index2=actionarticle] ) an Dein TPL übergeben[/QUOTE]

Ok. Das war jetzt auch mein nächster Gedanke.

Vielen Dank an alle.

Keno

Mit der Zeile

if ( $this->_aArticleList === null ) 

wird die Artikelliste beim ersten Aufruf gecached so dass man damit sicher keine unterschiedlichen Aktionen angezeigt bekommt. Wg. Aktiv: das Snippet von mir liefert bereits nur die aktiven Aktionen.

Die Banner könnte man auch einfach rausfiltern per oxtype oder weil Banner keine Artikel haben.

$oActionList = oxnew('oxactionlist');
$oActionList->getList();

foreach ($oActionList as $oAction){
    $oArtList = oxNew( 'oxarticlelist' ); 
    $oArtList->loadActionArticles( $oAction->getId() );
    
    //Nur Aktionen mit Artikeln
    if (count($oArtList)){
    
        //Titel der Aktion
        echo "<br><br>";
        echo $oAction->oxactions__oxtitle;
        
        //Artikel der Aktion
        foreach ($oArtList as $oArticle){
            echo "<br>";
            echo $oArticle->oxarticles__oxtitle;
        }
    }
}