Guten Morgen,
gerade bin ich auf einen Fehler in meine Modulen gestoßen, der die Zusammenarbeit mit anderen Modulen behindert.
Meine Module, darunter auch das Google-XML-Export Modul werde ich umgehend anpassen.
Damit andere nicht den gleichen Fehler machen, möchte ich das Problem kurz schildern:
Ich verwende in meinen Modulen unter anderem Klassenwerweiterungsmodule, welche die Klassen
admin/includes/classes/categories.php
includes/classes/main.php
erweitern.
Die Klasse admin/includes/classes/categories.php wird beispielsweise mit der Methode insert_product_after() erweitert.
Diese Methode erwartet zwei Parameter:
insert_product_after($products_data,$products_id)
Wichtig ist nun, dass die Methode
den jeweils ersten Parameter per return zurück gibt:
insert_product_after($products_data,$products_id) {
[...]
return $products_data;
}
Andernfalls werden andere Erweiterungen, die ebenfalls diese Methode benutzen nicht funktionieren.
Denn die aufrufende Klasse überschreibt mit dem Rückgabewert aus der Funktion den ersten Wert der Parameterliste welche an nachfolgende Methodenaufrufe weitergegeben wird.
Zum Beispiel hier:
class categoriesModules
{ [...] function call_module_method
() { $arg_list = func_get_args(); $function_call = $this->function_call; if (is_array($this->modules)) { reset($this->modules); foreach($this->modules as $class) { if (is_callable(array($GLOBALS[$class], $function_call))) { $arg_list[0] = call_user_func_array(array($GLOBALS[$class], $function_call), $arg_list); //Call the $GLOBALS[$class]->$function_call() method with $arg_list } } } return $arg_list[0]; //Returns only first parameter } [...]} Bei den
insert_before-Methoden der Categories-Klasse kann ich das Verhalten noch nachvollziehen.
Bei anderen Erweiterungsfunktionen würde ich mir zur Sicherheit vom Team eine "secure_call_method" wünschen, welche die übergebenen Methoden-Parameter nicht überschreibt.
unter anderem bei diesen Methoden:
categoriesModules.class.php :: remove_category()
categoriesModules.class.php :: delete_category_image()
categoriesModules.class.php :: copy_category_image()
categoriesModules.class.php :: categories_image_process()
categoriesModules.class.php :: insert_product_after()
categoriesModules.class.php :: remove_product()
categoriesModules.class.php :: delete_product()
Wenn dort die ersten Parameter nicht, oder sogar verändert zurückgegeben werden, kann das wirklich unerwünschte Auswirkungen haben.
Bis dahin gilt aber: gebt den ersten Parameter eine Methode in den Klassenerweiterungen per Return zurück!Viele Grüße
Andreas
Linkback: https://www.modified-shop.org/forum/index.php?topic=35898.0