SmartBlockCriteria.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. <?php
  2. class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm
  3. {
  4. private $criteriaOptions;
  5. private $stringCriteriaOptions;
  6. private $numericCriteriaOptions;
  7. private $sortOptions;
  8. private $limitOptions;
  9. /* We need to know if the criteria value will be a string
  10. * or numeric value in order to populate the modifier
  11. * select list
  12. */
  13. private $criteriaTypes = array(
  14. 0 => "",
  15. "album_title" => "s",
  16. "bit_rate" => "n",
  17. "bpm" => "n",
  18. "composer" => "s",
  19. "conductor" => "s",
  20. "copyright" => "s",
  21. "cuein" => "n",
  22. "cueout" => "n",
  23. "artist_name" => "s",
  24. "encoded_by" => "s",
  25. "utime" => "n",
  26. "mtime" => "n",
  27. "lptime" => "n",
  28. "genre" => "s",
  29. "isrc_number" => "s",
  30. "label" => "s",
  31. "language" => "s",
  32. "length" => "n",
  33. "mime" => "s",
  34. "mood" => "s",
  35. "owner_id" => "s",
  36. "replay_gain" => "n",
  37. "sample_rate" => "n",
  38. "track_title" => "s",
  39. "track_number" => "n",
  40. "info_url" => "s",
  41. "year" => "n"
  42. );
  43. private function getCriteriaOptions($option = null)
  44. {
  45. if (!isset($this->criteriaOptions)) {
  46. $this->criteriaOptions = array(
  47. 0 => _("Select criteria"),
  48. "album_title" => _("Album"),
  49. "bit_rate" => _("Bit Rate (Kbps)"),
  50. "bpm" => _("BPM"),
  51. "composer" => _("Composer"),
  52. "conductor" => _("Conductor"),
  53. "copyright" => _("Copyright"),
  54. "cuein" => _("Cue In"),
  55. "cueout" => _("Cue Out"),
  56. "artist_name" => _("Creator"),
  57. "encoded_by" => _("Encoded By"),
  58. "genre" => _("Genre"),
  59. "isrc_number" => _("ISRC"),
  60. "label" => _("Label"),
  61. "language" => _("Language"),
  62. "mtime" => _("Last Modified"),
  63. "lptime" => _("Last Played"),
  64. "length" => _("Length"),
  65. "mime" => _("Mime"),
  66. "mood" => _("Mood"),
  67. "owner_id" => _("Owner"),
  68. "replay_gain" => _("Replay Gain"),
  69. "sample_rate" => _("Sample Rate (kHz)"),
  70. "track_title" => _("Title"),
  71. "track_number" => _("Track Number"),
  72. "utime" => _("Uploaded"),
  73. "info_url" => _("Website"),
  74. "year" => _("Year")
  75. );
  76. }
  77. if (is_null($option)) return $this->criteriaOptions;
  78. else return $this->criteriaOptions[$option];
  79. }
  80. private function getStringCriteriaOptions()
  81. {
  82. if (!isset($this->stringCriteriaOptions)) {
  83. $this->stringCriteriaOptions = array(
  84. "0" => _("Select modifier"),
  85. "contains" => _("contains"),
  86. "does not contain" => _("does not contain"),
  87. "is" => _("is"),
  88. "is not" => _("is not"),
  89. "starts with" => _("starts with"),
  90. "ends with" => _("ends with")
  91. );
  92. }
  93. return $this->stringCriteriaOptions;
  94. }
  95. private function getNumericCriteriaOptions()
  96. {
  97. if (!isset($this->numericCriteriaOptions)) {
  98. $this->numericCriteriaOptions = array(
  99. "0" => _("Select modifier"),
  100. "is" => _("is"),
  101. "is not" => _("is not"),
  102. "is greater than" => _("is greater than"),
  103. "is less than" => _("is less than"),
  104. "is in the range" => _("is in the range")
  105. );
  106. }
  107. return $this->numericCriteriaOptions;
  108. }
  109. private function getLimitOptions()
  110. {
  111. if (!isset($this->limitOptions)) {
  112. $this->limitOptions = array(
  113. "hours" => _("hours"),
  114. "minutes" => _("minutes"),
  115. "items" => _("items")
  116. );
  117. }
  118. return $this->limitOptions;
  119. }
  120. private function getSortOptions()
  121. {
  122. if (!isset($this->sortOptions)) {
  123. $this->sortOptions = array(
  124. "random" => _("random"),
  125. "newest" => _("newest"),
  126. "oldest" => _("oldest")
  127. );
  128. }
  129. return $this->sortOptions;
  130. }
  131. public function init()
  132. {
  133. }
  134. /*
  135. * converts UTC timestamp citeria into user timezone strings.
  136. */
  137. private function convertTimestamps(&$criteria)
  138. {
  139. $columns = array("utime", "mtime", "lptime");
  140. foreach ($columns as $column) {
  141. if (isset($criteria[$column])) {
  142. foreach ($criteria[$column] as &$constraint) {
  143. $constraint['value'] =
  144. Application_Common_DateHelper::UTCStringToUserTimezoneString($constraint['value']);
  145. if (isset($constraint['extra'])) {
  146. $constraint['extra'] =
  147. Application_Common_DateHelper::UTCStringToUserTimezoneString($constraint['extra']);
  148. }
  149. }
  150. }
  151. }
  152. }
  153. public function startForm($p_blockId, $p_isValid = false)
  154. {
  155. // load type
  156. $out = CcBlockQuery::create()->findPk($p_blockId);
  157. if ($out->getDbType() == "static") {
  158. $blockType = 0;
  159. } else {
  160. $blockType = 1;
  161. }
  162. $spType = new Zend_Form_Element_Radio('sp_type');
  163. $spType->setLabel(_('Set smart block type:'))
  164. ->setDecorators(array('viewHelper'))
  165. ->setMultiOptions(array(
  166. 'static' => _('Static'),
  167. 'dynamic' => _('Dynamic')
  168. ))
  169. ->setValue($blockType);
  170. $this->addElement($spType);
  171. $bl = new Application_Model_Block($p_blockId);
  172. $storedCrit = $bl->getCriteria();
  173. //need to convert criteria to be displayed in the user's timezone if there's some timestamp type.
  174. self::convertTimestamps($storedCrit["crit"]);
  175. /* $modRoadMap stores the number of same criteria
  176. * Ex: 3 Album titles, and 2 Track titles
  177. * We need to know this so we display the form elements properly
  178. */
  179. $modRowMap = array();
  180. $openSmartBlockOption = false;
  181. if (!empty($storedCrit)) {
  182. $openSmartBlockOption = true;
  183. }
  184. $criteriaKeys = array();
  185. if (isset($storedCrit["crit"])) {
  186. $criteriaKeys = array_keys($storedCrit["crit"]);
  187. }
  188. $numElements = count($this->getCriteriaOptions());
  189. for ($i = 0; $i < $numElements; $i++) {
  190. $criteriaType = "";
  191. if (isset($criteriaKeys[$i])) {
  192. $critCount = count($storedCrit["crit"][$criteriaKeys[$i]]);
  193. } else {
  194. $critCount = 1;
  195. }
  196. $modRowMap[$i] = $critCount;
  197. /* Loop through all criteria with the same field
  198. * Ex: all criteria for 'Album'
  199. */
  200. for ($j = 0; $j < $critCount; $j++) {
  201. /****************** CRITERIA ***********/
  202. if ($j > 0) {
  203. $invisible = ' sp-invisible';
  204. } else {
  205. $invisible = '';
  206. }
  207. $criteria = new Zend_Form_Element_Select("sp_criteria_field_".$i."_".$j);
  208. $criteria->setAttrib('class', 'input_select sp_input_select'.$invisible)
  209. ->setValue('Select criteria')
  210. ->setDecorators(array('viewHelper'))
  211. ->setMultiOptions($this->getCriteriaOptions());
  212. if ($i != 0 && !isset($criteriaKeys[$i])) {
  213. $criteria->setAttrib('disabled', 'disabled');
  214. }
  215. if (isset($criteriaKeys[$i])) {
  216. $criteriaType = $this->criteriaTypes[$storedCrit["crit"][$criteriaKeys[$i]][$j]["criteria"]];
  217. $criteria->setValue($storedCrit["crit"][$criteriaKeys[$i]][$j]["criteria"]);
  218. }
  219. $this->addElement($criteria);
  220. /****************** MODIFIER ***********/
  221. $criteriaModifers = new Zend_Form_Element_Select("sp_criteria_modifier_".$i."_".$j);
  222. $criteriaModifers->setValue('Select modifier')
  223. ->setAttrib('class', 'input_select sp_input_select')
  224. ->setDecorators(array('viewHelper'));
  225. if ($i != 0 && !isset($criteriaKeys[$i])) {
  226. $criteriaModifers->setAttrib('disabled', 'disabled');
  227. }
  228. if (isset($criteriaKeys[$i])) {
  229. if ($criteriaType == "s") {
  230. $criteriaModifers->setMultiOptions($this->getStringCriteriaOptions());
  231. } else {
  232. $criteriaModifers->setMultiOptions($this->getNumericCriteriaOptions());
  233. }
  234. $criteriaModifers->setValue($storedCrit["crit"][$criteriaKeys[$i]][$j]["modifier"]);
  235. } else {
  236. $criteriaModifers->setMultiOptions(array('0' => _('Select modifier')));
  237. }
  238. $this->addElement($criteriaModifers);
  239. /****************** VALUE ***********/
  240. $criteriaValue = new Zend_Form_Element_Text("sp_criteria_value_".$i."_".$j);
  241. $criteriaValue->setAttrib('class', 'input_text sp_input_text')
  242. ->setDecorators(array('viewHelper'));
  243. if ($i != 0 && !isset($criteriaKeys[$i])) {
  244. $criteriaValue->setAttrib('disabled', 'disabled');
  245. }
  246. if (isset($criteriaKeys[$i])) {
  247. $criteriaValue->setValue($storedCrit["crit"][$criteriaKeys[$i]][$j]["value"]);
  248. }
  249. $this->addElement($criteriaValue);
  250. /****************** EXTRA ***********/
  251. $criteriaExtra = new Zend_Form_Element_Text("sp_criteria_extra_".$i."_".$j);
  252. $criteriaExtra->setAttrib('class', 'input_text sp_extra_input_text')
  253. ->setDecorators(array('viewHelper'));
  254. if (isset($criteriaKeys[$i]) && isset($storedCrit["crit"][$criteriaKeys[$i]][$j]["extra"])) {
  255. $criteriaExtra->setValue($storedCrit["crit"][$criteriaKeys[$i]][$j]["extra"]);
  256. $criteriaValue->setAttrib('class', 'input_text sp_extra_input_text');
  257. } else {
  258. $criteriaExtra->setAttrib('disabled', 'disabled');
  259. }
  260. $this->addElement($criteriaExtra);
  261. }//for
  262. }//for
  263. $repeatTracks = new Zend_Form_Element_Checkbox('sp_repeat_tracks');
  264. $repeatTracks->setDecorators(array('viewHelper'))
  265. ->setLabel(_('Allow Repeat Tracks:'));
  266. if (isset($storedCrit["repeat_tracks"])) {
  267. $repeatTracks->setChecked($storedCrit["repeat_tracks"]["value"] == 1?true:false);
  268. }
  269. $this->addElement($repeatTracks);
  270. $sort = new Zend_Form_Element_Select('sp_sort_options');
  271. $sort->setAttrib('class', 'sp_input_select')
  272. ->setDecorators(array('viewHelper'))
  273. ->setMultiOptions($this->getSortOptions());
  274. if (isset($storedCrit["sort"])) {
  275. $sort->setValue($storedCrit["sort"]["value"]);
  276. }
  277. $this->addElement($sort);
  278. $limit = new Zend_Form_Element_Select('sp_limit_options');
  279. $limit->setAttrib('class', 'sp_input_select')
  280. ->setDecorators(array('viewHelper'))
  281. ->setMultiOptions($this->getLimitOptions());
  282. if (isset($storedCrit["limit"])) {
  283. $limit->setValue($storedCrit["limit"]["modifier"]);
  284. }
  285. $this->addElement($limit);
  286. $limitValue = new Zend_Form_Element_Text('sp_limit_value');
  287. $limitValue->setAttrib('class', 'sp_input_text_limit')
  288. ->setLabel(_('Limit to'))
  289. ->setDecorators(array('viewHelper'));
  290. $this->addElement($limitValue);
  291. if (isset($storedCrit["limit"])) {
  292. $limitValue->setValue($storedCrit["limit"]["value"]);
  293. } else {
  294. // setting default to 1 hour
  295. $limitValue->setValue(1);
  296. }
  297. //getting block content candidate count that meets criteria
  298. $bl = new Application_Model_Block($p_blockId);
  299. if ($p_isValid) {
  300. $files = $bl->getListofFilesMeetCriteria();
  301. $showPoolCount = true;
  302. } else {
  303. $files = null;
  304. $showPoolCount = false;
  305. }
  306. $generate = new Zend_Form_Element_Button('generate_button');
  307. $generate->setAttrib('class', 'btn btn-small');
  308. $generate->setAttrib('title', _('Generate playlist content and save criteria'));
  309. $generate->setIgnore(true);
  310. $generate->setLabel(_('Generate'));
  311. $generate->setDecorators(array('viewHelper'));
  312. $this->addElement($generate);
  313. $shuffle = new Zend_Form_Element_Button('shuffle_button');
  314. $shuffle->setAttrib('class', 'btn btn-small');
  315. $shuffle->setAttrib('title', _('Shuffle playlist content'));
  316. $shuffle->setIgnore(true);
  317. $shuffle->setLabel(_('Shuffle'));
  318. $shuffle->setDecorators(array('viewHelper'));
  319. $this->addElement($shuffle);
  320. $this->setDecorators(array(
  321. array('ViewScript', array('viewScript' => 'form/smart-block-criteria.phtml', "openOption"=> $openSmartBlockOption,
  322. 'criteriasLength' => count($this->getCriteriaOptions()), 'poolCount' => $files['count'], 'modRowMap' => $modRowMap,
  323. 'showPoolCount' => $showPoolCount))
  324. ));
  325. }
  326. public function preValidation($params)
  327. {
  328. $data = Application_Model_Block::organizeSmartPlaylistCriteria($params['data']);
  329. // add elelments that needs to be added
  330. // set multioption for modifier according to criteria_field
  331. $modRowMap = array();
  332. foreach ($data['criteria'] as $critKey=>$d) {
  333. $count = 1;
  334. foreach ($d as $modKey=>$modInfo) {
  335. if ($modKey == 0) {
  336. $eleCrit = $this->getElement("sp_criteria_field_".$critKey."_".$modKey);
  337. $eleCrit->setValue($this->getCriteriaOptions($modInfo['sp_criteria_field']));
  338. $eleCrit->setAttrib("disabled", null);
  339. $eleMod = $this->getElement("sp_criteria_modifier_".$critKey."_".$modKey);
  340. $criteriaType = $this->criteriaTypes[$modInfo['sp_criteria_field']];
  341. if ($criteriaType == "s") {
  342. $eleMod->setMultiOptions($this->getStringCriteriaOptions());
  343. } elseif ($criteriaType == "n") {
  344. $eleMod->setMultiOptions($this->getNumericCriteriaOptions());
  345. } else {
  346. $eleMod->setMultiOptions(array('0' => _('Select modifier')));
  347. }
  348. $eleMod->setValue($modInfo['sp_criteria_modifier']);
  349. $eleMod->setAttrib("disabled", null);
  350. $eleValue = $this->getElement("sp_criteria_value_".$critKey."_".$modKey);
  351. $eleValue->setValue($modInfo['sp_criteria_value']);
  352. $eleValue->setAttrib("disabled", null);
  353. if (isset($modInfo['sp_criteria_extra'])) {
  354. $eleExtra = $this->getElement("sp_criteria_extra_".$critKey."_".$modKey);
  355. $eleExtra->setValue($modInfo['sp_criteria_extra']);
  356. $eleValue->setAttrib('class', 'input_text sp_extra_input_text');
  357. $eleExtra->setAttrib("disabled", null);
  358. }
  359. } else {
  360. $criteria = new Zend_Form_Element_Select("sp_criteria_field_".$critKey."_".$modKey);
  361. $criteria->setAttrib('class', 'input_select sp_input_select sp-invisible')
  362. ->setValue('Select criteria')
  363. ->setDecorators(array('viewHelper'))
  364. ->setMultiOptions($this->getCriteriaOptions());
  365. $criteriaType = $this->criteriaTypes[$modInfo['sp_criteria_field']];
  366. $criteria->setValue($this->getCriteriaOptions($modInfo['sp_criteria_field']));
  367. $this->addElement($criteria);
  368. /****************** MODIFIER ***********/
  369. $criteriaModifers = new Zend_Form_Element_Select("sp_criteria_modifier_".$critKey."_".$modKey);
  370. $criteriaModifers->setValue('Select modifier')
  371. ->setAttrib('class', 'input_select sp_input_select')
  372. ->setDecorators(array('viewHelper'));
  373. if ($criteriaType == "s") {
  374. $criteriaModifers->setMultiOptions($this->getStringCriteriaOptions());
  375. } elseif ($criteriaType == "n") {
  376. $criteriaModifers->setMultiOptions($this->getNumericCriteriaOptions());
  377. } else {
  378. $criteriaModifers->setMultiOptions(array('0' => _('Select modifier')));
  379. }
  380. $criteriaModifers->setValue($modInfo['sp_criteria_modifier']);
  381. $this->addElement($criteriaModifers);
  382. /****************** VALUE ***********/
  383. $criteriaValue = new Zend_Form_Element_Text("sp_criteria_value_".$critKey."_".$modKey);
  384. $criteriaValue->setAttrib('class', 'input_text sp_input_text')
  385. ->setDecorators(array('viewHelper'));
  386. $criteriaValue->setValue($modInfo['sp_criteria_value']);
  387. $this->addElement($criteriaValue);
  388. /****************** EXTRA ***********/
  389. $criteriaExtra = new Zend_Form_Element_Text("sp_criteria_extra_".$critKey."_".$modKey);
  390. $criteriaExtra->setAttrib('class', 'input_text sp_extra_input_text')
  391. ->setDecorators(array('viewHelper'));
  392. if (isset($modInfo['sp_criteria_extra'])) {
  393. $criteriaExtra->setValue($modInfo['sp_criteria_extra']);
  394. $criteriaValue->setAttrib('class', 'input_text sp_extra_input_text');
  395. } else {
  396. $criteriaExtra->setAttrib('disabled', 'disabled');
  397. }
  398. $this->addElement($criteriaExtra);
  399. $count++;
  400. }
  401. }
  402. $modRowMap[$critKey] = $count;
  403. }
  404. $decorator = $this->getDecorator("ViewScript");
  405. $existingModRow = $decorator->getOption("modRowMap");
  406. foreach ($modRowMap as $key=>$v) {
  407. $existingModRow[$key] = $v;
  408. }
  409. $decorator->setOption("modRowMap", $existingModRow);
  410. // reconstruct the params['criteria'] so we can populate the form
  411. $formData = array();
  412. foreach ($params['data'] as $ele) {
  413. $formData[$ele['name']] = $ele['value'];
  414. }
  415. $this->populate($formData);
  416. return $data;
  417. }
  418. public function isValid($params)
  419. {
  420. $isValid = true;
  421. $data = $this->preValidation($params);
  422. $criteria2PeerMap = array(
  423. 0 => "Select criteria",
  424. "album_title" => "DbAlbumTitle",
  425. "artist_name" => "DbArtistName",
  426. "bit_rate" => "DbBitRate",
  427. "bpm" => "DbBpm",
  428. "composer" => "DbComposer",
  429. "conductor" => "DbConductor",
  430. "copyright" => "DbCopyright",
  431. "cuein" => "DbCuein",
  432. "cueout" => "DbCueout",
  433. "encoded_by" => "DbEncodedBy",
  434. "utime" => "DbUtime",
  435. "mtime" => "DbMtime",
  436. "lptime" => "DbLPtime",
  437. "genre" => "DbGenre",
  438. "info_url" => "DbInfoUrl",
  439. "isrc_number" => "DbIsrcNumber",
  440. "label" => "DbLabel",
  441. "language" => "DbLanguage",
  442. "length" => "DbLength",
  443. "mime" => "DbMime",
  444. "mood" => "DbMood",
  445. "owner_id" => "DbOwnerId",
  446. "replay_gain" => "DbReplayGain",
  447. "sample_rate" => "DbSampleRate",
  448. "track_title" => "DbTrackTitle",
  449. "track_number" => "DbTrackNumber",
  450. "year" => "DbYear"
  451. );
  452. // things we need to check
  453. // 1. limit value shouldn't be empty and has upperbound of 24 hrs
  454. // 2. sp_criteria or sp_criteria_modifier shouldn't be 0
  455. // 3. validate formate according to DB column type
  456. $multiplier = 1;
  457. $result = 0;
  458. // validation start
  459. if ($data['etc']['sp_limit_options'] == 'hours') {
  460. $multiplier = 60;
  461. }
  462. if ($data['etc']['sp_limit_options'] == 'hours' || $data['etc']['sp_limit_options'] == 'mins') {
  463. $element = $this->getElement("sp_limit_value");
  464. if ($data['etc']['sp_limit_value'] == "" || floatval($data['etc']['sp_limit_value']) <= 0) {
  465. $element->addError(_("Limit cannot be empty or smaller than 0"));
  466. $isValid = false;
  467. } else {
  468. $mins = floatval($data['etc']['sp_limit_value']) * $multiplier;
  469. if ($mins > 1440) {
  470. $element->addError(_("Limit cannot be more than 24 hrs"));
  471. $isValid = false;
  472. }
  473. }
  474. } else {
  475. $element = $this->getElement("sp_limit_value");
  476. if ($data['etc']['sp_limit_value'] == "" || floatval($data['etc']['sp_limit_value']) <= 0) {
  477. $element->addError(_("Limit cannot be empty or smaller than 0"));
  478. $isValid = false;
  479. } elseif (!ctype_digit($data['etc']['sp_limit_value'])) {
  480. $element->addError(_("The value should be an integer"));
  481. $isValid = false;
  482. } elseif (intval($data['etc']['sp_limit_value']) > 500) {
  483. $element->addError(_("500 is the max item limit value you can set"));
  484. $isValid = false;
  485. }
  486. }
  487. if (isset($data['criteria'])) {
  488. foreach ($data['criteria'] as $rowKey=>$row) {
  489. foreach ($row as $key=>$d) {
  490. $element = $this->getElement("sp_criteria_field_".$rowKey."_".$key);
  491. // check for not selected select box
  492. if ($d['sp_criteria_field'] == "0" || $d['sp_criteria_modifier'] == "0") {
  493. $element->addError(_("You must select Criteria and Modifier"));
  494. $isValid = false;
  495. } else {
  496. $column = CcFilesPeer::getTableMap()->getColumnByPhpName($criteria2PeerMap[$d['sp_criteria_field']]);
  497. // validation on type of column
  498. if (in_array($d['sp_criteria_field'], array('length', 'cuein', 'cueout'))) {
  499. if (!preg_match("/^(\d{2}):(\d{2}):(\d{2})/", $d['sp_criteria_value'])) {
  500. $element->addError(_("'Length' should be in '00:00:00' format"));
  501. $isValid = false;
  502. }
  503. } elseif ($column->getType() == PropelColumnTypes::TIMESTAMP) {
  504. if (!preg_match("/(\d{4})-(\d{2})-(\d{2})/", $d['sp_criteria_value'])) {
  505. $element->addError(_("The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)"));
  506. $isValid = false;
  507. } else {
  508. $result = Application_Common_DateHelper::checkDateTimeRangeForSQL($d['sp_criteria_value']);
  509. if (!$result["success"]) {
  510. // check for if it is in valid range( 1753-01-01 ~ 12/31/9999 )
  511. $element->addError($result["errMsg"]);
  512. $isValid = false;
  513. }
  514. }
  515. if (isset($d['sp_criteria_extra'])) {
  516. if (!preg_match("/(\d{4})-(\d{2})-(\d{2})/", $d['sp_criteria_extra'])) {
  517. $element->addError(_("The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)"));
  518. $isValid = false;
  519. } else {
  520. $result = Application_Common_DateHelper::checkDateTimeRangeForSQL($d['sp_criteria_extra']);
  521. if (!$result["success"]) {
  522. // check for if it is in valid range( 1753-01-01 ~ 12/31/9999 )
  523. $element->addError($result["errMsg"]);
  524. $isValid = false;
  525. }
  526. }
  527. }
  528. } elseif ($column->getType() == PropelColumnTypes::INTEGER &&
  529. $d['sp_criteria_field'] != 'owner_id') {
  530. if (!is_numeric($d['sp_criteria_value'])) {
  531. $element->addError(_("The value has to be numeric"));
  532. $isValid = false;
  533. }
  534. // length check
  535. if ($d['sp_criteria_value'] >= pow(2,31)) {
  536. $element->addError(_("The value should be less then 2147483648"));
  537. $isValid = false;
  538. }
  539. } elseif ($column->getType() == PropelColumnTypes::VARCHAR) {
  540. if (strlen($d['sp_criteria_value']) > $column->getSize()) {
  541. $element->addError(sprintf(_("The value should be less than %s characters"), $column->getSize()));
  542. $isValid = false;
  543. }
  544. }
  545. }
  546. if ($d['sp_criteria_value'] == "") {
  547. $element->addError(_("Value cannot be empty"));
  548. $isValid = false;
  549. }
  550. }//end foreach
  551. }//for loop
  552. }//if
  553. return $isValid;
  554. }
  555. }