Jump to content

Связанные товары в каталоге products.tpl


Recommended Posts

Добрый день форумчани, и со всеми праздниками!

Хочу вывести связанные товары в каталоге к каждому товару (где есть связанные товары у товара).

В ProductsView.php вставляю:


$related_ids = array();
$related_products = array();
foreach($this->products->get_related_products($products_ids) as $p)
{
	$related_ids[] = $p->related_id;
	$related_products[$p->related_id] = null;
}
if(!empty($related_ids))
{
	foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
		$related_products[$p->id] = $p;
	
	$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
	foreach($related_products_images as $related_product_image)
		if(isset($related_products[$related_product_image->product_id]))
			$related_products[$related_product_image->product_id]->images[] = $related_product_image;
	$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
	foreach($related_products_variants as $related_product_variant)
	{
		if(isset($related_products[$related_product_variant->product_id]))
		{
			$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
		}
	}
	foreach($related_products as $id=>$r)
	{
		if(is_object($r))
		{
			$r->image = &$r->images[0];
			$r->variant = &$r->variants[0];
		}
		else
		{
			unset($related_products[$id]);
		}
	}
}

ну и в шаблоне products.tpl вывожу

{if $related_products}
     тут отображение связанных товаров
{/if}

Но почему не отображаются?(

Link to post
Share on other sites
20 минут назад, phukortsin сказал:

Возможно, потому, что данные не переданы в шаблон... 

пробовал методом

$product->related_products = array();

чтобы вывести через $product->related_products и тоже не работает(

Link to post
Share on other sites
20 минут назад, phukortsin сказал:

Пробовать лишь бы как методом тыка - не лучшая стратегия...

вывести где угодно "методом тыка" получается, а вот в каталоге нет....аналогичный метод а ТЫК не работает...

 

 

 

Link to post
Share on other sites
1 час назад, get31 сказал:

вывести где угодно "методом тыка" получается, а вот в каталоге нет....аналогичный метод а ТЫК не работает...

 

 

 

Очень сомневаюсь, что Вы сможете это сделать "где угодно".

И дополнительно возникает вопрос о смысле этого "где угодно". У Вас получается вывести абсолютно ВО ВСЕХ местах, кроме каталога? Все у Вас получается на главной, на странице корзины, на странице заказа, на инфостраницах, в блоге, в личном кабинете, в письмах? Может, сможете описать полностью свое рабочее решение хоть в одном из перечисленных случаев?

Link to post
Share on other sites
12 минут назад, phukortsin сказал:

Может, сможете описать полностью свое рабочее решение хоть в одном из перечисленных случаев?

Пруфы нужны? Та не вопрос. В OrderView после foreach($purchases as &$purchase){ }

добавляем:


		$order->related_products = array();

		$related_ids = array();
		$related_products = array();
		foreach($this->products->get_related_products($products_ids) as $p)
		{
			$related_ids[] = $p->related_id;
			$related_products[$p->related_id] = null;
		}
		if(!empty($related_ids))
		{
			foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
				$related_products[$p->id] = $p;
			
			$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
			foreach($related_products_images as $related_product_image)
				if(isset($related_products[$related_product_image->product_id]))
					$related_products[$related_product_image->product_id]->images[] = $related_product_image;
			$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
			foreach($related_products_variants as $related_product_variant)
			{
				if(isset($related_products[$related_product_variant->product_id]))
				{
					$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
				}
			}
			foreach($related_products as $id=>$r)
			{
				if(is_object($r))
				{
					$r->image = &$r->images[0];
					$r->variant = &$r->variants[0];

					$order->related_products[] = $r;
				}
				else
				{
					unset($related_products[$id]);
				}
			}
		}

В шаблоне выводим: {if $order->related_products} тут связанные товары {/if}

 

17 минут назад, phukortsin сказал:

Очень сомневаюсь

Еще есть сомнения?

 

В 07.01.2024 в 15:41, phukortsin сказал:

Возможно

....одни сомнения в ответах

Link to post
Share on other sites
5 минут назад, phukortsin сказал:

Видно четко, что во втором коде данные в шаблон передаются. А в первом НЕ передаются.

Я ранее уже писал что:

В 07.01.2024 в 16:03, get31 сказал:

через $product->related_products и тоже не работает

 

Link to post
Share on other sites

Оно и не должно работать. Если считаете, что должно, то пишите ТОЧНЫЕ объяснения, с какой стати это должно работать. Причина все та же - нужные данные в шаблон НЕ передаются.

Link to post
Share on other sites
5 минут назад, phukortsin сказал:

Оно и не должно работать. Если считаете, что должно, то пишите ТОЧНЫЕ объяснения, с какой стати это должно работать. Причина все та же - нужные данные в шаблон НЕ передаются.

Интересная логика получается, по коду для OrderView данные передаются, а для ProductsView не передаются, а код идентичный)))

		$product->related_products = array();

		$related_ids = array();
		$related_products = array();
		foreach($this->products->get_related_products($products_ids) as $p)
		{
			$related_ids[] = $p->related_id;
			$related_products[$p->related_id] = null;
		}
		if(!empty($related_ids))
		{
			foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
				$related_products[$p->id] = $p;
			
			$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
			foreach($related_products_images as $related_product_image)
				if(isset($related_products[$related_product_image->product_id]))
					$related_products[$related_product_image->product_id]->images[] = $related_product_image;
			$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
			foreach($related_products_variants as $related_product_variant)
			{
				if(isset($related_products[$related_product_variant->product_id]))
				{
					$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
				}
			}
			foreach($related_products as $id=>$r)
			{
				if(is_object($r))
				{
					$r->image = &$r->images[0];
					$r->variant = &$r->variants[0];

					$product->related_products[] = $r;
				}
				else
				{
					unset($related_products[$id]);
				}
			}
		}

 

Link to post
Share on other sites
$product->related_products = array();

Как бы вот это хрень полная))

В OrderView $order ОДИН , а в ProductsView $product - его НЕТ, он существует только внутри $products

Если не имеете понятия, что делаете и зачем - лучше не лезть

Link to post
Share on other sites
1 час назад, Kosjak76 сказал:

$product->related_products = array();

Как бы вот это хрень полная))

В OrderView $order ОДИН , а в ProductsView $product - его НЕТ, он существует только внутри $products

Если не имеете понятия, что делаете и зачем - лучше не лезть

Почему в шаблоне связанный товар отображается на всех товарах? а не для каждого свой (если есть связанные товары)?

		$related_ids = array();
		$related_products = array();
		foreach($this->products->get_related_products($products_ids) as $p)
		{
			$related_ids[] = $p->related_id;
			$related_products[$p->related_id] = null;
		}

		if(!empty($related_ids))
		{
			foreach($this->products->get_products(array('id'=>$related_ids, 'visible'=>1)) as $p)
				$related_products[$p->id] = $p;
			
			$related_products_images = $this->products->get_images(array('product_id'=>array_keys($related_products)));
			foreach($related_products_images as $related_product_image)
				if(isset($related_products[$related_product_image->product_id]))
					$related_products[$related_product_image->product_id]->images[] = $related_product_image;
			$related_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($related_products), 'in_stock'=>1));
			foreach($related_products_variants as $related_product_variant)
			{
				if(isset($related_products[$related_product_variant->product_id]))
				{
					$related_products[$related_product_variant->product_id]->variants[] = $related_product_variant;
				}
			}
			foreach($related_products as $id=>$r)
			{
				if(is_object($r))
				{
					$r->image = &$r->images[0];
					$r->variant = &$r->variants[0];
				}
				else
				{
					unset($related_products[$id]);
				}
			}
			$this->design->assign('related_products', $related_products);
		}

 

Link to post
Share on other sites
1 час назад, get31 сказал:

Почему в шаблоне связанный товар отображается на всех товарах? а не для каждого свой (если есть связанные товары)?

Видимо, потому что автор так запрограммировал. 

По тому, что предоставлено, видно что они В ПРИНЦИПЕ не могут отображаться "для каждого свой", поскольку автор их свалил в одну кучу в одной переменной без  какого бы то ни было разделения.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...