Jump to content

Attach product to all parent categories


sitte

Recommended Posts

Hello. My client has large category tree in prestashop 1.5 website. Products are attached to child categories but not to parent ones. Is there any easy way to add parent categories to all products?

For example product is attached to cat1_1_2 but I want to attache it to Cat1_1 and Cat1 categories also.

Root Category
 - Cat1
   - Cat1_1
     - Cat1_1_1
     - Cat1_1_2
 - Cat2
 - Cat3

My only idea is to write php script to get parent categories for every product and then insert attachement records one by one. Is there any simpler way? Or maybe somebody has such script?

Link to comment
Share on other sites

Hello. This is script I made to attach products to parent categories if somebody needs it. It works for prestashop 1.5. You need to insert proper values of database and rootcat into code. You can run it by opening:

ScriptName.php?od=1&do=1000

"od" parameter is "from this product id"

"do" parameter is "to this product id"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
$db_host = "host";
$db_user = "user";
$db_pass = "password";
$db_name = "dbname";
$rootcat=3;
$raport='';

function produktyzkategorii($idkat) {

	//połączenie
	GLOBAL $db_host; GLOBAL $db_user; GLOBAL $db_pass; GLOBAL $db_name; GLOBAL $rootcat; GLOBAL $raport;
	if (!($baza = @mysql_connect($db_host, $db_user, $db_pass))) die ('Wystąpił problem z połączeniem z bazą danych Mysql. Proszę odświerzyć stronę');
	mysql_select_db ($db_name) or die ('Problem z wyborem bazy. Jeśli sytuacja się powtarza prosze poinformować osobę odpowiedzialną za stronę'); mysql_query('SET CHARACTER SET utf8'); mysql_query('SET NAMES utf8');
	
	//sprawdzenie	
	$idkat=intval($idkat); if ($idkat<1) return false;
		
	$zapytanie= 'SELECT * FROM `ps_category_product` WHERE `id_category`='.$idkat;
	$odpowiedz=mysql_query($zapytanie);
	$wynik=array();
	while ($row = mysql_fetch_object($odpowiedz)) {
		$wynik[$row->id_product]=$row;
	}
	mysql_free_result($odpowiedz);
	return $wynik;
}

function ProduktyOId($od,$do) {

	//połączenie
	GLOBAL $db_host; GLOBAL $db_user; GLOBAL $db_pass; GLOBAL $db_name; GLOBAL $rootcat; GLOBAL $raport;
	if (!($baza = @mysql_connect($db_host, $db_user, $db_pass))) die ('Wystąpił problem z połączeniem z bazą danych Mysql. Proszę odświerzyć stronę');
	mysql_select_db ($db_name) or die ('Problem z wyborem bazy. Jeśli sytuacja się powtarza prosze poinformować osobę odpowiedzialną za stronę'); mysql_query('SET CHARACTER SET utf8'); mysql_query('SET NAMES utf8');
	
	//sprawdzenie	
	$od=intval($od); if ($od<1) return false;
	$do=intval($do); if ($do<=$od) return false;
		
	$zapytanie= 'SELECT * FROM `ps_category_product` WHERE `id_product`>='.$od.' AND `id_product`<'.$do;
	$odpowiedz=mysql_query($zapytanie);
	$wynik=array();
	while ($row = mysql_fetch_object($odpowiedz)) {
		$wynik[$row->id_product]=$row;
	}
	mysql_free_result($odpowiedz);
	return $wynik;
}



