PageRenderTime 52ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/magmi/plugins/base/itemprocessors/related/related_products.php

https://bitbucket.org/jit_bec/shopifine
PHP | 301 lines | 270 code | 26 blank | 5 comment | 28 complexity | 72b5c226a9114bbf5c91125d49981116 MD5 | raw file
Possible License(s): LGPL-3.0
  1. <?php
  2. class RelatedProducts extends Magmi_ItemProcessor
  3. {
  4. public function getPluginInfo()
  5. {
  6. return array(
  7. "name" => "Product relater",
  8. "author" => "Dweeves,jwtechniek",
  9. "version" => "1.0.3",
  10. "url"=>"https://sourceforge.net/apps/mediawiki/magmi/index.php?title=Product_relater"
  11. );
  12. }
  13. public function checkRelated(&$rinfo)
  14. {
  15. if(count($rinfo["direct"])>0)
  16. {
  17. $sql="SELECT testid.sku,cpe.sku as esku FROM ".$this->arr2select($rinfo["direct"],"sku")." AS testid
  18. LEFT JOIN ".$this->tablename("catalog_product_entity")." as cpe ON cpe.sku=testid.sku
  19. WHERE testid.sku NOT LIKE '%re::%'
  20. HAVING esku IS NULL";
  21. $result=$this->selectAll($sql,$rinfo["direct"]);
  22. $to_delete=array();
  23. foreach($result as $row)
  24. {
  25. $this->log("Unknown related sku ".$row["sku"],"warning");
  26. $to_delete[]=$row["sku"];
  27. }
  28. $rinfo["direct"]=array_diff($rinfo["direct"],$to_delete);
  29. }
  30. return count($rinfo["direct"])+count($rinfo["re"]);
  31. }
  32. public function processItemAfterId(&$item,$params=null)
  33. {
  34. $related=isset($item["re_skus"])?$item["re_skus"]:null;
  35. $xrelated=isset($item["xre_skus"])?$item["xre_skus"]:null;
  36. $srelated=isset($item["*re_skus"])?$item["*re_skus"]:null;
  37. $pid=$params["product_id"];
  38. $new=$params["new"];
  39. if(isset($related) && trim($related)!="")
  40. {
  41. $rinf=$this->getRelInfos($related);
  42. if($new==false)
  43. {
  44. $this->deleteRelatedItems($item,$rinf["del"]);
  45. }
  46. $this->setRelatedItems($item,$rinf["add"]);
  47. }
  48. if(isset($xrelated) && trim($xrelated)!="")
  49. {
  50. $rinf=$this->getRelInfos($xrelated);
  51. if($new==false)
  52. {
  53. $this->deleteXRelatedItems($item,$rinf["del"]);
  54. }
  55. $this->setXRelatedItems($item,$rinf["add"]);
  56. }
  57. if(isset($srelated) && trim($srelated)!="")
  58. {
  59. $rinf=$this->getRelInfos($srelated);
  60. if($new==false)
  61. {
  62. $this->deleteXRelatedItems($item,$rinf["del"],true);
  63. }
  64. $this->setXRelatedItems($item,$rinf["add"],true);
  65. }
  66. }
  67. public function deleteRelatedItems($item,$inf)
  68. {
  69. $joininfo=$this->buildJoinCond($item,$inf,"cpe2.sku");
  70. $j2=$joininfo["join"]["cpe2.sku"];
  71. if($j2!="")
  72. {
  73. $sql="DELETE cplai.*,cpl.*
  74. FROM ".$this->tablename("catalog_product_entity")." as cpe
  75. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='relation'
  76. JOIN ".$this->tablename("catalog_product_link")." as cpl ON cpl.product_id=cpe.entity_id AND cpl.link_type_id=cplt.link_type_id
  77. JOIN ".$this->tablename("catalog_product_link_attribute_int")." as cplai ON cplai.link_id=cpl.link_id
  78. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.sku!=cpe.sku AND $j2
  79. WHERE cpe.sku=?";
  80. $this->delete($sql,array_merge($joininfo["data"]["cpe2.sku"],array($item["sku"])));
  81. }
  82. }
  83. public function deleteXRelatedItems($item,$inf,$fullcross=false)
  84. {
  85. $joininfo=$this->buildJoinCond($item,$inf,"cpe2.sku,cpe.sku");
  86. $j2=$joininfo["join"]["cpe2.sku"];
  87. $j=$joininfo["join"]["cpe.sku"];
  88. if($j2!="")
  89. {
  90. $sql="DELETE cplai.*,cpl.*
  91. FROM ".$this->tablename("catalog_product_entity")." as cpe
  92. JOIN ".$this->tablename("catalog_product_link")." as cpl ON cpl.product_id=cpe.entity_id
  93. JOIN ".$this->tablename("catalog_product_link_attribute_int")." as cplai ON cplai.link_id=cpl.link_id
  94. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.sku!=cpe.sku AND (cpe2.sku=? OR $j2)
  95. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='relation'
  96. WHERE cpe.sku=? OR $j";
  97. $this->delete($sql,array_merge(array($item["sku"]),$joininfo["data"]["cpe2.sku"],array($item["sku"]),$joininfo["data"]["cpe.sku"]));
  98. }
  99. }
  100. public function getDirection(&$inf)
  101. {
  102. $dir="+";
  103. if($inf[0]=="-" || $inf[0]=="+")
  104. {
  105. $dir=$inf[0];
  106. $inf=substr($inf,1);
  107. }
  108. return $dir;
  109. }
  110. public function getRelInfos($relationdef)
  111. {
  112. $relinfos=explode(",",$relationdef);
  113. $relskusadd=array("direct"=>array(),"re"=>array());
  114. $relskusdel=array("direct"=>array(),"re"=>array());
  115. foreach($relinfos as $relinfo)
  116. {
  117. $rinf=explode("::",$relinfo);
  118. if(count($rinf)==1)
  119. {
  120. if($this->getDirection($rinf[0])=="+")
  121. {
  122. $relskusadd["direct"][]=$rinf[0];
  123. }
  124. else
  125. {
  126. $relskusdel["direct"][]=$rinf[0];
  127. }
  128. }
  129. if(count($rinf)==2)
  130. {
  131. $dir=$this->getDirection($rinf[0]);
  132. if($dir=="+")
  133. {
  134. switch($rinf[0])
  135. {
  136. case "re":
  137. $relskusadd["re"][]=$rinf[1];
  138. break;
  139. }
  140. }
  141. else
  142. {
  143. switch($rinf[0])
  144. {
  145. case "re":
  146. $relskusdel["re"][]=$rinf[1];
  147. break;
  148. }
  149. }
  150. }
  151. }
  152. return array("add"=>$relskusadd,"del"=>$relskusdel);
  153. }
  154. public function buildJoinCond($item,$rinfo,$keys)
  155. {
  156. $joinconds=array();
  157. $joins=array();
  158. $klist=explode(",",$keys);
  159. foreach($klist as $key)
  160. {
  161. $data[$key]=array();
  162. $joinconds[$key]=array();
  163. if(count($rinfo["direct"])>0)
  164. {
  165. $joinconds[$key][]="$key IN (".$this->arr2values($rinfo["direct"]).")";
  166. $data[$key]=array_merge($data[$key],$rinfo["direct"]);
  167. }
  168. if(count($rinfo["re"])>0)
  169. {
  170. foreach($rinfo["re"] as $rinf)
  171. {
  172. $joinconds[$key][]="$key REGEXP ?";
  173. $data[$key][]=$rinf;
  174. }
  175. }
  176. $joins[$key] = implode(" OR ",$joinconds[$key]);
  177. if($joins[$key]!="")
  178. {
  179. $joins[$key]="({$joins[$key]})";
  180. }
  181. }
  182. return array("join"=>$joins,"data"=>$data);
  183. }
  184. public function setRelatedItems($item,$rinfo)
  185. {
  186. if($this->checkRelated($rinfo)>0)
  187. {
  188. $joininfo=$this->buildJoinCond($item,$rinfo,"cpe2.sku");
  189. $jinf=$joininfo["join"]["cpe2.sku"];
  190. if($jinf!="")
  191. {
  192. //insert into link table
  193. $bsql="SELECT cplt.link_type_id,cpe.entity_id as product_id,cpe2.entity_id as linked_product_id
  194. FROM ".$this->tablename("catalog_product_entity")." as cpe
  195. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.sku!=cpe.sku AND $jinf
  196. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='relation'
  197. WHERE cpe.sku=?";
  198. $sql="INSERT IGNORE INTO ".$this->tablename("catalog_product_link")." (link_type_id,product_id,linked_product_id) $bsql";
  199. $data=array_merge($joininfo["data"]["cpe2.sku"],array($item["sku"]));
  200. $this->insert($sql,$data);
  201. $this->updateLinkAttributeTable($item["sku"],$joininfo);
  202. }
  203. }
  204. }
  205. public function setXRelatedItems($item,$rinfo,$fullrel=false)
  206. {
  207. if($this->checkRelated($rinfo)>0)
  208. {
  209. $joininfo=$this->buildJoinCond($item,$rinfo,"cpe.sku,cpe2.sku");
  210. $j2=$joininfo["join"]["cpe2.sku"];
  211. $j=$joininfo["join"]["cpe.sku"];
  212. if($j2!="")
  213. {
  214. //insert into link table
  215. $bsql="SELECT cplt.link_type_id,cpe.entity_id as product_id,cpe2.entity_id as linked_product_id
  216. FROM ".$this->tablename("catalog_product_entity")." as cpe
  217. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.entity_id!=cpe.entity_id AND (cpe2.sku=? OR $j2)
  218. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='relation'
  219. WHERE cpe.sku=? OR $j ";
  220. if(!$fullrel)
  221. {
  222. $bsql.=" AND NOT($j AND $j2)";
  223. }
  224. $sql="INSERT IGNORE INTO ".$this->tablename("catalog_product_link")." (link_type_id,product_id,linked_product_id) $bsql";
  225. $data=array_merge(array($item["sku"]),$joininfo["data"]["cpe2.sku"],array($item["sku"]),$joininfo["data"]["cpe.sku"]);
  226. if(!$fullrel)
  227. {
  228. $data=array_merge($data,$joininfo["data"]["cpe.sku"],$joininfo["data"]["cpe.sku"]);
  229. }
  230. $this->insert($sql,$data);
  231. $this->updateLinkAttributeTable($item["sku"],$joininfo);
  232. }
  233. }
  234. }
  235. public function updateLinkAttributeTable($sku,$joininfo)
  236. {
  237. //insert into attribute link attribute int table,reusing the same relations
  238. $ji=$joininfo["join"];
  239. $data=array($sku);
  240. $addcond="";
  241. if(isset($ji["cpe.sku"]))
  242. {
  243. $addcond="OR ".$joininfo["join"]["cpe.sku"];
  244. $data=array_merge($data,$joininfo["data"]["cpe.sku"]);
  245. }
  246. //this enable to mass add
  247. $bsql="SELECT cpl.link_id,cpla.product_link_attribute_id,0 as value
  248. FROM ".$this->tablename("catalog_product_entity")." AS cpe
  249. JOIN ".$this->tablename("catalog_product_entity")." AS cpe2 ON cpe2.entity_id!=cpe.entity_id
  250. JOIN ".$this->tablename("catalog_product_link_type")." AS cplt ON cplt.code='relation'
  251. JOIN ".$this->tablename("catalog_product_link_attribute")." AS cpla ON cpla.product_link_attribute_code='position' AND cpla.link_type_id=cplt.link_type_id
  252. JOIN ".$this->tablename("catalog_product_link") ." AS cpl ON cpl.link_type_id=cplt.link_type_id AND cpl.product_id=cpe.entity_id AND cpl.linked_product_id=cpe2.entity_id
  253. WHERE cpe.sku=? $addcond";
  254. $sql="INSERT IGNORE INTO ".$this->tablename("catalog_product_link_attribute_int")." (link_id,product_link_attribute_id,value) $bsql";
  255. $this->insert($sql,$data);
  256. }
  257. public function afterImport()
  258. {
  259. //remove maybe inserted doubles
  260. $cplai=$this->tablename("catalog_product_link_attribute_int");
  261. $sql="DELETE cplaix FROM $cplai as cplaix
  262. WHERE cplaix.value_id IN
  263. (SELECT s1.value_id FROM
  264. (SELECT cplai.link_id,cplai.value_id,MAX(cplai.value_id) as latest
  265. FROM $cplai as cplai
  266. GROUP BY cplai.link_id
  267. HAVING cplai.value_id!=latest)
  268. as s1)";
  269. $this->delete($sql);
  270. }
  271. static public function getCategory()
  272. {
  273. return "Related Products";
  274. }
  275. }