/**
  * 
  * Display reviews advert. 
  * @throws HTTP_Exception_404
  * 
  */
 public function action_reviews()
 {
     $seotitle = $this->request->param('seotitle', NULL);
     if ($seotitle !== NULL and Core::config('advertisement.reviews') == 1) {
         $ad = new Model_Ad();
         $ad->where('seotitle', '=', $seotitle)->where('status', '!=', Model_Ad::STATUS_SPAM)->limit(1)->cached()->find();
         if ($ad->loaded()) {
             $errors = NULL;
             //adding a new review
             if ($this->request->post() and Auth::instance()->logged_in()) {
                 $user = Auth::instance()->get_user();
                 //only able to review if bought the product
                 if (Core::config('advertisement.reviews_paid') == 1) {
                     $order = new Model_Order();
                     $order->where('id_ad', '=', $ad->id_ad)->where('id_user', '=', $user->id_user)->where('id_product', '=', Model_Order::PRODUCT_AD_SELL)->where('status', '=', Model_Order::STATUS_PAID)->find();
                     if (!$order->loaded()) {
                         Alert::set(Alert::ERROR, __('You can only add a review if you bought this product'));
                         $this->redirect(Route::url('ad-review', array('seotitle' => $ad->seotitle)));
                     }
                 }
                 //not allowing to review to yourself
                 if ($user->id_user == $ad->id_user) {
                     Alert::set(Alert::ERROR, __('You can not review yourself.'));
                     $this->redirect(Route::url('ad-review', array('seotitle' => $ad->seotitle)));
                 }
                 $review = new Model_Review();
                 $review->where('id_ad', '=', $ad->id_ad)->where_open()->or_where('id_user', '=', $user->id_user)->or_where('ip_address', '=', ip2long(Request::$client_ip))->where_close()->find();
                 //d($review);
                 if (!$review->loaded()) {
                     if (captcha::check('review')) {
                         $validation = Validation::factory($this->request->post())->rule('rate', 'numeric')->rule('description', 'not_empty')->rule('description', 'min_length', array(':value', 5))->rule('description', 'max_length', array(':value', 1000));
                         if ($validation->check()) {
                             $rate = core::post('rate');
                             if ($rate > Model_Review::RATE_MAX) {
                                 $rate = Model_Review::RATE_MAX;
                             } elseif ($rate < 0) {
                                 $rate = 0;
                             }
                             $review = new Model_Review();
                             $review->id_user = $user->id_user;
                             $review->id_ad = $ad->id_ad;
                             $review->description = core::post('description');
                             $review->status = Model_Review::STATUS_ACTIVE;
                             $review->ip_address = ip2long(Request::$client_ip);
                             $review->rate = $rate;
                             $review->save();
                             //email product owner?? notify him of new review
                             $ad->user->email('ad-review', array('[AD.TITLE]' => $ad->title, '[RATE]' => $review->rate, '[DESCRIPTION]' => $review->description, '[URL.QL]' => $ad->user->ql('ad-review', array('seotitle' => $ad->seotitle))));
                             $ad->recalculate_rate();
                             $ad->user->recalculate_rate();
                             Alert::set(Alert::SUCCESS, __('Thanks for your review!'));
                         } else {
                             $errors = $validation->errors('ad');
                             foreach ($errors as $f => $err) {
                                 Alert::set(Alert::ALERT, $err);
                             }
                         }
                     } else {
                         Alert::set(Alert::ERROR, __('Wrong Captcha'));
                     }
                 } else {
                     Alert::set(Alert::ERROR, __('You already added a review'));
                 }
             }
             $this->template->scripts['footer'][] = 'js/jquery.raty.min.js';
             $this->template->scripts['footer'][] = 'js/review.js';
             Breadcrumbs::add(Breadcrumb::factory()->set_title(__('Home'))->set_url(Route::url('default')));
             Breadcrumbs::add(Breadcrumb::factory()->set_title($ad->title)->set_url(Route::url('ad', array('seotitle' => $ad->seotitle, 'category' => $ad->category->seoname))));
             $this->template->title = $ad->title . ' - ' . __('Reviews');
             Breadcrumbs::add(Breadcrumb::factory()->set_title(__('Reviews')));
             $this->template->meta_description = text::removebbcode($ad->description);
             $permission = TRUE;
             //permission to add hit to advert and give access rights.
             $auth_user = Auth::instance();
             if (!$auth_user->logged_in() or $auth_user->get_user()->id_user != $ad->id_user and ($auth_user->get_user()->id_role != Model_Role::ROLE_ADMIN and $auth_user->get_user()->id_role != Model_Role::ROLE_MODERATOR) or $auth_user->get_user()->id_role != Model_Role::ROLE_ADMIN and $auth_user->get_user()->id_role != Model_Role::ROLE_MODERATOR) {
                 $permission = FALSE;
                 $user = NULL;
             } else {
                 $user = $auth_user->get_user()->id_user;
             }
             $captcha_show = core::config('advertisement.captcha');
             if ($ad->get_first_image() !== NULL) {
                 Controller::$image = $ad->get_first_image();
             }
             $reviews = new Model_Review();
             $reviews = $reviews->where('id_ad', '=', $ad->id_ad)->where('status', '=', Model_Review::STATUS_ACTIVE)->find_all();
             $this->template->bind('content', $content);
             $this->template->content = View::factory('pages/ad/reviews', array('ad' => $ad, 'permission' => $permission, 'captcha_show' => $captcha_show, 'user' => $user, 'reviews' => $reviews, 'errors' => $errors));
         } else {
             //throw 404
             throw HTTP_Exception::factory(404, __('Page not found'));
         }
     } else {
         //throw 404
         throw HTTP_Exception::factory(404, __('Page not found'));
     }
 }
