UPGRADE NOTE: Do not edit or add to this file if you wish to upgrade AbanteCart to newer versions in the future. If you wish to customize AbanteCart for your needs please refer to http://www.AbanteCart.com for more information. ------------------------------------------------------------------------------*/ if (! defined ( 'DIR_CORE' )) { header ( 'Location: static_pages/' ); } class ControllerPagesProductProduct extends AController { public $data = array(); public function main() { //init controller data $this->extensions->hk_InitData($this,__FUNCTION__); $this->document->resetBreadcrumbs(); $this->document->addBreadcrumb( array ( 'href' => $this->html->getURL('index/home'), 'text' => $this->language->get('text_home'), 'separator' => FALSE )); $this->loadModel('tool/seo_url'); $this->loadModel('catalog/category'); if (isset($this->request->get['path'])) { $path = ''; foreach (explode('_', $this->request->get['path']) as $path_id) { $category_info = $this->model_catalog_category->getCategory($path_id); if (!$path) { $path = $path_id; } else { $path .= '_' . $path_id; } if ($category_info) { $this->document->addBreadcrumb( array ( 'href' => $this->html->getSEOURL('product/category','&path=' . $path, '&encode'), 'text' => $category_info['name'], 'separator' => $this->language->get('text_separator') )); } } } $this->loadModel('catalog/manufacturer'); if (isset($this->request->get['manufacturer_id'])) { $manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($this->request->get['manufacturer_id']); if ($manufacturer_info) { $this->document->addBreadcrumb( array ( 'href' => $this->html->getSEOURL('product/manufacturer','&manufacturer_id=' . $this->request->get['manufacturer_id'], '&encode'), 'text' => $manufacturer_info['name'], 'separator' => $this->language->get('text_separator') )); } } if (isset($this->request->get['keyword'])) { $url = ''; if (isset($this->request->get['category_id'])) { $url .= '&category_id=' . $this->request->get['category_id']; } if (isset($this->request->get['description'])) { $url .= '&description=' . $this->request->get['description']; } $this->document->addBreadcrumb( array ( 'href' => $this->html->getURL('product/search','&keyword=' . $this->request->get['keyword'] . $url, '&encode'), 'text' => $this->language->get('text_search'), 'separator' => $this->language->get('text_separator') )); } if (isset($this->request->get['product_id'])) { $product_id = $this->request->get['product_id']; } else { $product_id = 0; } $urls = array( 'is_group_option' => $this->html->getURL('r/product/product/is_group_option', '&product_id=' . $product_id, '&encode'), ); $this->view->assign('urls', $urls); $this->loadModel('catalog/product'); $promoton = new APromotion(); $product_info = $this->model_catalog_product->getProduct($product_id); //can not locate product? get out if (!$product_info) { $this->_product_not_found($product_id); return null; } $url = $this->_build_url(); $this->view->assign('error', '' ); if (isset($this->session->data['error'])) { $this->view->assign('error', $this->session->data['error'] ); unset($this->session->data['error']); } $this->document->addBreadcrumb( array ( 'href' => $this->html->getSEOURL('product/product', $url . '&product_id=' . $product_id, '&encode'), 'text' => $product_info['name'], 'separator' => $this->language->get('text_separator') )); $this->document->setTitle( $product_info['name'] ); $this->document->setKeywords( $product_info['meta_keywords'] ); $this->document->setDescription( $product_info['meta_description'] ); $this->document->addLink ( array( 'href' => $this->html->getSEOURL('product/product','&product_id=' . $product_id, '&encode'), 'rel' => 'canonical' )); $this->data['heading_title'] = $product_info['name']; $this->data['minimum'] = $product_info['minimum']; $this->data['text_minimum'] = sprintf($this->language->get('text_minimum'), $product_info['minimum']); $this->data['maximum'] = $product_info['maximum']; $this->data['text_maximum'] = sprintf($this->language->get('text_maximum'), $product_info['maximum']); $this->loadModel('catalog/review'); $this->data['tab_review'] = sprintf($this->language->get('tab_review'), $this->model_catalog_review->getTotalReviewsByProductId($product_id)) ; if ($this->config->get('enable_reviews')) { $average = $this->model_catalog_review->getAverageRating($product_id); } else { $average = false; } $this->data['review_status'] = $this->config->get('enable_reviews'); $this->data['text_stars'] = sprintf($this->language->get('text_stars'), $average); $this->data['rating_element'] = HtmlElementFactory::create(array( 'type' => 'rating', 'name' => 'rating', 'value' => '', 'options' => array(1 => 1, 2, 3, 4, 5), 'pack' => true, )); $this->data['review_name'] = HtmlElementFactory::create(array( 'type'=>'input', 'name' =>'name' )); $this->data['review_text'] = HtmlElementFactory::create(array( 'type'=>'textarea', 'name' =>'text', 'attr' =>' rows="8" cols="50" ', )); $this->data['review_captcha'] = HtmlElementFactory::create(array( 'type'=>'input', 'name' =>'captcha', 'attr' =>'')); $this->data['review_button'] = HtmlElementFactory::create(array( 'type' => 'button', 'name' => 'review_submit', 'text' => $this->language->get('button_submit'), 'style'=> 'btn-primary', 'icon' => 'fa fa-comment' )); $this->data['product_info'] = $product_info; $form = new AForm(); $form->setForm(array( 'form_name' => 'product' )); $this->data['form'][ 'form_open' ] = $form->getFieldHtml( array( 'type' => 'form', 'name' => 'product', 'action' => $this->html->getSecureURL('checkout/cart'))); $product_price = $product_info['price']; $discount = $promoton->getProductDiscount($product_id); if ($discount) { $product_price = $discount; $this->data['price_num'] = $this->tax->calculate( $discount, $product_info['tax_class_id'], (bool)$this->config->get('config_tax') ); $this->data['special'] = FALSE; } else { $this->data['price_num'] = $this->tax->calculate( $product_info['price'], $product_info['tax_class_id'], (bool)$this->config->get('config_tax') ); $special = $promoton->getProductSpecial($product_id); if ($special) { $product_price = $special; $this->data['special_num'] =$this->tax->calculate( $special, $product_info['tax_class_id'], (bool)$this->config->get('config_tax') ); } else { $this->data['special'] = FALSE; } } $this->data['price'] = $this->currency->format($this->data['price_num']); if ( isset($this->data['special_num']) ) { $this->data['special'] = $this->currency->format($this->data['special_num']); } $product_discounts = $promoton->getProductDiscounts($product_id); $discounts = array(); foreach ($product_discounts as $discount) { $discounts[] = array( 'quantity' => $discount['quantity'], 'price' => $this->currency->format($this->tax->calculate($discount['price'], $product_info['tax_class_id'], (bool)$this->config->get('config_tax'))) ); } $this->data['discounts'] = $discounts; $this->data['product_price'] = $product_price; $this->data['tax_class_id'] = $product_info['tax_class_id']; if(!$product_info['call_to_order']){ $this->data['form']['minimum'] = $form->getFieldHtml( array( 'type' => 'input', 'name' => 'quantity', 'value' => ( $product_info['minimum'] ? (int)$product_info['minimum'] : 1), 'style' => 'short', 'attr' => ' size="3" ')); $this->data['form'][ 'add_to_cart' ] = $form->getFieldHtml( array( 'type' => 'button', 'name' => 'add_to_cart', 'text' => $this->language->get('button_add_to_cart'), 'style' => 'button1' )); } $this->data['form'][ 'product_id' ] = $form->getFieldHtml( array( 'type' => 'hidden', 'name' => 'product_id', 'value' => $product_id)); $this->data['form'][ 'redirect' ] = $form->getFieldHtml( array( 'type' => 'hidden', 'name' => 'redirect', 'value' => $this->html->getURL('product/product', $url . '&product_id=' . $product_id, '&encode') )); $this->data['model'] = $product_info['model']; $this->data['manufacturer'] = $product_info['manufacturer']; $this->data['manufacturers'] = $this->html->getSEOURL('product/manufacturer','&manufacturer_id=' . $product_info['manufacturer_id'], '&encode'); $this->data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8'); $this->data['product_id'] = $product_id; $this->data['average'] = $average; $resource = new AResource('image'); $thumbnail = $resource->getMainThumb('manufacturers', $product_info['manufacturer_id'], (int)$this->config->get('config_image_grid_width'), (int)$this->config->get('config_image_grid_height'), true); if ( !preg_match('/no_image/', $thumbnail['thumb_url'])) { $this->data['manufacturer_icon'] = $thumbnail['thumb_url']; } // Preapare options and values for display $elements_with_options = HtmlElementFactory::getElementsWithOptions(); $options = array(); $product_options = $this->model_catalog_product->getProductOptions($product_id); foreach ($product_options as $option) { $values = array(); $name = $price = $default_value = ''; foreach ($option['option_value'] as $option_value) { $default_value = $option_value['default'] ? $option_value['product_option_value_id']: $default_value; // for case when trying to add to cart withot required options. we get option-array back inside _GET if(has_value($this->request->get['option'][$option['product_option_id']])){ $default_value = $this->request->get['option'][$option['product_option_id']]; } $name = $option_value['name']; //check if we disable options based on out of stock setting if($option_value['subtract'] && $this->config->get('config_nostock_autodisable') && $option_value['quantity'] <= 0) { continue; } //Apply option price modifier if ( $option_value['prefix'] == '%' ) { $price = $this->tax->calculate( ($product_price * $option_value['price'] / 100), $product_info['tax_class_id'], (bool)$this->config->get('config_tax') ); if( $price != 0 ){ $price = $this->currency->format( $price ); }else{ $price = ''; } } else { $price = $this->tax->calculate( $option_value['price'], $product_info['tax_class_id'], (bool)$this->config->get('config_tax') ); if( $price != 0 ){ $price = $this->currency->format( $price ); }else{ $price = ''; } } //Check stock and status $opt_stock_message = ''; if($option_value['subtract'] ) { if ( $option_value['quantity'] <= 0) { //show out of stock message $opt_stock_message = $product_info['stock_status']; } else { if ($this->config->get('config_stock_display')) { $opt_stock_message = $option_value['quantity'] . " " . $this->language->get('text_instock'); } } } $values[$option_value['product_option_value_id']] = $option_value['name'] . ' ' . $price . ' ' . $opt_stock_message; } //if not values are build, nothing to show if (count($values)) { $value = ''; //add price to option name if it is not element with options if ( !in_array($option['element_type'], $elements_with_options) ) { $option['name'] .= ' '.$price.''; if ( $opt_stock_message ) { $option['name'] .= '
' . $opt_stock_message; } $value = $name; } //set default selection is nothing selected if ( !has_value($value) ) { if( has_value($default_value) ) { $value = $default_value; } else { if(in_array($option['element_type'], $elements_with_options) && $option['element_type']!='S'){ //set first from the list to default reset($values); $value = key($values); } } } $option_data = array( 'type' => $option['html_type'], 'name' => !in_array($option['element_type'], HtmlElementFactory::getMultivalueElements()) ? 'option['.$option['product_option_id'].']' : 'option['.$option['product_option_id'].'][]', 'value' => $value, 'options' => $values, 'required' => $option['required'], 'placeholder' => $option['option_placeholder'], 'regexp_pattern' => $option['regexp_pattern'], 'error_text' => $option['error_text'] ); if($option['html_type']=='checkbox'){ $option_data['label_text'] = $value; } $options[] = array( 'name' => $option['name'], 'html' => $this->html->buildElement( $option_data), // not a string!!! it's object! ); } } $this->data['options'] = $options; //handle stock messages // if track stock is off. no messages needed. if ( $this->model_catalog_product->isStockTrackable($product_id) ) { $total_quantity = $this->model_catalog_product->hasAnyStock($product_id); $this->data['track_stock'] = true; //out of stock if no quantity and no stick checkout is disabled if ( $total_quantity <= 0 && !$this->config->get('config_stock_checkout')) { $this->data['in_stock'] = false; //show out of stock message $this->data['stock'] = $product_info['stock_status']; } else { $this->data['in_stock'] = true; if ($this->config->get('config_stock_display')) { $this->data['stock'] = $product_info['quantity']; } else { $this->data['stock'] = $this->language->get('text_instock') ; } } //check if we need to disable product for no stock if ($this->config->get('config_nostock_autodisable') && $total_quantity <= 0) { //set available data $pd_identifiers = "ID: " . $product_id; $pd_identifiers .= (empty($product_info['model']) ? '' : " Model: " . $product_info['model']); $pd_identifiers .= (empty($product_info['sku']) ? '' : " SKU: " . $product_info['sku']); $message_ttl = sprintf($this->language->get('notice_out_of_stock_ttl'), $product_info['name']); $message_txt = sprintf($this->language->get('notice_out_of_stock_body'), $product_info['name'], $pd_identifiers); //record to message box $msg = new AMessage(); $msg->saveNotice( $message_ttl, $message_txt); $this->model_catalog_product->updateStatus($product_id, 0); $this->redirect($this->html->getSEOURL('product/product','&product_id=' . $product_info['product_id'], '&encode')); } } // main product image $sizes = array('main'=> array( 'width'=>$this->config->get('config_image_popup_width'), 'height' => $this->config->get('config_image_popup_height')), 'thumb'=> array('width'=>$this->config->get('config_image_thumb_width'), 'height' => $this->config->get('config_image_thumb_height'))); $this->data['image_main'] = $resource->getResourceAllObjects('products', $product_id, $sizes,1, false); if($this->data['image_main']) { $this->data['image_main']['sizes'] = $sizes; } // additional images $sizes = array('main'=> array( 'width'=>$this->config->get('config_image_popup_width'), 'height' => $this->config->get('config_image_popup_height')), 'thumb'=> array('width'=>$this->config->get('config_image_additional_width'), 'height' => $this->config->get('config_image_additional_height'))); $this->data['images'] = $resource->getResourceAllObjects('products', $product_id, $sizes,0,false); $products = array(); $results = $this->model_catalog_product->getProductRelated($product_id); foreach ($results as $result) { // related product image $sizes = array('main'=> array( 'width'=>$this->config->get('config_image_related_width'), 'height' => $this->config->get('config_image_related_height')), 'thumb'=> array('width'=>$this->config->get('config_image_related_width'), 'height' => $this->config->get('config_image_related_height'))); $image = $resource->getResourceAllObjects('products', $result['product_id'], $sizes,1); if ($this->config->get('enable_reviews')) { $rating = $this->model_catalog_review->getAverageRating($result['product_id']); } else { $rating = false; } $special = FALSE; $discount = $promoton->getProductDiscount($result['product_id']); if ($discount) { $price = $this->currency->format($this->tax->calculate($discount, $result['tax_class_id'], (bool)$this->config->get('config_tax'))); } else { $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], (bool)$this->config->get('config_tax'))); $special = $promoton->getProductSpecial($result['product_id']); if ($special) { $special = $this->currency->format($this->tax->calculate($special, $result['tax_class_id'], (bool)$this->config->get('config_tax'))); } } $options = $this->model_catalog_product->getProductOptions($result['product_id']); if ($options) { $add = $this->html->getSEOURL('product/product','&product_id=' . $result['product_id'], '&encode'); } else { if($this->config->get('config_cart_ajax')){ $add = '#'; }else{ $add = $this->html->getSecureURL('checkout/cart', '&product_id=' . $result['product_id'], '&encode'); } } $products[] = array( 'product_id' => $result['product_id'], 'name' => $result['name'], 'model' => $result['model'], 'rating' => $rating, 'stars' => sprintf($this->language->get('text_stars'), $rating), 'price' => $price, 'call_to_order'=> $result['call_to_order'], 'options' => $options, 'special' => $special, 'image' => $image, 'href' => $this->html->getSEOURL('product/product','&product_id=' . $result['product_id'], '&encode'), 'add' => $add ); } $this->data['related_products'] = $products; if ($this->config->get('config_customer_price')) { $display_price = TRUE; } elseif ($this->customer->isLogged()) { $display_price = TRUE; } else { $display_price = FALSE; } $this->data['display_price'] = $display_price; $this->model_catalog_product->updateViewed($product_id); $tags = array(); $results = $this->model_catalog_product->getProductTags($product_id); foreach ($results as $result) { if ($result['tag']) { $tags[] = array( 'tag' => $result['tag'], 'href' => $this->html->getURL('product/search','&keyword=' . $result['tag'], '&encode') ); } } $this->data['tags'] = $tags; //downloads before order if allowed if($this->config->get('config_download')){ $dwn = new ADownload(); $download_list = $dwn->getDownloadsBeforeOrder($product_id); if($download_list){ foreach($download_list as $download){ $href = $this->html->getURL('account/download/startdownload', '&download_id=' . $download['download_id']); $download['attributes'] = $this->download->getDownloadAttributesValuesForCustomer($download['download_id']); $download['button'] = $form->getFieldHtml( array('type' => 'button', 'id' => 'download_' . $download['download_id'], 'href' => $href, 'title' => $this->language->get('text_start_download'), 'text' => $this->language->get('text_start_download'))); $downloads[] = $download; } $this->data['downloads'] = $downloads; } } $this->view->setTemplate( 'pages/product/product.tpl' ); $this->view->batchAssign($this->data); $this->processTemplate(); //init controller data $this->extensions->hk_UpdateData($this,__FUNCTION__); } private function _product_not_found ($product_id) { $url = $this->_build_url(); $this->document->addBreadcrumb( array ( 'href' => $this->html->getSEOURL('product/product', $url . '&product_id=' . $product_id, '&encode'), 'text' => $this->language->get('text_error'), 'separator' => $this->language->get('text_separator') )); $this->document->setTitle( $this->language->get('text_error') ); $this->data['heading_title'] = $this->language->get('text_error'); $this->data['text_error'] = $this->language->get('text_error'); $continue = HtmlElementFactory::create( array ('type' => 'button', 'name' => 'continue_button', 'text'=> $this->language->get('button_continue'), 'style' => 'button')); $this->view->assign('button_continue', $continue ); $this->data['continue'] = $this->html->getURL('index/home'); $this->view->setTemplate( 'pages/error/not_found.tpl' ); $this->view->batchAssign($this->data); $this->processTemplate(); } private function _build_url () { $url = ''; if (isset($this->request->get['path'])) { $url .= '&path=' . $this->request->get['path']; } if (isset($this->request->get['manufacturer_id'])) { $url .= '&manufacturer_id=' . $this->request->get['manufacturer_id']; } if (isset($this->request->get['keyword'])) { $url .= '&keyword=' . $this->request->get['keyword']; } if (isset($this->request->get['category_id'])) { $url .= '&category_id=' . $this->request->get['category_id']; } if (isset($this->request->get['description'])) { $url .= '&description=' . $this->request->get['description']; } return $url; } }