PageRenderTime 36ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/DDAutoFilterSearchBehavior.php

https://bitbucket.org/jwerner/yii-ddautofilter
PHP | 360 lines | 283 code | 5 blank | 72 comment | 7 complexity | 8fc3c1e289f39368aa925c411756fca5 MD5 | raw file
  1. <?php
  2. /**
  3. * DDAutoFilterSearchBehavior class file
  4. *
  5. * @author Joachim Werner <joachim.werner@diggin-data.de>
  6. */
  7. Yii::import('ext.diggindata.ddautofilter.DDDateHelper');
  8. /**
  9. * This model behavior builds search conditions for the DDAutoFilter widget
  10. *
  11. * @author Joachim Werner <joachim.werner@diggin-data.de>
  12. * @version 0.1
  13. */
  14. class DDAutoFilterSearchBehavior extends CActiveRecordBehavior
  15. {
  16. // {{{ dateSearchCriteria
  17. /*
  18. * Date range search criteria
  19. * public $attribute name of the date attribute
  20. * public $value value of the date attribute
  21. * @return instance of CDbCriteria for the model's search() method
  22. */
  23. public function dateSearchCriteria($attribute, $value, $dateFormat='Y-m-d')
  24. {
  25. // Create a new db criteria instance
  26. $criteria = new CDbCriteria;
  27. // DEBUG var_dump($attribute, $value);
  28. if(is_null($value) or trim($value)=='')
  29. return $criteria;
  30. if(substr($value,0,1)=='[' and substr($value,-1)==']') {
  31. } else {
  32. $value = '[{"operator": "EQUALS", "value": "'.$value.'"}]';
  33. $this->getOwner()->$attribute = $value;
  34. }
  35. $filters = CJSON::decode($value);
  36. // DEBUG var_dump($filters);
  37. foreach($filters as $i=>$filter)
  38. {
  39. $op = '';
  40. $join = isset($filter['join']) ? $filter['join'] : 'AND';
  41. switch(trim($filter['operator']))
  42. {
  43. case 'EQUALS':
  44. case 'NOT-EQUALS':
  45. case 'GT':
  46. case 'GTE':
  47. case 'LT':
  48. case 'LTE':
  49. case 'STARTS-WITH':
  50. case 'ENDS-WITH':
  51. case 'CONTAINS':
  52. case 'NOT-CONTAINS':
  53. if(preg_match('/^(?:\s*(<>|<=|>=|<|>|=))?(.*)$/',$filter['value'], $matches)) {
  54. $filter['value'] = date("Y-m-d", CDateTimeParser::parse( $matches[2], CLocale::getInstance(Yii::app()->language)->getDateFormat('medium') ));
  55. $op = $matches[1];
  56. }
  57. break;
  58. }
  59. switch(trim($filter['operator']))
  60. {
  61. // {{{ Date Ranges
  62. // {{{ Day
  63. // {{{ Yesterday
  64. case '_DAY_LAST_':
  65. $criteria->compare($attribute,date($dateFormat, DDDateHelper::DayYesterday()));
  66. break;
  67. // }}}
  68. // {{{ Today
  69. case '_DAY_THIS_':
  70. $criteria->compare($attribute, date($dateFormat));
  71. break;
  72. // }}}
  73. // {{{ Tomorrow
  74. case '_DAY_NEXT_':
  75. $criteria->compare($attribute, date($dateFormat, DDDateHelper::DayTomorrow()));
  76. break;
  77. // }}}
  78. // }}}
  79. // {{{ Week
  80. // {{{ Last Week
  81. case '_WEEK_LAST_':
  82. $fromTo = DDDateHelper::WeekRelative(null,-1);
  83. $criteria->addCondition(
  84. sprintf(
  85. "t.%s BETWEEN '%s' AND '%s'",
  86. $attribute,
  87. date($dateFormat, $fromTo[0]),
  88. date($dateFormat, $fromTo[1])
  89. )
  90. );
  91. break;
  92. // }}}
  93. // {{{ This Week
  94. case '_WEEK_THIS_':
  95. $fromTo = DDDateHelper::WeekThis();
  96. $criteria->addCondition(
  97. sprintf(
  98. "t.%s BETWEEN '%s' AND '%s'",
  99. $attribute,
  100. date($dateFormat, $fromTo[0]),
  101. date($dateFormat, $fromTo[1])
  102. )
  103. );
  104. break;
  105. // }}}
  106. // {{{ Next Week
  107. case '_WEEK_NEXT_':
  108. $fromTo = DDDateHelper::WeekRelative(null,1);
  109. $criteria->addCondition(
  110. sprintf(
  111. "t.%s BETWEEN '%s' AND '%s'",
  112. $attribute,
  113. date($dateFormat, $fromTo[0]),
  114. date($dateFormat, $fromTo[1])
  115. )
  116. );
  117. break;
  118. // }}}
  119. // }}}
  120. // {{{ Month
  121. // {{{ Last Month
  122. case '_MONTH_LAST_':
  123. $fromTo = DDDateHelper::MonthRelative(null,-1);
  124. $criteria->addCondition(
  125. sprintf(
  126. "t.%s BETWEEN '%s' AND '%s'",
  127. $attribute,
  128. date($dateFormat, $fromTo[0]),
  129. date($dateFormat, $fromTo[1])
  130. )
  131. );
  132. break;
  133. // }}}
  134. // {{{ This Month
  135. case '_MONTH_THIS_':
  136. $fromTo = DDDateHelper::MonthThis();
  137. $criteria->addCondition(
  138. sprintf(
  139. "t.%s BETWEEN '%s' AND '%s'",
  140. $attribute,
  141. date($dateFormat, $fromTo[0]),
  142. date($dateFormat, $fromTo[1])
  143. )
  144. );
  145. break;
  146. // }}}
  147. // {{{ Next Month
  148. case '_MONTH_NEXT_':
  149. $fromTo = DDDateHelper::MonthRelative(null,1);
  150. $criteria->addCondition(
  151. sprintf(
  152. "t.%s BETWEEN '%s' AND '%s'",
  153. $attribute,
  154. date($dateFormat, $fromTo[0]),
  155. date($dateFormat, $fromTo[1])
  156. )
  157. );
  158. break;
  159. // }}}
  160. // }}}
  161. // {{{ Quarter
  162. // {{{ Last Quarter
  163. case '_QUARTER_LAST_':
  164. $fromTo = DDDateHelper::QuarterRelative(null,-1);
  165. $criteria->addCondition(
  166. sprintf(
  167. "t.%s BETWEEN '%s' AND '%s'",
  168. $attribute,
  169. date($dateFormat, $fromTo[0]),
  170. date($dateFormat, $fromTo[1])
  171. )
  172. );
  173. break;
  174. // }}}
  175. // {{{ This Quarter
  176. case '_QUARTER_THIS_':
  177. $fromTo = DDDateHelper::QuarterThis();
  178. $criteria->addCondition(
  179. sprintf(
  180. "t.%s BETWEEN '%s' AND '%s'",
  181. $attribute,
  182. date($dateFormat, $fromTo[0]),
  183. date($dateFormat, $fromTo[1])
  184. )
  185. );
  186. break;
  187. // }}}
  188. // {{{ Next Quarter
  189. case '_QUARTER_NEXT_':
  190. $fromTo = DDDateHelper::QuarterRelative(null,1);
  191. $criteria->addCondition(
  192. sprintf(
  193. "t.%s BETWEEN '%s' AND '%s'",
  194. $attribute,
  195. date($dateFormat, $fromTo[0]),
  196. date($dateFormat, $fromTo[1])
  197. )
  198. );
  199. break;
  200. // }}}
  201. // }}}
  202. // {{{ Year
  203. // {{{ Last Year
  204. case '_YEAR_LAST_':
  205. $fromTo = DDDateHelper::YearRelative(null,-1);
  206. $criteria->addCondition(
  207. sprintf(
  208. "t.%s BETWEEN '%s' AND '%s'",
  209. $attribute,
  210. date($dateFormat, $fromTo[0]),
  211. date($dateFormat, $fromTo[1])
  212. )
  213. );
  214. break;
  215. // }}}
  216. // {{{ This Year
  217. case '_YEAR_THIS_':
  218. $fromTo = DDDateHelper::YearThis();
  219. $criteria->addCondition(
  220. sprintf(
  221. "t.%s BETWEEN '%s' AND '%s'",
  222. $attribute,
  223. date($dateFormat, $fromTo[0]),
  224. date($dateFormat, $fromTo[1])
  225. )
  226. );
  227. break;
  228. // }}}
  229. // {{{ Next Year
  230. case '_YEAR_NEXT_':
  231. $fromTo = DDDateHelper::YearRelative(null,1);
  232. $criteria->addCondition(
  233. sprintf(
  234. "t.%s BETWEEN '%s' AND '%s'",
  235. $attribute,
  236. date($dateFormat, $fromTo[0]),
  237. date($dateFormat, $fromTo[1])
  238. )
  239. );
  240. break;
  241. // }}}
  242. // {{{ Year Todate
  243. case '_YEAR_TODATE_':
  244. $fromTo = DDDateHelper::YearToDate(null,1);
  245. $criteria->addCondition(
  246. sprintf(
  247. "t.%s BETWEEN '%s' AND '%s'",
  248. $attribute,
  249. date($dateFormat, $fromTo[0]),
  250. date($dateFormat, $fromTo[1])
  251. )
  252. );
  253. break;
  254. // }}} // }}}
  255. // }}}
  256. case 'EQUALS':
  257. $criteria->compare($attribute, $op.$value, false, $join );
  258. //$this->owner->$attribute = $value;
  259. break;
  260. case 'NOT-EQUALS':
  261. $criteria->addCondition("$attribute<>'{$filter['value']}'", $join);
  262. break;
  263. case 'GT':
  264. $criteria->addCondition("$attribute>'{$filter['value']}'", $join);
  265. break;
  266. case 'GTE':
  267. $criteria->addCondition("$attribute>='{$filter['value']}'", $join);
  268. break;
  269. case 'LT':
  270. $criteria->addCondition("$attribute<'{$filter['value']}'", $join);
  271. break;
  272. case 'LTE':
  273. $criteria->addCondition("$attribute<='{$filter['value']}'", $join);
  274. break;
  275. case 'STARTS-WITH':
  276. $criteria->addCondition("$attribute LIKE '{$filter['value']}%'", $join);
  277. break;
  278. case 'ENDS-WITH':
  279. $criteria->addCondition("$attribute LIKE '%{$filter['value']}'", $join);
  280. break;
  281. case 'CONTAINS':
  282. $criteria->addCondition("$attribute LIKE '%{$filter['value']}%'", $join);
  283. break;
  284. case 'NOT-CONTAINS':
  285. $criteria->addCondition("$attribute NOT LIKE '%{$filter['value']}%'", $join);
  286. break;
  287. }
  288. }
  289. // Return the search criteria to merge with the model's search() method
  290. return $criteria;
  291. } // }}}
  292. // {{{ textSearchCriteria
  293. public function textSearchCriteria($attribute, $value)
  294. {
  295. // Create a new db criteria instance
  296. $criteria = new CDbCriteria;
  297. // DEBUG var_dump($attribute, $value);
  298. if(is_null($value) or trim($value)=='')
  299. return $criteria;
  300. if(substr($value,0,1)=='[' and substr($value,-1)==']') {
  301. } else {
  302. $value = '[{"operator": "EQUALS", "value": "'.$value.'"}]';
  303. $this->getOwner()->$attribute = $value;
  304. }
  305. $filters = CJSON::decode($value);
  306. // DEBUG var_dump($filters);
  307. foreach($filters as $i=>$filter)
  308. {
  309. $join = isset($filter['join']) ? $filter['join'] : 'AND';
  310. // DEBUG var_dump($filter, $filter['value']);
  311. switch($filter['operator'])
  312. {
  313. case 'EQUALS':
  314. $criteria->compare($attribute, $filter['value'], false, $join );
  315. break;
  316. case 'NOT-EQUALS':
  317. $criteria->addCondition("$attribute<>'{$filter['value']}'", $join);
  318. break;
  319. case 'GT':
  320. $criteria->addCondition("$attribute>'{$filter['value']}'", $join);
  321. break;
  322. case 'GTE':
  323. $criteria->addCondition("$attribute>='{$filter['value']}'", $join);
  324. break;
  325. case 'LT':
  326. $criteria->addCondition("$attribute<'{$filter['value']}'", $join);
  327. break;
  328. case 'LTE':
  329. $criteria->addCondition("$attribute<='{$filter['value']}'", $join);
  330. break;
  331. case 'STARTS-WITH':
  332. $criteria->addCondition("$attribute LIKE '{$filter['value']}%'", $join);
  333. break;
  334. case 'ENDS-WITH':
  335. $criteria->addCondition("$attribute LIKE '%{$filter['value']}'", $join);
  336. break;
  337. case 'CONTAINS':
  338. $criteria->addCondition("$attribute LIKE '%{$filter['value']}%'", $join);
  339. break;
  340. case 'NOT-CONTAINS':
  341. $criteria->addCondition("$attribute NOT LIKE '%{$filter['value']}%'", $join);
  342. break;
  343. case 'BETWEEN':
  344. list($valueStart, $valueEnd) = preg_split('/[\s]+AND|OR[\s]+/', $filter['value'], -1, PREG_SPLIT_NO_EMPTY);
  345. $criteria->addBetweenCondition($attribute, $valueStart, $valueEnd, $join);
  346. break;
  347. case 'IN':
  348. $criteria->addInCondition($attribute, $filter['value'], $join);
  349. break;
  350. }
  351. }
  352. // DEBUG var_dump($criteria);
  353. return $criteria;
  354. } // }}}
  355. }