function rodzicproduktu($idprod) {

	//połączenie
	GLOBAL $db_host; GLOBAL $db_user; GLOBAL $db_pass; GLOBAL $db_name; GLOBAL $rootcat; GLOBAL $raport;
	if (!($baza = @mysql_connect($db_host, $db_user, $db_pass))) die ('Wystąpił problem z połączeniem z bazą danych Mysql. Proszę odświerzyć stronę');
	mysql_select_db ($db_name) or die ('Problem z wyborem bazy. Jeśli sytuacja się powtarza prosze poinformować osobę odpowiedzialną za stronę'); mysql_query('SET CHARACTER SET utf8'); mysql_query('SET NAMES utf8');
	
	//sprawdzenie	
	$idprod=intval($idprod); if ($idprod<1) return false;
		
	$zapytanie= 'SELECT cp.`id_category` as `id_category` FROM `ps_category_product` cp LEFT JOIN `ps_category` c ON c.`id_category`=cp.`id_category` WHERE cp.`id_product`='.$idprod.' ORDER BY `level_depth` DESC LIMIT 1';
	$odpowiedz=mysql_query($zapytanie);
	$row = mysql_fetch_object($odpowiedz);
	$wynik=$row->id_category;
	mysql_free_result($odpowiedz);
	return $wynik;
}

function rodziceproduktu($idprod) {

	//połączenie
	GLOBAL $db_host; GLOBAL $db_user; GLOBAL $db_pass; GLOBAL $db_name; GLOBAL $rootcat; GLOBAL $raport;
	if (!($baza = @mysql_connect($db_host, $db_user, $db_pass))) die ('Wystąpił problem z połączeniem z bazą danych Mysql. Proszę odświerzyć stronę');
	mysql_select_db ($db_name) or die ('Problem z wyborem bazy. Jeśli sytuacja się powtarza prosze poinformować osobę odpowiedzialną za stronę'); mysql_query('SET CHARACTER SET utf8'); mysql_query('SET NAMES utf8');
	
	//sprawdzenie	
	$idprod=intval($idprod); if ($idprod<1) return false;
		
	$zapytanie= 'SELECT cp.`id_category` as `id_category` FROM `ps_category_product` cp LEFT JOIN `ps_category` c ON c.`id_category`=cp.`id_category` WHERE cp.`id_product`='.$idprod.' ORDER BY `level_depth` DESC';
	$odpowiedz=mysql_query($zapytanie);
	while ($row = mysql_fetch_object($odpowiedz))
		{$wynik[]=$row->id_category;
		}
	mysql_free_result($odpowiedz);
	return $wynik;
}

function rodzickategorii($idkat) {

	//połączenie
	GLOBAL $db_host; GLOBAL $db_user; GLOBAL $db_pass; GLOBAL $db_name; GLOBAL $rootcat; GLOBAL $raport;
	if (!($baza = @mysql_connect($db_host, $db_user, $db_pass))) die ('Wystąpił problem z połączeniem z bazą danych Mysql. Proszę odświerzyć stronę');
	mysql_select_db ($db_name) or die ('Problem z wyborem bazy. Jeśli sytuacja się powtarza prosze poinformować osobę odpowiedzialną za stronę'); mysql_query('SET CHARACTER SET utf8'); mysql_query('SET NAMES utf8');
	
	//sprawdzenie	
	$idkat=intval($idkat); if ($idkat<=$rootcat) return false;
		
	$zapytanie= 'SELECT `id_parent` FROM `ps_category` WHERE `id_category`='.$idkat;
	$odpowiedz=mysql_query($zapytanie);
	$row = mysql_fetch_object($odpowiedz);
	$wynik=$row->id_parent;
	mysql_free_result($odpowiedz);
	return $wynik;
}