Example #2
0
 public function action_listing()
 {
     if (Theme::get('infinite_scroll')) {
         $this->template->scripts['footer'][] = '//cdn.jsdelivr.net/jquery.infinitescroll/2.0b2/jquery.infinitescroll.js';
         $this->template->scripts['footer'][] = 'js/listing.js';
     }
     $this->template->scripts['footer'][] = 'js/sort.js';
     Breadcrumbs::add(Breadcrumb::factory()->set_title(__('Home'))->set_url(Route::url('default')));
     /**
      * we get the model of category from controller to filter and generate urls titles etc...
      */
     $category = NULL;
     $category_parent = NULL;
     if (Model_Category::current()->loaded()) {
         $category = Model_Category::current();
         //adding the category parent
         if ($category->id_category_parent != 1 and $category->parent->loaded()) {
             $category_parent = $category->parent;
         }
     }
     //base title
     if ($category !== NULL) {
         //category image
         if (($icon_src = $category->get_icon()) !== FALSE) {
             Controller::$image = $icon_src;
         }
         $this->template->title = $category->name;
         if ($category->description != '') {
             $this->template->meta_description = $category->description;
         } else {
             $this->template->meta_description = $category->name . ' ' . __('sold in') . ' ' . Core::config('general.site_name');
         }
     } else {
         $this->template->title = __('all');
         $this->template->meta_description = __('List of all products in') . ' ' . Core::config('general.site_name');
     }
     if ($category_parent !== NULL) {
         $this->template->title .= ' (' . $category_parent->name . ')';
         Breadcrumbs::add(Breadcrumb::factory()->set_title($category_parent->name)->set_url(Route::url('list', array('category' => $category_parent->seoname))));
     }
     if ($category !== NULL) {
         Breadcrumbs::add(Breadcrumb::factory()->set_title($category->name)->set_url(Route::url('list', array('category' => $category->seoname))));
     }
     //user recognition
     $user = Auth::instance()->get_user() == NULL ? NULL : Auth::instance()->get_user();
     $products = new Model_Product();
     //filter by category
     if ($category !== NULL) {
         $products->where('id_category', 'in', $category->get_siblings_ids());
     }
     //only published products
     $products->where('status', '=', Model_Product::STATUS_ACTIVE);
     $res_count = $products->count_all();
     // check if there are some advet.-s
     if ($res_count > 0) {
         // pagination module
         $pagination = Pagination::factory(array('view' => 'pagination', 'total_items' => $res_count, 'items_per_page' => core::config('general.products_per_page')))->route_params(array('controller' => $this->request->controller(), 'action' => $this->request->action(), 'category' => $category !== NULL ? $category->seoname : NULL));
         Breadcrumbs::add(Breadcrumb::factory()->set_title(__("Page ") . $pagination->current_page));
         /**
          * order depending on the sort parameter
          */
         switch (core::request('sort', core::config('general.sort_by'))) {
             //title z->a
             case 'title-asc':
                 $products->order_by('title', 'asc')->order_by('created', 'desc');
                 break;
                 //title a->z
             //title a->z
             case 'title-desc':
                 $products->order_by('title', 'desc')->order_by('created', 'desc');
                 break;
                 //cheaper first
             //cheaper first
             case 'price-asc':
                 $products->order_by('price', 'asc')->order_by('created', 'desc');
                 break;
                 //expensive first
             //expensive first
             case 'price-desc':
                 $products->order_by('price', 'desc')->order_by('created', 'desc');
                 break;
                 //featured
             //featured
             case 'featured':
             default:
                 $products->order_by('featured', 'desc')->order_by('created', 'desc');
                 break;
                 //oldest first
             //oldest first
             case 'published-asc':
                 $products->order_by('created', 'asc');
                 break;
                 //newest first
             //newest first
             case 'published-desc':
                 $products->order_by('created', 'desc');
                 break;
         }
         //we sort all products with few parameters
         $products = $products->limit($pagination->items_per_page)->offset($pagination->offset)->find_all();
         // array of categories sorted for view
         $data = array('products' => $products, 'pagination' => $pagination, 'user' => $user, 'category' => $category);
     } else {
         // array of categories sorted for view
         $data = array('products' => NULL, 'pagination' => NULL, 'user' => $user, 'category' => $category);
     }
     $this->template->bind('content', $content);
     $this->template->content = View::factory('pages/product/listing', $data);
 }