/** * Retrieve alert row by object parameters * * @param \Magento\Framework\Model\AbstractModel $object * @return array|false */ protected function _getAlertRow(\Magento\Framework\Model\AbstractModel $object) { $adapter = $this->_getReadAdapter(); if ($object->getCustomerId() && $object->getProductId() && $object->getWebsiteId()) { $select = $adapter->select()->from($this->getMainTable())->where('customer_id = :customer_id')->where('product_id = :product_id')->where('website_id = :website_id'); $bind = [':customer_id' => $object->getCustomerId(), ':product_id' => $object->getProductId(), ':website_id' => $object->getWebsiteId()]; return $adapter->fetchRow($select, $bind); } return false; }
/** * Before save action * * @param \Magento\Framework\Model\AbstractModel $object * @return $this */ protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object) { if (is_null($object->getId()) && $object->getCustomerId() && $object->getProductId() && $object->getWebsiteId()) { if ($row = $this->_getAlertRow($object)) { $object->addData($row); $object->setStatus(0); } } if (is_null($object->getAddDate())) { $object->setAddDate($this->_dateFactory->create()->gmtDate()); $object->setStatus(0); } return parent::_beforeSave($object); }
/** * Perform actions after object save * * @param \Magento\Framework\Model\AbstractModel $object * @return $this */ protected function _afterSave(AbstractModel $object) { $adapter = $this->_getWriteAdapter(); /** * save detail */ $detail = ['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, [':review_id' => $object->getId()]); if ($detailId) { $condition = ["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 = ['review_id = ?' => $object->getId()]; $adapter->delete($this->_reviewStoreTable, $condition); $insertedStoreIds = []; foreach ($stores as $storeId) { if (in_array($storeId, $insertedStoreIds)) { continue; } $insertedStoreIds[] = $storeId; $storeInsert = ['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; }
/** * Prepare data for save * * @param \Magento\Framework\Model\AbstractModel $visitor * @return array */ protected function _prepareDataForSave(\Magento\Framework\Model\AbstractModel $visitor) { return ['customer_id' => $visitor->getCustomerId(), 'session_id' => $visitor->getSessionId(), 'last_visit_at' => $visitor->getLastVisitAt()]; }