Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Mod 2.x: Zu beachten bei der Erstellung von Klassenerweiterungs-Modulen

    AGI

    • modified Team
    • Beiträge: 272
    • Geschlecht:
    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:

    Code: PHP  [Auswählen]
    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:

    Code: PHP  [Auswählen]
    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

    web28

    • modified Team
    • Beiträge: 9.404
    Hallo Andreas,

    danke für den Hinweis.

    Die Module werden überarbeitet.

    Es wird ein neue Methode secure_call_module_method hinzugefügt, die keine Parameter verändert.

    Gruss Web28

    AGI

    • modified Team
    • Beiträge: 272
    • Geschlecht:
    Wow, Danke.  :-)
    22 Antworten
    9287 Aufrufe
    06. Dezember 2012, 11:05:23 von IP-Projects.de
    6 Antworten
    3351 Aufrufe
    29. Juni 2012, 15:10:30 von cgnbalu
    3 Antworten
    2324 Aufrufe
    24. Oktober 2013, 18:18:14 von burrito
               
    anything