Frage

Ich habe eine API-Integration mit einem Dritthändler erstellt. Ich habe meine eigenen geschaffen Mage::dispatchEvent Anrufe vor und nach der Kommunikation. Ich verwende diese meistens für den Protokollierung/Debug -Modus, aber jetzt habe ich die Möglichkeit, sie zu verwenden, um Daten von einem anderen, locker verwandten Modul zu manipulieren, das auch diese API verwenden würde.

Im folgenden Beispiel ist es möglich zu manipulieren $post_string In diesem lokalen Bereich basierend auf dem, was mein Beobachter tun kann?

Mage::dispatchEvent('my_api_delete_before', array('post_string'=>$post_string, 'my_cart'=>$this));

$result = $this->doApiCommunication($post_string);

Mage::dispatchEvent('my_api_delete_after', array('post_string'=>$post_string, 'result'=>$result, 'product'=>$product, 'cart_item_id'=>$_item->cartItemId));
War es hilfreich?

Lösung

Wenn $post_string ist eine Zeichenfolge, dann nein. Änderungen, die in der Beobachterklasse vorgenommen wurden, würden in diesem Bereich nicht angezeigt, da die Zeichenfolgen nicht auf Funktionen übergeben werden.

Dafür gibt es mehrere Lösungen:

Schnell, aber nicht empfohlen:

PHP gibt Ihnen eine Problemumgehung, indem Sie die Zeichenfolge erzwingen, durch Hinzufügen eines ein Hinzufügen eines Hinzufügens über die Funktion zu übergeben & Vor dem variablen Namen wie SO:

Mage::dispatchEvent('my_api_delete_before', array('post_string'=>&$post_string, 'my_cart'=>$this));

Aber der Grund, warum dies nicht empfohlen wird, als @dedmeet sagte in seinem Kommentar:

Die Verwendung von Call-Time-Pass-by-Referenz wird seit PHP Version 5.4.0 nicht unterstützt

Direkt von der PHP -Handbuch:

Notiz: Es gibt kein Referenzzeichen für einen Funktionsaufruf - nur für Funktionsdefinitionen. Funktionsdefinitionen allein reichen aus, um das Argument durch Referenz korrekt zu übergeben. Ab PHP 5.3.0 erhalten Sie eine Warnung mit der Aufschrift, dass "Call-Time Pass-by-Reference" bei Verwendung und in Foo (& $ a) veraltet ist. Und ab PHP 5.4.0 wurde eine Pass-für-Pass-by-Referenz-Call-Zeit entfernt, sodass es einen tödlichen Fehler erhöht.

Hier ist also, wie es so ist, dass es so ist, dass es ist

Reiniger und empfohlen:

Eine bessere Lösung wäre, a zu erstellen Varien_Object Weil der Unterricht immer mit Referenz übergeben wird. Und jede Klasse, die sich erstreckt Varien_Object und die Varien_Object gibt Ihnen selbst die Möglichkeit, die Getter und Setzer in Mangento zu verwenden.

$obj = new Varien_Object();

// Set a value for data variable
$obj->setFoo($bar);

// The previous function is the same as the following:
// In fact, the previous function will call setData with 'foo' and $bar as its paramteres
$obj->setData('foo', $bar);

// To get the value of 'foo' you will need to call any of the following functions:
$obj->getFoo();

$obj->getData('foo');    

Also um die implementieren Varien_object Im Beispiel des OP:

class Foo_Bar_Model_Communicator{

    public function someFunction(){
        /*
         * Assuming that $post_string is getting set here somehow
         * before the next line.
         */
        $eventData = new Varien_Data();

        $eventData->setData('post_string', $post_string);   
        $eventData->setData('cart', $this); 

        Mage::dispatchEvent('my_api_delete_before', array('event_data'=>$eventData));

        /* In this case, since we sent a Varien_Object as parameter,
         * whatever the Observer class does to the object, will be reflected
         * here as well.
         * We only need to make sure that we get the string back from the
         * Varien_Object instead of using $post_string.
         */
        $new_post_string = $eventData->getData('post_string');

        $result = $this->doApiCommunication($new_post_string);

        /*
         * We can do the same for the parameters for the next event, but it
         * wasn't part of the OP's question and it won't be needed since
         * there is no code following the dispatch event.
         *
         * However it would be a better idea to make the "before" & "after"
         * events have the same type of parameters which would be less 
         * confusing later on.
         */

        Mage::dispatchEvent('my_api_delete_after', array('post_string'=>$post_string, 'result'=>$result, 'product'=>$product, 'cart_item_id'=>$_item->cartItemId));
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top