kate1987

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

Рекомендуемые сообщения

kate1987    36

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

Сначала создала таблицу в 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();
});

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

 

 

Прошу помощи


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
kate1987    36

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

 

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

	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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Tom    1 919

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
kate1987    36

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

В котроллере (строка 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 } ?>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
legion1607    0

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
kate1987    36

В модель 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;
    }
   

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
mitiya    1

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу