Special == 'product' && !$this->Application->IsAdmin()) { // rev.product should auto-link return ''; } return parent::getMainSpecial($event); } /** * Checks REVIEW/REVIEW.PENDING permission by main object primary category (not current category) * * @param kEvent $event */ function CheckPermission(&$event) { if ($event->Name == 'OnAddReview' || $event->Name == 'OnCreate') { $perm_helper =& $this->Application->recallObject('PermissionsHelper'); /* @var $perm_helper kPermissionsHelper */ $parent_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix'); $main_object =& $this->Application->recallObject($parent_prefix); /* @var $main_object kCatDBItem */ $perm_name = $this->getPermPrefix($event).'.REVIEW'; $res = $this->Application->CheckPermission($perm_name, 0, $main_object->GetDBField('CategoryId')) || $this->Application->CheckPermission($perm_name.'.PENDING', 0, $main_object->GetDBField('CategoryId')); if (!$res) { $event->status = erPERM_FAIL; } return $res; } return parent::CheckPermission($event); } /** * Returns prefix for permissions * * @param kEvent $event */ function getPermPrefix(&$event) { $main_prefix = $this->Application->GetTopmostPrefix($event->Prefix); // this will return LINK for l, ARTICLE for n, TOPIC for bb, PRODUCT for p $item_prefix = $this->Application->getUnitOption($main_prefix, 'PermItemPrefix'); return $item_prefix; } /** * Apply any custom changes to list's sql query * * @param kEvent $event * @access protected * @see OnListBuild */ function SetCustomQuery(&$event) { $object =& $event->getObject(); /* @var $object kDBList */ if (!$this->Application->IsAdmin()) { $object->addFilter('active', '%1$s.Status = '.STATUS_ACTIVE); } switch ($event->Special) { case 'showall': $object->clearFilters(); break; case 'item': // used ? $object->clearFilters(); $info = $object->getLinkedInfo(); $this->Application->setUnitOption($info['ParentPrefix'], 'AutoLoad', true); $parent =& $this->Application->recallObject($info['ParentPrefix']); $object->addFilter('item_reviews', '%1$s.ItemId = '.$parent->GetDBField('ResourceId')); break; case 'products': // used ? $object->removeFilter('parent_filter'); // this is important $object->addFilter('product_reviews', '%1$s.ItemId = pr.ResourceId'); break; case 'product': $object->addFilter('product_reviews', '%1$s.ItemId = pr.ResourceId'); // for LEFT JOIN break; } if ($event->getEventParam('type') == 'current_user') { $object->removeFilter('active'); $object->addFilter('current_user', '%1$s.CreatedById = '.$this->Application->RecallVar('user_id')); $object->addFilter('current_ip', '%1$s.IPAddress = "'.$_SERVER['REMOTE_ADDR'].'"'); } } /** * Adds review from front in case if user is logged in * * @param kEvent $event */ function OnAddReview(&$event) { $event->CallSubEvent('OnCreate'); } /** * Get new review status on user review permission * * @param kEvent $event * @return int */ function getReviewStatus(&$event) { $parent_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix'); $main_object =& $this->Application->recallObject($parent_prefix); /* @var $main_object kCatDBItem */ $ret = STATUS_DISABLED; $perm_name = $this->getPermPrefix($event).'.REVIEW'; if ($this->Application->CheckPermission($perm_name, 0, $main_object->GetDBField('CategoryId'))) { $ret = STATUS_ACTIVE; } else if ($this->Application->CheckPermission($perm_name.'.PENDING', 0, $main_object->GetDBField('CategoryId'))) { $ret = STATUS_PENDING; } return $ret; } /** * Prefills all fields on front-end * * @param kEvent $event */ function OnBeforeItemCreate(&$event) { if ($this->Application->IsAdmin()) { return ; } $object =& $event->getObject(); /* @var $object kDBItem */ $parent_info = $object->getLinkedInfo(); $spam_helper =& $this->Application->recallObject('SpamHelper'); /* @var $spam_helper SpamHelper */ $spam_helper->InitHelper($parent_info['ParentId'], 'Review', 0); if ($spam_helper->InSpamControl()) { $event->status = erFAIL; $object->SetError('ReviewText', 'too_frequent', 'lu_ferror_review_duplicate'); return ; } $item_type = $this->Application->getUnitOption($parent_info['ParentPrefix'], 'ItemType'); $object->SetDBField('IPAddress', $_SERVER['REMOTE_ADDR']); $object->SetDBField('ItemId', $parent_info['ParentId']); // ResourceId $object->SetDBField('CreatedById', $this->Application->RecallVar('user_id')); $object->SetDBField('ItemType', $item_type); $object->SetDBField('Status', $this->getReviewStatus($event)); $object->SetDBField('TextFormat', 0); // set plain text format directly $object->SetDBField('Module', $this->Application->findModule('Var', $parent_info['ParentPrefix'], 'Name')); } /** * Updates item review counter * * @param kEvent $event */ function OnAfterItemCreate(&$event) { $this->updateReviewsCounter($event); if (!$this->Application->IsAdmin()) { $spam_helper =& $this->Application->recallObject('SpamHelper'); /* @var $spam_helper SpamHelper */ $object =& $event->getObject(); $parent_info = $object->getLinkedInfo(); $config_mapping = $this->Application->getUnitOption($event->Prefix, 'ConfigMapping'); $review_settings = $config_mapping['ReviewDelayValue'].':'.$config_mapping['ReviewDelayInterval']; $spam_helper->InitHelper($parent_info['ParentId'], 'Review', $review_settings); $spam_helper->AddToSpamControl(); } } /** * Updates total review counter * * @param kEvent $event */ function updateReviewsCounter(&$event) { $parent_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix'); $main_object =& $this->Application->recallObject($parent_prefix, null, Array ('raise_warnings' => 0)); /* @var $main_object kCatDBItem */ if (!$main_object->isLoaded()) { // deleting main item / cloning main item return ; } $object =& $event->getObject(); // for temp tables $sql = 'SELECT COUNT(ReviewId) FROM '.$object->TableName.' WHERE ItemId = '.$main_object->GetDBField('ResourceId'); $review_count = $this->Conn->GetOne($sql); $main_object->SetDBField('CachedReviewsQty', $review_count); $main_object->Update(); } /** * Updates main item cached review counter * * @param kEvent $event */ function OnAfterItemDelete(&$event) { $this->updateReviewsCounter($event); } /** * Creates review & redirect to confirmation template * * @param kEvent $event */ function OnCreate(&$event) { parent::OnCreate($event); if ($event->status != erSUCCESS || $this->Application->IsAdmin()) { return ; } $object =& $event->getObject(); $next_template = $object->GetDBField('Status') == STATUS_ACTIVE ? 'success_template' : 'success_pending_template'; $event->redirect = $this->Application->GetVar($next_template); $event->SetRedirectParam('opener', 's'); $parent_prefix = $this->Application->getUnitOption($event->Prefix, 'ParentPrefix'); $event->SetRedirectParam('pass', 'm,'.$parent_prefix); } } ?>