function rodzicekategorii($idkat,&$wynik=null) {

	//połączenie
	GLOBAL $db_host; GLOBAL $db_user; GLOBAL $db_pass; GLOBAL $db_name; GLOBAL $rootcat; GLOBAL $raport;
	if (!($baza = @mysql_connect($db_host, $db_user, $db_pass))) die ('Wystąpił problem z połączeniem z bazą danych Mysql. Proszę odświerzyć stronę');
	mysql_select_db ($db_name) or die ('Problem z wyborem bazy. Jeśli sytuacja się powtarza prosze poinformować osobę odpowiedzialną za stronę'); mysql_query('SET CHARACTER SET utf8'); mysql_query('SET NAMES utf8');
	
	//sprawdzenie	
	$idkat=intval($idkat); if ($idkat<=$rootcat) return false;
	if(!$wynik) $wynik=array();
		
	$zapytanie= 'SELECT `id_parent` FROM `ps_category` WHERE `id_category`='.$idkat;
	$odpowiedz=mysql_query($zapytanie);
	if ($row = mysql_fetch_object($odpowiedz)){
		$wynik[]=intval($row->id_parent);
		rodzicekategorii($row->id_parent,$wynik);
	}
	mysql_free_result($odpowiedz);
	return $wynik;
}


function PrzypiszProduktDoKategorii($idkat,$idprod) {

	//połączenie
	GLOBAL $db_host; GLOBAL $db_user; GLOBAL $db_pass; GLOBAL $db_name; GLOBAL $rootcat; GLOBAL $raport;
	if (!($baza = @mysql_connect($db_host, $db_user, $db_pass))) die ('Wystąpił problem z połączeniem z bazą danych Mysql. Proszę odświerzyć stronę');
	mysql_select_db ($db_name) or die ('Problem z wyborem bazy. Jeśli sytuacja się powtarza prosze poinformować osobę odpowiedzialną za stronę'); mysql_query('SET CHARACTER SET utf8'); mysql_query('SET NAMES utf8');
	
	//sprawdzenie	
	$idkat=intval($idkat); if ($idkat<=$rootcat) return false;
	$idprod=intval($idprod); if ($idprod<1) return false;	
	
	//sprawdzenie przypisania
	$zapytanie= "SELECT * FROM `ps_category_product` WHERE `id_category`='".$idkat."' AND `id_product`='".$idprod."'";
	//echo $zapytanie;
	$odpowiedz=mysql_query($zapytanie);
	if (@mysql_num_rows($odpowiedz)>0) {$raport.= '  <small style="color:#f00;">Produkt '.$idprod.' już jest w kategorii'.$idkat.'</small><br/>' ; return false;}
	
	$zapytanie= "INSERT INTO `ps_category_product` (`id_category`, `id_product`) VALUES ('".$idkat."', '".$idprod."');";
	//echo '<br/>'.$zapytanie;
	return $odpowiedz=mysql_query($zapytanie);
}





function RodziceNadrodziceProduktu($idprod) {
	$rodziceproduktu=rodziceproduktu($idprod);
	$rodzice=array();
	//dla każdego rodzica sprawdzić nadkategorie i dołączyć do tabeli $rodzice
	foreach ($rodziceproduktu as $rodzicproduktu) 
   		{$rodzicekategorii=rodzicekategorii($rodzicproduktu);
		 $rodzice=array_merge($rodzice,$rodzicekategorii);
		 }
	$rodzice=array_unique($rodzice);
	return $rodzice;
}
	

	
$od=intval($_GET['od']);
$do=intval($_GET['do']);
if ($od<1) die ('Parametr od jest mniejszy niż 1');
if ($do<1) die ('Parametr do jest mniejszy niż 1');
if ($od>=$do) die ('Parametr od nie jest mniejszy niż do');




$produkty=ProduktyOId($od,$do);
foreach ($produkty AS $produkt)
  {$rodzice=RodziceNadrodziceProduktu($produkt->id_product);
   $raport.= 'Przypisuje produkt:'.$produkt->id_product.' do kategorii:'.implode ( ',' , $rodzice ).'<br/>';
   foreach ($rodzice AS $rodzic) if (PrzypiszProduktDoKategorii($rodzic,$produkt->id_product)) $raport.= '  <small style="color:#080;">Produkt '.$produkt->id_product.' przypisany do kategorii'.$rodzic.'</small><br/>';
   file_put_contents("raport.html", $raport, FILE_APPEND);
   echo $raport;
   $raport='';
   }

?>





</body>
</html>
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...