如何在plugin';s Observer.php?

如何在plugin';s Observer.php?,php,magento,Php,Magento,在我的插件的Model/Observer.php中,我有两个函数,它们对应于两个不同的事件,但我想将一个变量从第一个函数传递到下一个函数。我试过这样的方法: class ContactologyProduct_LogProductUpdate_Model_Observer { (...) public function beforeAddressSave(Varien_Event_Observer $observer) { $contactologyClientIdBeforeEdit

在我的插件的
Model/Observer.php
中,我有两个函数,它们对应于两个不同的事件,但我想将一个变量从第一个函数传递到下一个函数。我试过这样的方法:

class ContactologyProduct_LogProductUpdate_Model_Observer
{

(...)

public function beforeAddressSave(Varien_Event_Observer $observer) {

  $contactologyClientIdBeforeEdit = $this->getCustomerAddress();

  $this->setData('contactologyClientIdBeforeEdit', $contactologyClientIdBeforeEdit);  // won't work

}

public function afterAddressSave(Varien_Event_Observer $observer) {

  $contactologyClientIdAfterEdit = $this->getCustomerAddress();

  $contactologyClientIdBeforeEdit = $this->getData('contactologyClientIdBeforeEdit');  // won't work

  var_dump($contactologyClientIdBeforeEdit); // won't work
  var_dump($contactologyClientIdAfterEdit);

}

}
但是
setData()
不起作用,我得到错误:

Call to a member function setData() on a non-object
beforeaddressave()
函数中保存
$contactologyclientibeforeedit
的正确方法是什么,以便以后在
afterAddressSave()中访问它

您应该使用$observer而不是$this,但首先您应该查看事件的创建位置,因为您可以使用如下内容:

$contactologyClientIdBeforeEdit = $observer->getEvent()->getCustomerAddress();
然后,您可以在类中实现setData和getData,或者让类扩展Varien_对象类。 因此,我认为你会:

class ContactologyProduct_LogProductUpdate_Model_Observer extends Varien_Object {
public function beforeAddressSave(Varien_Event_Observer $observer) {
   $contactologyClientIdBeforeEdit = $observer->getCustomerAddress(); //or $observer->getEvent()->getCustomerAddress() look how the event data is set.
   $this->setData('contactologyClientIdBeforeEdit', $contactologyClientIdBeforeEdit);
}
public function afterAddressSave(Varien_Event_Observer $observer) {
   $contactologyClientIdAfterEdit = $observer->getCustomerAddress();
   $contactologyClientIdBeforeEdit = $this->getData('contactologyClientIdBeforeEdit');
}

setData()
中使用
$observer
而不是
$this
不确定您在这里做什么,但我没有看到
setData
方法,我怀疑您忽略了对象是通过引用传递的事实。如果函数A接收到一个对象,并将其传递给函数B,后者编辑同一对象,则函数A中的对象也会被修改
$this->getCustomerAddress()
正常-无需将其更改为
$observer->getCustomerAddress()
。无论如何,
$this->getData('contactologyclientibeforedit')
(我也尝试了
observer
而不是
this
)仍然只在第一个函数(设置它的地方)中返回值,在第二个函数中返回
NULL
。我用
var\u dump()选中了
$this
,它似乎指的是两个不同的观察者,在地址编辑之前:
#132
,在地址编辑之后:
#368
…除非您在类中做其他事情,$这是对ContactologyProduct\u LogProductUpdate\u Model\u观察者的引用。如果更改代码以扩展Varien_对象,它将可以访问setData和getData等方法。否则,我看不到如何定义
$this->getCustomerAddress()
,并返回一些内容。无论如何,您可以使用用户
Mage::register($key,$value)
其中,
$key
可以是“contactologyClientIdBeforeEdit”和
$value
来自
$observer->getCustomerAddress()
的数据,而不是setData(),对于getData(),可以使用
Mage::registry($key)
是的,
getCustomerAddress()
是我自己的函数。Mage注册表的工作原理与
set/get Data
-在第一个函数中返回值,但在第二个函数中返回
NULL
var_dump(Mage::registry(“contactologyclientidbeforedit”)
class ContactologyProduct_LogProductUpdate_Model_Observer extends Varien_Object {
public function beforeAddressSave(Varien_Event_Observer $observer) {
   $contactologyClientIdBeforeEdit = $observer->getCustomerAddress(); //or $observer->getEvent()->getCustomerAddress() look how the event data is set.
   $this->setData('contactologyClientIdBeforeEdit', $contactologyClientIdBeforeEdit);
}
public function afterAddressSave(Varien_Event_Observer $observer) {
   $contactologyClientIdAfterEdit = $observer->getCustomerAddress();
   $contactologyClientIdBeforeEdit = $this->getData('contactologyClientIdBeforeEdit');
}