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

/trunk/classes/modules/emarket/__compare.php

https://gitlab.com/BGCX261/zimmerli-svn-to-git
PHP | 310 lines | 238 code | 72 blank | 0 comment | 35 complexity | 6bb62e1c70620a12aee46ed9fd8bb864 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. abstract class __emarket_compare {
  3. public function compare($template = "default", $groups_names = '') {
  4. if(!$template) $template = "default";
  5. list(
  6. $template_block, $template_block_empty, $template_block_header, $template_block_header_item,
  7. $template_block_line, $template_block_line_item, $template_list_block, $template_list_block_line
  8. ) = $this->loadTemplates(
  9. "emarket/compare/{$template}", "compare_block", "compare_block_empty", "compare_block_header",
  10. "compare_block_header_item", "compare_block_line", "compare_block_line_item", "compare_list_block",
  11. "compare_list_block_line"
  12. );
  13. $elements = $this->getCompareElements();
  14. if(sizeof($elements) == 0) return $template_block_empty;
  15. $hierarchy = umiHierarchy::getInstance();
  16. $block_arr = array(); $items = array();
  17. $headers = array(); $headers_arr = array();
  18. foreach($elements as $element_id) {
  19. $element = $hierarchy->getElement($element_id);
  20. if(!$element) continue;
  21. $item_arr = array(
  22. 'attribute:id' => $element_id,
  23. 'attribute:link' => $hierarchy->getPathById($element_id),
  24. 'node:title' => $element->getName()
  25. );
  26. $items[] = def_module::parseTemplate($template_block_header_item, $item_arr, $element_id);
  27. }
  28. $headers_arr['subnodes:items'] = $items;
  29. $headers = def_module::parseTemplate($template_block_header, $headers_arr);
  30. $fields = array();
  31. foreach($elements as $element_id) {
  32. $fields = array_merge($fields, $this->getComparableFields($element_id,$groups_names));
  33. }
  34. $lines = array(); $iCnt = 0;
  35. foreach($fields as $field_name => $field) {
  36. $field_title = $field->getTitle();
  37. $items = array(); $is_void = true;
  38. foreach($elements as $element_id) {
  39. $element = $hierarchy->getElement($element_id);
  40. $item_arr = array(
  41. 'attribute:id' => $element_id,
  42. 'void:name' => $field_name,
  43. 'void:field_name' => $field_name,
  44. 'value' => $element->getObject()->getPropByName($field_name)
  45. );
  46. if($is_void && $element->$field_name) $is_void = false;
  47. $items[] = def_module::parseTemplate($template_block_line_item, $item_arr, $element_id);
  48. }
  49. if($is_void) continue;
  50. $iCnt++;
  51. $line_arr = array(
  52. 'attribute:title' => $field_title,
  53. 'attribute:name' => $field_name,
  54. 'attribute:type' => $field->getFieldType()->getDataType(),
  55. 'attribute:par' => intval($iCnt / 2 == ceil($iCnt / 2)),
  56. 'subnodes:values' => $line_arr['void:items'] = $items
  57. );
  58. $lines[] = def_module::parseTemplate($template_block_line, $line_arr);
  59. }
  60. $block_arr['headers'] = $headers;
  61. $block_arr['void:lines'] = $block_arr['void:fields'] = $lines;
  62. $block_arr['fields'] = array();
  63. $block_arr['fields']['nodes:field'] = $lines;
  64. return def_module::parseTemplate($template_block, $block_arr);
  65. }
  66. public function getCompareElements() {
  67. static $elements;
  68. if(is_array($elements)) {
  69. return $elements;
  70. }
  71. if(!is_array(getSession("compare_list"))) {
  72. $_SESSION['compare_list'] = array();
  73. }
  74. if(is_array(getRequest('compare_list'))) {
  75. $_SESSION['compare_list'] = getRequest('compare_list');
  76. }
  77. $elements = getSession("compare_list");
  78. $elements = array_unique($elements);
  79. return $elements;
  80. }
  81. public function getComparableFields($element_id, $groups_names = '') {
  82. $element = umiHierarchy::getInstance()->getElement($element_id);
  83. if(!$element) return false;
  84. $type_id = $element->getObject()->getTypeId();
  85. $type = umiObjectTypesCollection::getInstance()->getType($type_id);
  86. if(empty($groups_names)) {
  87. $fields = $type->getAllFields(true);
  88. }
  89. else {
  90. $groups_names = trim($groups_names);
  91. $groups_names = strlen($groups_names) ? explode(" ", $groups_names) : array();
  92. $groups_arr = $type->getFieldsGroupsList();
  93. $fields = array();
  94. foreach($groups_arr as $group) {
  95. if(!$group->getIsActive()) continue;
  96. if(!in_array($group->getName(), $groups_names)) {
  97. continue;
  98. }
  99. $fields = array_merge($fields,$group->getFields());
  100. }
  101. }
  102. $res = array();
  103. foreach($fields as $field) {
  104. if(!$field->getIsVisible()) continue;
  105. if(($field_name = $field->getName()) == "price") continue;
  106. $res[$field_name] = $field;
  107. }
  108. return $res;
  109. }
  110. public function addToCompare() {
  111. $this->add_to_compare(getRequest("param0"));
  112. $this->redirect(getServer('HTTP_REFERER'));
  113. }
  114. public function jsonAddToCompareList() {
  115. $element_id = getRequest("param0");
  116. list($add_to_compare_tpl, $already_exists_tpl) = $this->loadTemplates("emarket/compare/default", "json_add_to_compare", "json_compare_already_exists");
  117. $template = $this->add_to_compare($element_id) ? $add_to_compare_tpl : $already_exists_tpl;
  118. $block_arr = array('id' => $element_id);
  119. header("Content-type: text/javascript; charset=utf-8");
  120. $this->flush(def_module::parseTemplate($template, $block_arr, $element_id));
  121. }
  122. public function removeFromCompare() {
  123. $this->remove_from_compare(getRequest("param0"));
  124. $referer = getServer('HTTP_REFERER');
  125. if(stristr(getServer('HTTP_USER_AGENT'), 'msie')) {
  126. $referer = preg_replace(array("/\b\d{10,}\b/", "/&{2,}/", "/&$/"), array("", "&", ""), $referer);
  127. $referer.= (strstr($referer, "?") ? "&" : "?") . time();
  128. $referer = str_replace("?&", "?", $referer);
  129. }
  130. $this->redirect($referer);
  131. }
  132. public function jsonRemoveFromCompare() {
  133. $element_id = getRequest("param0");
  134. $this->remove_from_compare($element_id);
  135. list($template) = $this->loadTemplates("emarket/compare/default", "json_remove_from_compare");
  136. $block_arr = array('id' => $element_id);
  137. header("Content-type: text/javascript; charset=utf-8");
  138. $this->flush($template, $block_arr, $element_id);
  139. }
  140. public function resetCompareList() {
  141. $this->reset_compare();
  142. $this->redirect(getServer('HTTP_REFERER'));
  143. }
  144. public function jsonResetCompareList() {
  145. $this->reset_compare();
  146. list($template) = $this->loadTemplates("emarket/compare/default", "json_reset_compare_list");
  147. header("Content-type: text/javascript; charset=utf-8");
  148. $this->flush($template);
  149. }
  150. public function getCompareList($template = "default") {
  151. if(!$template) $tempalte = "default";
  152. list(
  153. $template_block, $template_block_empty, $template_block_line, $template_block_link
  154. ) = $this->loadTemplates("emarket/compare/{$template}",
  155. "compare_list_block", "compare_list_block_empty", "compare_list_block_line", "compare_list_block_link"
  156. );
  157. $block_arr = array();
  158. $elements = $this->getCompareElements();
  159. if(sizeof($elements) == 0) {
  160. $block_arr['void:max_elements'] = $this->iMaxCompareElements ? $this->iMaxCompareElements : "не ограничено";
  161. if ($this->iMaxCompareElements) {
  162. $block_arr['attribute:max-elements'] = $this->iMaxCompareElements;
  163. }
  164. return def_module::parseTemplate($template_block_empty, $block_arr);
  165. }
  166. $items = "";
  167. $hierarchy = umiHierarchy::getInstance();
  168. foreach($elements as $element_id) {
  169. $el = $hierarchy->getElement($element_id);
  170. if ($el instanceof iUmiHierarchyElement) {
  171. $line_arr = array();
  172. $line_arr['attribute:id'] = $element_id;
  173. $line_arr['node:value'] = $el->getName();
  174. $line_arr['attribute:link'] = umiHierarchy::getInstance()->getPathById($element_id);
  175. $line_arr['xlink:href'] = 'upage://' . $element_id;
  176. $items[] = def_module::parseTemplate($template_block_line, $line_arr, $element_id);
  177. }
  178. }
  179. $block_arr['compare_link'] = (sizeof($elements) >= 2) ? $template_block_link : "";
  180. $block_arr['void:max_elements'] = $this->iMaxCompareElements ? $this->iMaxCompareElements : "не ограничено";
  181. if ($this->iMaxCompareElements) {
  182. $block_arr['attribute:max-elements'] = $this->iMaxCompareElements;
  183. }
  184. $block_arr['subnodes:items'] = $items;
  185. return def_module::parseTemplate($template_block, $block_arr);
  186. }
  187. public function reset_compare() {
  188. $_SESSION['compare_list'] = array();
  189. }
  190. public function add_to_compare($element_id) {
  191. if(!isset($_SESSION['compare_list']) || !is_array($_SESSION['compare_list'])) {
  192. $_SESSION['compare_list'] = array();
  193. }
  194. if ($this->iMaxCompareElements && count($_SESSION['compare_list']) >= $this->iMaxCompareElements) {
  195. $this->errorNewMessage("%errors_max_items_compare%");
  196. $this->errorPanic();
  197. }
  198. $oEventPoint = new umiEventPoint("emarket_add_to_compare");
  199. $oEventPoint->setMode("before");
  200. $oEventPoint->setParam("element_id", $element_id);
  201. $oEventPoint->setParam("compare_list", $_SESSION['compare_list']);
  202. $this->setEventPoint($oEventPoint);
  203. if(!in_array($element_id, $_SESSION['compare_list'])) {
  204. $_SESSION['compare_list'][] = $element_id;
  205. $oEventPoint = new umiEventPoint("emarket_add_to_compare");
  206. $oEventPoint->setMode("after");
  207. $oEventPoint->setParam("element_id", $element_id);
  208. $oEventPoint->setParam("compare_list", $_SESSION['compare_list']);
  209. $this->setEventPoint($oEventPoint);
  210. return true;
  211. }
  212. return false;
  213. }
  214. public function remove_from_compare($element_id) {
  215. if(!is_array($_SESSION['compare_list'])) {
  216. $_SESSION['compare_list'] = array();
  217. return;
  218. }
  219. if(in_array($element_id, $_SESSION['compare_list'])) {
  220. unset($_SESSION['compare_list'][array_search($element_id, $_SESSION['compare_list'])]);
  221. }
  222. }
  223. public function getCompareLink($elementId = null, $template = 'default') {
  224. if(!$elementId) return;
  225. if(!$template) $template = "default";
  226. list($tpl_add_link, $tpl_del_link) = def_module::loadTemplates("emarket/compare/{$template}", 'add_link', 'del_link');
  227. $elements = $this->getCompareElements();
  228. $inCompare = in_array($elementId, $elements);
  229. $addLink = $this->pre_lang . '/emarket/addToCompare/' . $elementId . '/';
  230. $delLink = $this->pre_lang . '/emarket/removeFromCompare/' . $elementId . '/';
  231. $block_arr = array(
  232. 'add-link' => $inCompare ? null : $addLink,
  233. 'del-link' => $inCompare ? $delLink : null
  234. );
  235. return def_module::parseTemplate(($inCompare ? $tpl_del_link : $tpl_add_link), $block_arr, $elementId);
  236. }
  237. };
  238. ?>