Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[Решено] OC 2.2 клон Сопутствующие товары


Recommended Posts

Здравствуйте. Делаю клон модуля под Сопутствующие товары (те что отображается в карточке товара)

Сначала создала таблицу в phpmyadmin product_recommended

 

--
-- Структура таблицы `product_recommended`
--

CREATE TABLE IF NOT EXISTS `product_recommended` (
  `product_id` int(11) NOT NULL,
  `recommended_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

Потом в модели админки по аналогии с Related добавила

 

строка 100

if (isset($data['product_recommended'])) {
			foreach ($data['product_recommended'] as $recommended_id) {
				$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$product_id . "' AND recommended_id = '" . (int)$recommended_id . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_recommended SET product_id = '" . (int)$product_id . "', recommended_id = '" . (int)$recommended_id . "'");
				$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$recommended_id . "' AND recommended_id = '" . (int)$product_id . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_recommended SET product_id = '" . (int)$recommended_id . "', recommended_id = '" . (int)$product_id . "'");
			}
		}

строка 247

$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE recommended_id = '" . (int)$product_id . "'");

строка 259

if (isset($data['product_recommended'])) {
			foreach ($data['product_recommended'] as $recommended_id) {
				$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$product_id . "' AND recommended_id = '" . (int)$recommended_id . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_recommended SET product_id = '" . (int)$product_id . "', recommended_id = '" . (int)$recommended_id . "'");
				$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$recommended_id . "' AND recommended_id = '" . (int)$product_id . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_recommended SET product_id = '" . (int)$recommended_id . "', recommended_id = '" . (int)$product_id . "'");
			}
		}

строка 323

$data['product_recommended'] = $this->getProductRecommended($product_id);

строка 350

$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE recommended_id = '" . (int)$product_id . "'");

строка 633

public function getProductRecommended($product_id) {
		$product_recommended_data = array();

		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$product_id . "'");

		foreach ($query->rows as $result) {
			$product_recommended_data[] = $result['recommended_id'];
		}

		return $product_recommended_data;
	}

В котроллере товара в админке

 

строка 1270

	if (isset($this->request->post['product_recommended'])) {
			$products = $this->request->post['product_recommended'];
		} elseif (isset($this->request->get['product_id'])) {
			$products = $this->model_catalog_product->getProductRecommended($this->request->get['product_id']);
		} else {
			$products = array();
		}

		$data['product_recommendeds'] = array();

строка 1302

foreach ($products as $product_id) {
	
			
			$recommended_info = $this->model_catalog_product->getProduct($product_id);

			
			
			if ($recommended_info) {
				$data['product_recommendeds'][] = array(
					'product_id' => $recommended_info['product_id'],
					'name'       => $recommended_info['name']
				);
			}
			
		}

Ну и собственно вывод в админке в форме товара


              <div class="form-group">
                <label class="col-sm-2 control-label" for="input-recommended"><span data-toggle="tooltip" title="<?php echo $help_recommended; ?>">Recommended</span></label>
                <div class="col-sm-10">
                  <input type="text" name="recommended" value="" placeholder="Recommended products" id="input-recommended" class="form-control" />
                  <div id="product-recommended" class="well well-sm" style="height: 150px; overflow: auto;">
                    <?php foreach ($product_recommendeds as $product_recommended) { ?>
                    <div id="product-recommended<?php echo $product_recommended['product_id']; ?>"><i class="fa fa-minus-circle"></i> <?php echo $product_recommended['name']; ?>
                      <input type="hidden" name="product_recommended[]" value="<?php echo $product_recommended['product_id']; ?>" />
                    </div>
                    <?php } ?>
                  </div>
                </div>
              </div>

в скрипте

// Recommended
$('input[name=\'recommended\']').autocomplete({
	'source': function(request, response) {
		$.ajax({
			url: 'index.php?route=catalog/product/autocomplete&token=<?php echo $token; ?>&filter_name=' +  encodeURIComponent(request),
			dataType: 'json',
			success: function(json) {
				response($.map(json, function(item) {
					return {
						label: item['name'],
						value: item['product_id']
					}
				}));
			}
		});
	},
	'select': function(item) {
		$('input[name=\'recommended\']').val('');

		$('#product-recommended' + item['value']).remove();

		$('#product-recommended').append('<div id="product-recommended' + item['value'] + '"><i class="fa fa-minus-circle"></i> ' + item['label'] + '<input type="hidden" name="product_recommended[]" value="' + item['value'] + '" /></div>');
	}
});

$('#product-recommended').delegate('.fa-minus-circle', 'click', function() {
	$(this).parent().remove();
});

Все перпроверила но все равно сохраняет добавленные товары и в Сопутствующие и в клон Сопутствующие

 

 

Прошу помощи


 

  • +1 4
Надіслати
Поділитися на інших сайтах


Разобралась. Если кому интересно как вывести во фронтенде - могу описать

 

Правильно в контроллере

	if (isset($this->request->post['product_recommended'])) {
			$products1 = $this->request->post['product_recommended'];
		} elseif (isset($this->request->get['product_id'])) {
			$products1 = $this->model_catalog_product->getProductRecommended($this->request->get['product_id']);
		} else {
			$products1 = array();
		}

		$data['product_recommendeds'] = array();

		foreach ($products1 as $product_id) {
	
			
			$recommended_info = $this->model_catalog_product->getProduct($product_id);

			
			
			if ($recommended_info) {
				$data['product_recommendeds'][] = array(
					'product_id' => $recommended_info['product_id'],
					'name'       => $recommended_info['name']
				);
			}
			
		}
Змінено користувачем kate1987
  • +1 6
Надіслати
Поділитися на інших сайтах


Все бы  так) Сам спросил,сам нашёл решение,сам описал как сделать.Только явно нужно дописать полный вывод до шаблона.Сколько ещё раз сюда придут те кому эта фишка пригодится.

 

PS Ну и поставил плюс от себя!

Надіслати
Поділитися на інших сайтах

  • 2 weeks later...

Ну и во фронтенде.

В котроллере (строка 492)

/*rec*/
			
			$data['products1'] = array();
			
			$results1 = $this->model_catalog_product->getProductRecommended($this->request->get['product_id']);

			foreach ($results1 as $result1) {
				if ($result1['image']) {
					$image = $this->model_tool_image->resize($result1['image'], $this->config->get($this->config->get('config_theme') . '_image_related_width'), $this->config->get($this->config->get('config_theme') . '_image_related_height'));
				} else {
					$image = $this->model_tool_image->resize('placeholder.png', $this->config->get($this->config->get('config_theme') . '_image_related_width'), $this->config->get($this->config->get('config_theme') . '_image_related_height'));
				}

				if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
					$price = $this->currency->format($this->tax->calculate($result1['price'], $result1['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
				} else {
					$price = false;
				}

				if ((float)$result1['special']) {
					$special = $this->currency->format($this->tax->calculate($result1['special'], $result1['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
				} else {
					$special = false;
				}

				if ($this->config->get('config_tax')) {
					$tax = $this->currency->format((float)$result1['special'] ? $result1['special'] : $result1['price'], $this->session->data['currency']);
				} else {
					$tax = false;
				}

				if ($this->config->get('config_review_status')) {
					$rating = (int)$result1['rating'];
				} else {
					$rating = false;
				}

				$data['products1'][] = array(
					'product_id'  => $result1['product_id'],
					'thumb'       => $image,
					'name'        => $result1['name'],
					'description' => utf8_substr(strip_tags(html_entity_decode($result1['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get($this->config->get('config_theme') . '_product_description_length')) . '..',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => $result1['minimum'] > 0 ? $result1['minimum'] : 1,
					'rating'      => $rating,
					'href'        => $this->url->link('product/product', 'product_id=' . $result1['product_id'])
				);
			}
			
			/*rec*/

в product.tpl где надо вывод

<?php if ($products1) { ?>
      
	 <div class="box bestseller">
	  
	   <div class="box-heading"><?php echo $text_recommended; ?></div>
		<div id="products-recommended" class="recommended-products box-content">
			<?php 
				$sliderFor = 5;
				$productCount = sizeof($products1); 
			?>
			
				<?php if ($productCount >= $sliderFor): ?>
					<div class="customNavigation">
						<a class="fa prev"> </a>
						<a class="fa next"> </a>
					</div>	
				<?php endif; ?>	
				
				<div class="box-product <?php if ($productCount >= $sliderFor){?>product-carousel<?php }else{?>productbox-grid<?php }?>" id="<?php if ($productCount >= $sliderFor){?>bestseller-carousel<?php }else{?>bestseller-grid<?php }?>">
				
      		  <?php foreach ($products1 as $product) { ?>
				<div class="<?php if ($productCount >= $sliderFor){?>slider-item<?php }else{?>product-items<?php }?>">
					 <div class="product-block product-thumb transition">
	  					<div class="product-block-inner">
					<div class="product-block_img">
					<div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" alt="<?php echo $product['name']; ?>" title="<?php echo $product['name']; ?>" class="img-responsive" /></a></div>
					<div class="button-group">
					<button type="button"onclick="cart.add('<?php echo $product['product_id']; ?>', '<?php echo $product['minimum']; ?>');"><i class="fa fa-shopping-cart"></i> <span class="hidden-xs hidden-sm hidden-md"><?php echo $button_cart; ?></span></button>
					</div>
					</div>
					
					<div class="product-block_content">
					<div class="caption">
					
					  <h4><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></h4>
					<?php /*?>  <p><?php echo $product['description']; ?></p><?php */?>
					  <?php if ($product['rating']) { ?>
					  <div class="rating">
						<?php for ($i = 1; $i <= 5; $i++) { ?>
						<?php if ($product['rating'] < $i) { ?>
						<span class="fa fa-stack"><i class="fa fa-star off fa-stack-1x"></i></span>
						<?php } else { ?>
						<span class="fa fa-stack"><i class="fa fa-star fa-stack-1x"></i></span>
						<?php } ?>
						<?php } ?>
					  </div>
					  <?php } ?>
					  <?php if ($product['price']) { ?>
					  <p class="price">
						<?php if (!$product['special']) { ?>
						<?php echo $product['price']; ?>
						<?php } else { ?>
						<span class="price-old"><?php echo $product['price']; ?></span> <span class="price-new"><?php echo $product['special']; ?></span> 
						<?php } ?>
						<?php if ($product['tax']) { ?>
						<span class="price-tax"><?php echo $text_tax; ?> <?php echo $product['tax']; ?></span>
						<?php } ?>
					  </p>
					  <?php } ?>
					</div>
					</div>
					   
					 <?php /*?> <button type="button" data-toggle="tooltip" title="<?php echo $button_wishlist; ?>" onclick="wishlist.add('<?php echo $product['product_id']; ?>');"><i class="fa fa-heart"></i></button>
					  <button type="button" data-toggle="tooltip" title="<?php echo $button_compare; ?>" onclick="compare.add('<?php echo $product['product_id']; ?>');"><i class="fa fa-exchange"></i></button><?php */?>
					
				  		
					<!-- Megnor Related Products Start -->	
				  </div>
				  </div>
				</div>
				
				<?php } ?>
				</div>
		</div>
		 </div>
		<span class="bestseller_default_width" style="display:none; visibility:hidden"></span>
	 
	 
      <?php } ?>
  • +1 2
Надіслати
Поділитися на інших сайтах


  • 2 months later...

Добрый вечер, делал все по инструкции и в конце получил

Fatal error: Call to undefined method ModelCatalogProduct::getProductRecommended() in /home/host1447470/miltorg.com/htdocs/www/catalog/controller/product/product.php on line 467

 

​Как поправить?

Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

В модель catalog/model/catalog/product.php после

public function getProductImages($product_id) {

..........

}

нужно дописать функцию getProductRecommended


    //reccomended
    
    public function getProductRecommended($product_id) {
        $product_data = array();

        $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_recommended pr LEFT JOIN " . DB_PREFIX . "product p ON (pr.recommended_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pr.product_id = '" . (int)$product_id . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

        foreach ($query->rows as $result) {
            $product_data[$result['recommended_id']] = $this->getProduct($result['recommended_id']);
        }

        return $product_data;
    }
   

А то я забыла добавить

  • +1 1
Надіслати
Поділитися на інших сайтах


  • 1 month later...
  • 2 months later...

Спасибо за решение, работает,

но если в сопутствующих ничего не привязано, то выдает ошибку:

Notice: Undefined variable: products1 in ......../www/system/storage/modification/catalog/view/theme/next-default/template/product/product.tpl on line 508

В контроллерах и шаблонах все по мануалу, где еще может не пускать этот "products1"?

 

Надіслати
Поділитися на інших сайтах


  • 1 year later...
  • 2 months later...

Спасибо! Хорошее дополнение! 

Все получилось, но обнаружилась проблема, при повторном сохранении товара, пропадают все значения из поля Recommended, а если поле Сопутствующие товары пустое, то при повторном сохранении данные из Recommended попадают в Сопутствующие товары. Где я мог что-то упустить?

Подскажите пожалуйста!

 

Думаю проблема тут:

		$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$product_id . "'");
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE recommended_id = '" . (int)$product_id . "'");

		if (isset($data['product_recommended'])) {
			foreach ($data['product_recommended'] as $recommended_id) {
				$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$product_id . "' AND recommended_id = '" . (int)$recommended_id . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_recommended SET product_id = '" . (int)$product_id . "', recommended_id = '" . (int)$recommended_id . "'");
				$this->db->query("DELETE FROM " . DB_PREFIX . "product_recommended WHERE product_id = '" . (int)$recommended_id . "' AND recommended_id = '" . (int)$product_id . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_recommended SET product_id = '" . (int)$recommended_id . "', recommended_id = '" . (int)$product_id . "'");
			}
		}

но не пойму в чем именно

Змінено користувачем max1985
Надіслати
Поділитися на інших сайтах

  • 10 months later...

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.