PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/magmi/plugins/base/itemprocessors/upcross_sell/crossupsell_products.php

https://bitbucket.org/jit_bec/shopifine
PHP | 279 lines | 250 code | 24 blank | 5 comment | 23 complexity | f607d23ba8eceb5c0c56442326ad17ae MD5 | raw file
Possible License(s): LGPL-3.0
  1. <?php
  2. class CrossUpsellProducts extends Magmi_ItemProcessor
  3. {
  4. public function getPluginInfo()
  5. {
  6. return array(
  7. "name" => "Cross/Upsell Importer",
  8. "author" => "Dweeves",
  9. "version" => "1.0.3",
  10. "url"=>"https://sourceforge.net/apps/mediawiki/magmi/index.php?title=Cross/Upsell_Importer"
  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. $usell=isset($item["us_skus"])?$item["us_skus"]:null;
  35. $csell=isset($item["cs_skus"])?$item["cs_skus"]:null;
  36. $pid=$params["product_id"];
  37. $new=$params["new"];
  38. if(isset($usell) && trim($usell)!="")
  39. {
  40. $rinf=$this->getRelInfos($usell);
  41. if($new==false)
  42. {
  43. $this->deleteUsellItems($item,$rinf["del"]);
  44. }
  45. $this->setUsellItems($item,$rinf["add"]);
  46. }
  47. if(isset($csell) && trim($csell)!="")
  48. {
  49. $rinf=$this->getRelInfos($csell);
  50. if($new==false)
  51. {
  52. $this->deleteCSellItems($item,$rinf["del"]);
  53. }
  54. $this->setCSellItems($item,$rinf["add"]);
  55. }
  56. }
  57. public function deleteUSellItems($item,$inf)
  58. {
  59. $joininfo=$this->buildJoinCond($item,$inf,"cpe2.sku");
  60. $j2=$joininfo["join"]["cpe2.sku"];
  61. if($j2!="")
  62. {
  63. $sql="DELETE cplai.*,cpl.*
  64. FROM ".$this->tablename("catalog_product_entity")." as cpe
  65. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='up_sell'
  66. JOIN ".$this->tablename("catalog_product_link")." as cpl ON cpl.product_id=cpe.entity_id AND cpl.link_type_id=cplt.link_type_id
  67. JOIN ".$this->tablename("catalog_product_link_attribute_int")." as cplai ON cplai.link_id=cpl.link_id
  68. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.entity_id!=cpe.entity_id AND $j2
  69. WHERE cpe.sku=?";
  70. $this->delete($sql,array_merge($joininfo["data"]["cpe2.sku"],array($item["sku"])));
  71. }
  72. }
  73. public function deleteCSellItems($item,$inf)
  74. {
  75. $joininfo=$this->buildJoinCond($item,$inf,"cpe2.sku");
  76. $j2=$joininfo["join"]["cpe2.sku"];
  77. if($j2!="")
  78. {
  79. $sql="DELETE cplai.*,cpl.*
  80. FROM ".$this->tablename("catalog_product_entity")." as cpe
  81. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='cross_sell'
  82. JOIN ".$this->tablename("catalog_product_link")." as cpl ON cpl.product_id=cpe.entity_id AND cpl.link_type_id=cplt.link_type_id
  83. JOIN ".$this->tablename("catalog_product_link_attribute_int")." as cplai ON cplai.link_id=cpl.link_id
  84. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.entity_id!=cpe.entity_id AND $j2
  85. WHERE cpe.sku=?";
  86. $this->delete($sql,array_merge($joininfo["data"]["cpe2.sku"],array($item["sku"])));
  87. }
  88. }
  89. public function getDirection(&$inf)
  90. {
  91. $dir="+";
  92. if($inf[0]=="-" || $inf[0]=="+")
  93. {
  94. $dir=$inf[0];
  95. $inf=substr($inf,1);
  96. }
  97. return $dir;
  98. }
  99. public function getRelInfos($relationdef)
  100. {
  101. $relinfos=explode(",",$relationdef);
  102. $relskusadd=array("direct"=>array(),"re"=>array());
  103. $relskusdel=array("direct"=>array(),"re"=>array());
  104. foreach($relinfos as $relinfo)
  105. {
  106. $rinf=explode("::",$relinfo);
  107. if(count($rinf)==1)
  108. {
  109. if($this->getDirection($rinf[0])=="+")
  110. {
  111. $relskusadd["direct"][]=$rinf[0];
  112. }
  113. else
  114. {
  115. $relskusdel["direct"][]=$rinf[0];
  116. }
  117. }
  118. if(count($rinf)==2)
  119. {
  120. $dir=$this->getDirection($rinf[0]);
  121. if($dir=="+")
  122. {
  123. switch($rinf[0])
  124. {
  125. case "re":
  126. $relskusadd["re"][]=$rinf[1];
  127. break;
  128. }
  129. }
  130. else
  131. {
  132. switch($rinf[0])
  133. {
  134. case "re":
  135. $relskusdel["re"][]=$rinf[1];
  136. break;
  137. }
  138. }
  139. }
  140. }
  141. return array("add"=>$relskusadd,"del"=>$relskusdel);
  142. }
  143. public function buildJoinCond($item,$rinfo,$keys)
  144. {
  145. $joinconds=array();
  146. $joins=array();
  147. $klist=explode(",",$keys);
  148. foreach($klist as $key)
  149. {
  150. $data[$key]=array();
  151. $joinconds[$key]=array();
  152. if(count($rinfo["direct"])>0)
  153. {
  154. $joinconds[$key][]="$key IN (".$this->arr2values($rinfo["direct"]).")";
  155. $data[$key]=array_merge($data[$key],$rinfo["direct"]);
  156. }
  157. if(count($rinfo["re"])>0)
  158. {
  159. foreach($rinfo["re"] as $rinf)
  160. {
  161. if($rinf!=".*")
  162. {
  163. $joinconds[$key][]="$key REGEXP ?";
  164. $data[$key][]=$rinf;
  165. }
  166. else
  167. {
  168. $joinconds[$key][]="?";
  169. $data[$key][]=1;
  170. }
  171. }
  172. }
  173. $joins[$key] = implode(" OR ",$joinconds[$key]);
  174. if($joins[$key]!="")
  175. {
  176. $joins[$key]="({$joins[$key]})";
  177. }
  178. }
  179. return array("join"=>$joins,"data"=>$data);
  180. }
  181. public function setUSellItems($item,$rinfo)
  182. {
  183. if($this->checkRelated($rinfo)>0)
  184. {
  185. $joininfo=$this->buildJoinCond($item,$rinfo,"cpe2.sku");
  186. $jinf=$joininfo["join"]["cpe2.sku"];
  187. if($jinf!="")
  188. {
  189. //insert into link table
  190. $bsql="SELECT cplt.link_type_id,cpe.entity_id as product_id,cpe2.entity_id as linked_product_id
  191. FROM ".$this->tablename("catalog_product_entity")." as cpe
  192. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.entity_id!=cpe.entity_id AND $jinf
  193. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='up_sell'
  194. WHERE cpe.sku=?";
  195. $sql="INSERT IGNORE INTO ".$this->tablename("catalog_product_link")." (link_type_id,product_id,linked_product_id) $bsql";
  196. $data=array_merge($joininfo["data"]["cpe2.sku"],array($item["sku"]));
  197. $this->insert($sql,$data);
  198. $this->updateLinkAttributeTable($item["sku"],$joininfo,'up_sell');
  199. }
  200. }
  201. }
  202. public function setCSellItems($item,$rinfo)
  203. {
  204. if($this->checkRelated($rinfo)>0)
  205. {
  206. $joininfo=$this->buildJoinCond($item,$rinfo,"cpe2.sku");
  207. $j2=$joininfo["join"]["cpe2.sku"];
  208. if($j2!="")
  209. {
  210. //insert into link table
  211. $bsql="SELECT cplt.link_type_id,cpe.entity_id as product_id,cpe2.entity_id as linked_product_id
  212. FROM ".$this->tablename("catalog_product_entity")." as cpe
  213. JOIN ".$this->tablename("catalog_product_entity")." as cpe2 ON cpe2.entity_id!=cpe.entity_id AND $j2
  214. JOIN ".$this->tablename("catalog_product_link_type")." as cplt ON cplt.code='cross_sell'
  215. WHERE cpe.sku=?";
  216. $sql="INSERT IGNORE INTO ".$this->tablename("catalog_product_link")." (link_type_id,product_id,linked_product_id) $bsql";
  217. $data=array_merge($joininfo["data"]["cpe2.sku"],array($item["sku"]));
  218. $this->insert($sql,$data);
  219. $this->updateLinkAttributeTable($item["sku"],$joininfo,'cross_sell');
  220. }
  221. }
  222. }
  223. public function updateLinkAttributeTable($sku,$joininfo,$reltype)
  224. {
  225. //insert into attribute link attribute int table,reusing the same relations
  226. //this enable to mass add
  227. $bsql="SELECT cpl.link_id,cpla.product_link_attribute_id,0 as value
  228. FROM ".$this->tablename("catalog_product_entity")." AS cpe
  229. JOIN ".$this->tablename("catalog_product_entity")." AS cpe2 ON cpe2.entity_id!=cpe.entity_id
  230. JOIN ".$this->tablename("catalog_product_link_type")." AS cplt ON cplt.code=?
  231. 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
  232. 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
  233. WHERE cpe.sku=?";
  234. $sql="INSERT IGNORE INTO ".$this->tablename("catalog_product_link_attribute_int")." (link_id,product_link_attribute_id,value) $bsql";
  235. $this->insert($sql,array($reltype,$sku));
  236. }
  237. public function afterImport()
  238. {
  239. //remove maybe inserted doubles
  240. $cplai=$this->tablename("catalog_product_link_attribute_int");
  241. $sql="DELETE cplaix FROM $cplai as cplaix
  242. WHERE cplaix.value_id IN
  243. (SELECT s1.value_id FROM
  244. (SELECT cplai.link_id,cplai.value_id,MAX(cplai.value_id) as latest
  245. FROM $cplai as cplai
  246. GROUP BY cplai.link_id
  247. HAVING cplai.value_id!=latest)
  248. as s1)";
  249. $this->delete($sql);
  250. }
  251. static public function getCategory()
  252. {
  253. return "Related Products";
  254. }
  255. }