Magento中save()操作机制(_beforesave,_aftersave)

来源:互联网 发布:如何修改淘宝好评 编辑:程序博客网 时间:2024/05/18 14:15

每个save执行时都会要执行几步操作,如下:

public function save()_beforesave()    _resource{        _beforesave()            save        _aftersave()    }_aftersave
public function save(){    ...    try {        $this->_beforeSave();        if ($this->_dataSaveAllowed) {            $this->_getResource()->save($this);            $this->_afterSave();        }    ...}protected function _beforeSave(Mage_Core_Model_Abstract $object){    if (!$object->getId()) {        $object->setCreatedAt(Mage::getSingleton('core/date')->gmtDate());    }    if ($object->hasData('stores') && is_array($object->getStores())) {        $stores = $object->getStores();        $stores[] = 0;        $object->setStores($stores);    } elseif ($object->hasData('stores')) {        $object->setStores(array($object->getStores(), 0));    }    return $this;}protected function _afterSave(Mage_Core_Model_Abstract $object)    {        $adapter = $this->_getWriteAdapter();        /**         * save detail         */        $detail = array(            'title'     => $object->getTitle(),            'detail'    => $object->getDetail(),            'nickname'  => $object->getNickname(),        );        $select = $adapter->select()            ->from($this->_reviewDetailTable, 'detail_id')            ->where('review_id = :review_id');        $detailId = $adapter->fetchOne($select, array(':review_id' => $object->getId()));        if ($detailId) {            $condition = array("detail_id = ?" => $detailId);            $adapter->update($this->_reviewDetailTable, $detail, $condition);        } else {            $detail['store_id']   = $object->getStoreId();            $detail['customer_id']= $object->getCustomerId();            $detail['review_id']  = $object->getId();            $adapter->insert($this->_reviewDetailTable, $detail);        }        /**         * save stores         */        $stores = $object->getStores();        if (!empty($stores)) {            $condition = array('review_id = ?' => $object->getId());            $adapter->delete($this->_reviewStoreTable, $condition);            $insertedStoreIds = array();            foreach ($stores as $storeId) {                if (in_array($storeId, $insertedStoreIds)) {                    continue;                }                $insertedStoreIds[] = $storeId;                $storeInsert = array(                    'store_id' => $storeId,                    'review_id'=> $object->getId()                );                $adapter->insert($this->_reviewStoreTable, $storeInsert);            }        }        // reaggregate ratings, that depend on this review        $this->_aggregateRatings(            $this->_loadVotedRatingIds($object->getId()),            $object->getEntityPkValue()        );        return $this;    }

这里的resource里面的_beforesave()里面可以看作是save的预处理,在这里可以加入一些只要执行就要自动保存的数据作为预处理,例如:

if (!$object->getId()) {    $object->setCreatedAt(Mage::getSingleton('core/date')->gmtDate());}

这里就是在预处理created_at字段直接进行保存,_beforesave()之后执行save操作,然后执行_aftrsave()操作,这里是对一些数据(我理解的是非主表的数据表)中的一些数据进行保存,例如:

$detail = array(    'title'     => $object->getTitle(),    'detail'    => $object->getDetail(),    'nickname'  => $object->getNickname(),);$select = $adapter->select()    ->from($this->_reviewDetailTable, 'detail_id')    ->where('review_id = :review_id');$detailId = $adapter->fetchOne($select, array(':review_id' => $object->getId()));

这里就是对title,detail,nickname字段进行保存,在代码执行保存操作的时候用如下代码:

$review->setEntityId(1)     ->setEntityPkValue($productId)    ->setStoreId($data['stores'][0])    ->setStatusId($data['status_id'])    ->setAdminId($data['admin_id'])    ->save();
原创粉丝点击