Class Extend Problem

Hallo Community,

ich stoße immer wieder auf das gleiche Problem.

Ich habe 2 Module, welche die gleiche Klasse vererbt bekommen und die gleiche Funktion ansteuern sollen.
Wenn ich nun beide Aktiviert habe, geht immer nur einer der beiden Funktionen

Metadata beider Dateien


'extend'       => array(
		''oxorderarticle' => pathToClass/name.php
....

Klassenbildung beider Dateien


class classname extend classname_parent {
  function xyz (){
    // hier arbeitet die function
     parent::xyz();
  }
}

Wo liegt das Problem. Gibt es keine Möglichkeit durch mehrere Module eine Klasse zu extenden?

Danke schonmal

Lg Chris

Das geht schon, nur da hast irgendwo einen Fehler eingebaut.
Versuch mal “.php” aus deiner metadata Anweisung zu entfernen

Ich habe jetzt herausgefunden, das wenn ich 2 mal den Extend ausführe, ich in einer der funktion ein parent::xys ausführen muss.

Je nach
Aaufrufreihenfolge. aber ist das nicht sehr unflexibel?

du musst grundsätzlich parent::function() aufrufen,
könnte ja sein, dass noch ein anderes Modul die selbe Funktion erweitern möchte.

Hey Vanilla,

das .php hab ich garnicht drin stehn :smiley:
Das hab ich hier im Forum nur ausversehen hinzugefügt.

Ich hab das Problem in letzter Zeit irgendwie öfters mal :frowning:

[QUOTE=vanilla thunder;159060]du musst grundsätzlich parent::function() aufrufen,
könnte ja sein, dass noch ein anderes Modul die selbe Funktion erweitern möchte.[/QUOTE]

Wenn ich das in beiden Modulen mache, erhalte ich einen Fehler.
Die Funktion besitzt die parent klasse nicht (indem falle oxorderarticle)

Das ist ja genau das Problem, was mich grad zur Verzweiflung bringt.

ah das ist kein Problem.
schau mal hier:
https://github.com/vanilla-thunder/bla-tinymce/blob/master/copy_this/modules/bla/bla-tinymce/core/blatinymceoxviewconfig.php
https://github.com/vanilla-thunder/bla-rfm/blob/master/copy_this/modules/bla/bla-rfm/core/blarfmoxviewconfig.php

zwei Module, die mehr oder weniuger zusammen gehören und die selben Funktionen benutzen/erweitern, die es nicht im parent class gibt.

Um es Bildlich zu zeigen, was ich probiert habe, und was beides NICHT geklappt hat :frowning:

Aber du rufst doch nirgendswo parent::deineFunktion() auf.

Irgendwie steh ich heute auf dem Schlauch. Das Problem ist mir immer mal unter gekommen, hat sich aber irgendwie von alleine erledigt. Aber heute sehe ich wahrscheinlich den Wald vor lauter Bäumen nicht.

na sicher tue ich das.
Hast du den Quelltext überhaupt angeschaut?

if(method_exists(get_parent_class(__CLASS__),__FUNCTION__) && parent::_getTinyCustConfig()) $aConfig = array_merge( $aConfig, [b]parent::_getTinyCustConfig()[/b] );

Also ich habe Version 2 (aus dem einen Anhang) noch mal probiert…
Ich komme in der einen Klasse in die stornoorder(); aber die andere wird einfach nicht angestoßen :frowning:

Hier mal der Quelltext

Das wird angestoßen


class ms_order_overview extends ms_order_overview_parent{
/**
	 * storno complete order
	 */
	public function stornoorder(){		
		$soxId = $this->getEditObjectId();
		$oOrder = oxNew("oxOrder");
		if ($soxId != "-1" && isset($soxId)) {
			// load object
			$oOrder->load($soxId);
			$oOrder->cancelOrder();
		}
		
// 		parent::stornoorder();
	}
}

Das nicht


class ms_amazon_order_overview extends ms_amazon_order_overview_parent {
public function stornoorder(){
		 /// HIER STEHT QUELLTEXT
//  		parent::stornoorder();
	}
}

Wenn ich jetzt bei beiden den parent::stornoorder() wieder entkommentiere. Erhalte ich eine Exception - Fehlende Funktion im Template

  • Function ‘stornoorder’ does not exist or is not accessible! (ms_order_overview)

Eingebunden sind beide Files in der Metadata wie folgt:


'extend'       	=> array(		'order_overview'	=>	'ms_orders/ms_ordermanagement/controllers/admin/ms_order_overview',
	),


'extend'       	=> array(		
		'order_overview'		=> 'ms_amazon/controllers/admin/ms_amazon_order_overview',
	),

Bin verzweifelt.

[QUOTE=vanilla thunder;159068]na sicher tue ich das.
Hast du den Quelltext überhaupt angeschaut?

if(method_exists(get_parent_class(__CLASS__),__FUNCTION__) && parent::_getTinyCustConfig()) $aConfig = array_merge( $aConfig, [b]parent::_getTinyCustConfig()[/b] );

[/QUOTE]

Ja Sorry - du hast recht. Das ist voll untergegangen, das es die gleiche Klasse aufruft :frowning:
Das Problem macht den Kopf schwer :frowning:

du kannst eine Funktion über parent::xyz() nur dann aufrufen, wenn die parent class diese Funktion auch hat.
Und wenn es diese dort eben nicht gibt, gibts den Fehler, den du bekommst.
Deswegen prüfe ich in meinem code Beispiel zuerst ob die parent class diese Funktion hat, und nur wenn es zutrifft, rufe ich diese auf. Das mache ich in beiden Modulen und muss mir keine Gedanken über die Reihenfolge, in der die Module aktiviert wurden, keine Sorgen machen.

[QUOTE=vanilla thunder;159071]du kannst eine Funktion über parent::xyz() nur dann aufrufen, wenn die parent class diese Funktion auch hat.
Und wenn es diese dort eben nicht gibt, gibts den Fehler, den du bekommst.
Deswegen prüfe ich in meinem code Beispiel zuerst ob die parent class diese Funktion hat, und nur wenn es zutrifft, rufe ich diese auf. Das mache ich in beiden Modulen und muss mir keine Gedanken über die Reihenfolge, in der die Module aktiviert wurden, keine Sorgen machen.[/QUOTE]

Hey danke dir!

Ich hab das jetzt mal eingebaut. Klappt alles.
Manchmal sieht man eben den Wald vor lauter bäumen nicht :slight_smile: