Beispiel #1
0
 public static function getInstance(Product $product, ProductRatingType $type = null)
 {
     $field = new ARFieldHandle(__CLASS__, 'ratingTypeID');
     $summary = $product->getRelatedRecordSet(__CLASS__, new ARSelectFilter($type ? new EqualsCond($field, $type->getID()) : new IsNullCond($field)));
     if ($summary->size()) {
         return $summary->get(0);
     } else {
         return self::getNewInstance($product, $type);
     }
 }
Beispiel #2
0
 public static function getNewInstance(Product $product, ProductRatingType $type = null, User $user = null)
 {
     $instance = parent::getNewInstance(__CLASS__);
     $instance->product->set($product);
     if ($type && is_null($type->getID())) {
         $type = null;
     }
     $instance->ratingType->set($type);
     if ($user && $user->isAnonymous()) {
         $user = null;
     }
     $instance->user->set($user);
     return $instance;
 }
Beispiel #3
0
 public function testDelete()
 {
     $type = ProductRatingType::getNewInstance(Category::getRootNode());
     $type->save();
     $type2 = ProductRatingType::getNewInstance(Category::getRootNode());
     $type2->save();
     for ($k = 0; $k <= 1; $k++) {
         $review = ProductReview::getNewInstance($this->product, $this->user);
         $review->save();
         $rating = ProductRating::getNewInstance($this->product, $type);
         $rating->rating->set(6 + $k);
         $rating->review->set($review);
         $rating->save();
         $rating = ProductRating::getNewInstance($this->product, $type2);
         $rating->rating->set(4 + $k);
         $rating->review->set($review);
         $rating->save();
     }
     $this->product->reload();
     $this->assertEqual($this->product->ratingCount->get(), 4);
     $this->assertEqual($this->product->ratingSum->get(), 22);
     $this->assertEqual($this->product->rating->get(), 5.5);
     // delete last review
     $review->delete();
     $this->product->reload();
     $this->assertEqual($this->product->ratingCount->get(), 2);
     $this->assertEqual($this->product->ratingSum->get(), 10);
     $this->assertEqual($this->product->rating->get(), 5);
     // check rating summaries
     $summary = ProductRatingSummary::getInstance($this->product, $type2);
     $this->assertEqual($summary->rating->get(), 4);
 }
Beispiel #4
0
 public function testRatingTypes()
 {
     $type = ProductRatingType::getNewInstance(Category::getRootNode());
     $type->save();
     $rating = ProductRating::getNewInstance($this->product, $type);
     $rating->rating->set(6);
     $rating->save();
     $this->product->reload();
     $this->assertEqual($this->product->ratingCount->get(), 1);
     $this->assertEqual($this->product->ratingSum->get(), 6);
     $this->assertEqual($this->product->rating->get(), 6);
     ActiveRecord::clearPool();
     $summary = ProductRatingSummary::getInstance($this->product, $type);
     $summary->reload();
     $this->assertEqual($summary->ratingCount->get(), 1);
     $this->assertEqual($summary->ratingSum->get(), 6);
     $this->assertEqual($summary->rating->get(), 6);
     $type2 = ProductRatingType::getNewInstance(Category::getRootNode());
     $type2->save();
     $rating = ProductRating::getNewInstance($this->product, $type2);
     $rating->rating->set(4);
     $rating->save();
     $this->product->reload();
     $this->assertEqual($this->product->ratingCount->get(), 2);
     $this->assertEqual($this->product->ratingSum->get(), 10);
     $this->assertEqual($this->product->rating->get(), 5);
     ActiveRecord::clearPool();
     $summary = ProductRatingSummary::getInstance($this->product, $type2);
     $summary->reload();
     $this->assertEqual($summary->ratingCount->get(), 1);
     $this->assertEqual($summary->ratingSum->get(), 4);
     $this->assertEqual($summary->rating->get(), 4);
 }
 public function testPositions()
 {
     $type1 = ProductRatingType::getNewInstance(Category::getRootNode());
     $type1->save();
     $type2 = ProductRatingType::getNewInstance(Category::getRootNode());
     $type2->save();
     $this->assertEqual($type1->position->get(), 1);
     $this->assertEqual($type2->position->get(), 2);
 }
 /**
  * @role update
  */
 public function save()
 {
     $validator = $this->buildValidator();
     if (!$validator->isValid()) {
         return new JSONResponse(array('err' => $validator->getErrorList()));
     }
     $post = $this->request->get('id') ? ActiveRecordModel::getInstanceById('ProductRatingType', $this->request->get('id'), ActiveRecordModel::LOAD_DATA) : ProductRatingType::getNewInstance(Category::getInstanceByID($this->request->get('categoryId'), Category::LOAD_DATA));
     $post->loadRequestData($this->request);
     $post->save();
     return new JSONResponse($post->toArray());
 }
 public function testRatingTypes()
 {
     $types = array();
     for ($k = 1; $k <= 3; $k++) {
         $type = ProductRatingType::getNewInstance(Category::getRootNode());
         $type->save();
         $types[$k] = $type;
         $this->request->set('rating_' . $type->getID(), $k);
     }
     $this->controller->rate();
     $this->product->reload();
     $response = $this->controller->index();
     $ratings = $response->get('rating');
     $this->assertEqual(count($ratings), 3);
     foreach ($ratings as $key => $rating) {
         $this->assertEqual($key + 1, $rating['rating']);
     }
 }
Beispiel #8
0
 public function rate()
 {
     $product = Product::getInstanceByID($this->request->get('id'), Product::LOAD_DATA);
     $ratingTypes = ProductRatingType::getProductRatingTypes($product);
     $validator = $this->buildRatingValidator($ratingTypes->toArray(), $product, true);
     $redirect = new ActionRedirectResponse('product', 'index', array('id' => $product->getID()));
     if ($validator->isValid()) {
         $msg = $this->translate('_msg_rating_added');
         if ($this->isAddingReview()) {
             $review = ProductReview::getNewInstance($product, $this->user);
             $review->loadRequestData($this->request);
             $review->ip->set($this->request->getIpLong());
             // approval status
             $approval = $this->config->get('APPROVE_REVIEWS');
             $review->isEnabled->set('APPROVE_REVIEWS_AUTO' == $approval || 'APPROVE_REVIEWS_USER' == $approval && !$this->user->isAnonymous());
             $review->save();
             $msg = $this->translate('_msg_review_added');
         }
         foreach ($ratingTypes as $type) {
             $rating = ProductRating::getNewInstance($product, $type, $this->user);
             $rating->rating->set($this->request->get('rating_' . $type->getID()));
             if (isset($review)) {
                 $rating->review->set($review);
             }
             $rating->ip->set($this->request->getIpLong());
             $rating->save();
         }
         if ($this->isAjax()) {
             $response = new JSONResponse(array('message' => $msg), 'success');
         } else {
             $this->setMessage($msg);
             $response = $redirect;
         }
         $response->setCookie('rating_' . $product->getID(), true, strtotime('+' . $this->config->get('RATING_SAME_IP_TIME') . ' hours'), $this->router->getBaseDirFromUrl());
         return $response;
     } else {
         if ($this->isAjax()) {
             return new JSONResponse(array('errors' => $validator->getErrorList()));
         } else {
             return $redirect;
         }
     }
 }
 private function getTabCounts($categoryId)
 {
     ClassLoader::import('application.model.category.*');
     ClassLoader::import('application.model.filter.*');
     ClassLoader::import('application.model.product.*');
     $category = Category::getInstanceByID($categoryId, Category::LOAD_DATA);
     $reviewCond = new EqualsOrMoreCond(new ARFieldHandle('Category', 'lft'), $category->lft->get());
     $reviewCond->addAND(new EqualsOrLessCond(new ARFieldHandle('Category', 'rgt'), $category->rgt->get()));
     return array('tabProducts' => $category->totalProductCount->get(), 'tabFilters' => $this->getFilterCount($category), 'tabFields' => $this->getSpecFieldCount($category), 'tabImages' => $this->getCategoryImageCount($category), 'tabOptions' => $category->getOptions()->getTotalRecordCount(), 'tabRatingCategories' => ProductRatingType::getCategoryRatingTypes($category)->size(), 'tabReviews' => ActiveRecordModel::getRecordCount('ProductReview', new ARSelectFilter($reviewCond), array('Category', 'Product')), 'tabProductLists' => $category->getRelatedRecordCount('ProductList'));
 }
Beispiel #10
0
 private function buildValidator(ProductReview $review)
 {
     $validator = $this->getValidator("productRating", $this->getRequest());
     // option validation
     foreach (ProductRatingType::getProductRatingTypes($review->product->get())->toArray() as $type) {
         $validator->addCheck('rating_' . $type['ID'], new IsNotEmptyCheck($this->translate('_err_no_rating_selected')));
     }
     $validator->addCheck('nickname', new IsNotEmptyCheck($this->translate('_err_no_review_nickname')));
     $validator->addCheck('title', new IsNotEmptyCheck($this->translate('_err_no_review_summary')));
     $validator->addCheck('text', new IsNotEmptyCheck($this->translate('_err_no_review_text')));
     return $validator;
 }