PageRenderTime 40ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/FORM.php

https://bitbucket.org/vodolaz095/trivia_core
PHP | 373 lines | 341 code | 29 blank | 3 comment | 37 complexity | 7195f69f94c343e39b8b1ee0615b0469 MD5 | raw file
  1. <?php
  2. class FORM
  3. {
  4. private $fields=array();
  5. private $clean=array();
  6. private $submited;
  7. private $csrf='csrf';
  8. private $hasErrors=false;
  9. public function __construct($csrf=null)
  10. {
  11. if($csrf) $this->csrf=md5('trolo'.$csrf);
  12. }
  13. public function addLabel($name,$caption=null,$value=null)
  14. {
  15. $this->fields[$name]=array(
  16. 'type'=>'label',
  17. 'caption'=>isset($caption) ? $caption : $name,
  18. 'value'=>$value
  19. );
  20. return true;
  21. }
  22. public function addText($name,$caption=null,$value=null,$regex='~^.*$~',$error_message="Ошибка! Не правильный формат!")
  23. {
  24. $this->fields[$name]=array(
  25. 'type'=>'text',
  26. 'caption'=>isset($caption) ? $caption : $name,
  27. 'value'=>$value,
  28. 'regex'=>$regex,
  29. 'error_message'=>$error_message
  30. );
  31. return true;
  32. }
  33. public function addPassword($name,$caption=null,$value=null,$regex='~^.*$~',$error_message="Ошибка! Не правильный формат!")
  34. {
  35. $this->fields[$name]=array(
  36. 'type'=>'password',
  37. 'caption'=>isset($caption) ? $caption : $name,
  38. 'value'=>$value,
  39. 'regex'=>$regex,
  40. 'error_message'=>$error_message
  41. );
  42. return true;
  43. }
  44. public function addTextArea($name,$caption=null,$value=null,$escape=true,$rows=5,$cols=60)
  45. {
  46. $this->fields[$name]=array(
  47. 'type'=>'textarea',
  48. 'caption'=>isset($caption) ? $caption : $name,
  49. 'value'=>$value,
  50. 'escape'=>$escape ? true : false,
  51. 'rows'=>intval($rows),
  52. 'cols'=>intval($cols)
  53. );
  54. return true;
  55. }
  56. public function addCheckBox($name,$caption=null,$value=null,$check=false)
  57. {
  58. $this->fields[$name]=array(
  59. 'type'=>'checkbox',
  60. 'caption'=>isset($caption) ? $caption : $name,
  61. 'value'=>$value ? $value : '1',
  62. 'check'=>$check ? true : false
  63. );
  64. return true;
  65. }
  66. public function addDropdown($name,$caption=null,$values=null,$selected=null)
  67. {
  68. $this->fields[$name]=array(
  69. 'type'=>'dropdown',
  70. 'caption'=>isset($caption) ? $caption : $name,
  71. 'value'=>is_array($values) ? $values : array($values=>$values),
  72. 'selected'=>$selected
  73. );
  74. return true;
  75. }
  76. public function addHidden($name,$value=1)
  77. {
  78. $this->fields[$name]=array(
  79. 'type'=>'hidden',
  80. 'value'=>$value,
  81. );
  82. return true;
  83. }
  84. public function addDescription($field_name,$description)
  85. {
  86. if(isset($this->fields[$field_name]))
  87. {
  88. $this->fields[$field_name]['description']=$description;
  89. }
  90. else
  91. {
  92. throw new Exception('This form field does not exists!');
  93. }
  94. }
  95. private function filter($text)
  96. {
  97. /*todo
  98. * add some filtering functions here!
  99. */
  100. return $text;
  101. }
  102. private function generateCSRF()
  103. {
  104. return md5('dazdraperma'.$_SERVER['REQUEST_URI'].$_SERVER['HTTP_HOST'].$_SERVER['HTTP_USER_AGENT']);
  105. }
  106. private function validateCSRF($a=null)
  107. {
  108. if($a)
  109. return ($a==md5('dazdraperma'.$_SERVER['REQUEST_URI'].$_SERVER['HTTP_HOST'].$_SERVER['HTTP_USER_AGENT']));
  110. else
  111. return false;
  112. }
  113. public function submit()
  114. {
  115. if(isset($_POST[$this->csrf]) and $this->validateCSRF($_POST[$this->csrf]))
  116. {
  117. foreach(array_keys($this->fields) as $field)
  118. {
  119. if(isset($_POST[md5($this->csrf.$field)]))
  120. {
  121. if($this->fields[$field]['type']=='text' or $this->fields[$field]['type']=='password')
  122. {
  123. if(empty($_POST[md5($this->csrf.$field)]) or preg_match($this->fields[$field]['regex'],htmlspecialchars($_POST[md5($this->csrf.$field)],ENT_QUOTES,'UTF-8')))
  124. {
  125. $this->fields[$field]['value']=$_POST[md5($this->csrf.$field)];
  126. $this->clean[$field]=htmlspecialchars($_POST[md5($this->csrf.$field)],ENT_QUOTES,'UTF-8');
  127. }
  128. else
  129. {
  130. $this->fields[$field]['value']=$_POST[md5($this->csrf.$field)];
  131. $this->setError($field,$this->fields[$field]['error_message']);
  132. $this->hasErrors=true;
  133. unset($this->clean[$field]);
  134. }
  135. }
  136. elseif($this->fields[$field]['type']=='textarea')
  137. {
  138. $this->fields[$field]['value']=$_POST[md5($this->csrf.$field)];
  139. $this->clean[$field]=$this->filter($_POST[md5($this->csrf.$field)]);
  140. }
  141. elseif($this->fields[$field]['type']=='checkbox')
  142. {
  143. if(isset($_POST[md5($this->csrf.$field)]))
  144. {
  145. $this->fields[$field]['check']=true;
  146. $this->clean[$field]=$this->filter($_POST[md5($this->csrf.$field)]);
  147. }
  148. }
  149. elseif($this->fields[$field]['type']=='dropdown')
  150. {
  151. if(isset($_POST[md5($this->csrf.$field)]) and in_array($_POST[md5($this->csrf.$field)],array_keys($this->fields[$field]['value'])))
  152. {
  153. $this->fields[$field]['selected']=$_POST[md5($this->csrf.$field)];
  154. $this->clean[$field]=$this->filter($_POST[md5($this->csrf.$field)]);
  155. }
  156. }
  157. elseif($this->fields[$field]['type']=='hidden')
  158. {
  159. if(isset($_POST[md5($this->csrf.$field)])){
  160. $this->clean[$field]=$this->filter($_POST[md5($this->csrf.$field)]);
  161. }
  162. }
  163. else
  164. {
  165. throw new Exception('Strange value in form...');
  166. }
  167. }
  168. }
  169. $this->submited=true;
  170. return true;
  171. }
  172. else
  173. return false;
  174. }
  175. public function getElementName($elementName)
  176. {
  177. return md5($this->csrf.$elementName);
  178. }
  179. public function render($submit_text='Сохранить',$reset_text='Отмена')
  180. {
  181. ob_start();//todo - jquery - on edit! + random forms which are hidded by jquery
  182. ?>
  183. <form action="<?php echo $_SERVER['REQUEST_URI'];?>" method="post">
  184. <input name="<?php echo md5($this->csrf);?>" type="hidden" value="<?php echo md5(time().'lolz');?>">
  185. <input name="<?php echo $this->csrf;?>" type="hidden" value="<?php echo $this->generateCSRF();?>">
  186. <input name="<?php echo md5(time());?>" type="hidden" value="<?php echo md5(session_id().'lolz');?>">
  187. <input name="<?php echo md5('a'.$this->csrf);?>" type="hidden" value="<?php echo md5(session_id().'2g2');?>">
  188. <input name="<?php echo md5('fuckoff'.$this->csrf);?>" type="hidden" value="<?php echo md5('a4sd'.$this->generateCSRF());?>">
  189. <table border="0" cellpadding="3" cellspacing="0" align="center" width="100%">
  190. <tr>
  191. <td width="33%"></td>
  192. <td width="33%"></td>
  193. <td width="33%"></td>
  194. </tr>
  195. <?php
  196. foreach(array_keys($this->fields) as $field)
  197. {
  198. if($this->fields[$field]['type']=='text' or $this->fields[$field]['type']=='password')
  199. {
  200. ?>
  201. <?php if(isset($this->fields[$field]['error'])):?>
  202. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  203. <td colspan="3" align="center"><?php echo $this->fields[$field]['error'];?></td>
  204. </tr>
  205. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  206. <?php else: ?>
  207. <tr>
  208. <?php endif;?>
  209. <td align="right"><?php echo $this->fields[$field]['caption'];?></td>
  210. <td align="left" colspan="<?php if(isset($this->fields[$field]['description'])) echo 1; else echo 2;?>">
  211. <input name="<?php echo md5($this->csrf.$field);?>"
  212. type="<?php echo $this->fields[$field]['type'];?>"
  213. value="<?php echo $this->fields[$field]['value'];?>">
  214. </td>
  215. <?php if(isset($this->fields[$field]['description'])) echo '<td align="left">'.$this->fields[$field]['description'].'</td>';?>
  216. </tr>
  217. <?php
  218. }
  219. elseif($this->fields[$field]['type']=='textarea')
  220. {
  221. ?>
  222. <?php if(isset($this->fields[$field]['error'])):?>
  223. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  224. <td colspan="3" align="center"><?php echo $this->fields[$field]['error'];?></td>
  225. </tr>
  226. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  227. <?php else: ?>
  228. <tr>
  229. <?php endif;?>
  230. <td colspan="<?php if(isset($this->fields[$field]['description'])) echo 2; else echo 3;?>">
  231. <?php echo $this->fields[$field]['caption'];?><br>
  232. <textarea class="-metrika-nokeys" rows="<?php echo $this->fields[$field]['rows'];?>" cols="<?php echo $this->fields[$field]['cols'];?>" style="width: 100%;" name="<?php echo md5($this->csrf.$field);?>"><?php echo $this->fields[$field]['value'];?></textarea>
  233. </td>
  234. <?php if(isset($this->fields[$field]['description'])) echo '<td align="left">'.$this->fields[$field]['description'].'</td>'; else echo '<td></td>';?>
  235. </tr>
  236. <?php
  237. }
  238. elseif($this->fields[$field]['type']=='checkbox')
  239. {
  240. ?>
  241. <?php if(isset($this->fields[$field]['error'])):?>
  242. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  243. <td colspan="3" align="center"><?php echo $this->fields[$field]['error'];?></td>
  244. </tr>
  245. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  246. <?php else: ?>
  247. <tr>
  248. <?php endif;?>
  249. <td colspan="<?php if(isset($this->fields[$field]['description'])) echo 2; else echo 3;?>" align="center">
  250. <input type="checkbox" name="<?php echo md5($this->csrf.$field);?>" value="<?php echo $this->fields[$field]['value'];?>" <?php if($this->fields[$field]['check']) echo ' checked="checked" ';?>><?php echo $this->fields[$field]['caption'];?>
  251. </td>
  252. <?php if(isset($this->fields[$field]['description'])) echo '<td align="left">'.$this->fields[$field]['description'].'</td>'; else echo '<td></td>';?>
  253. </tr>
  254. <?php
  255. }
  256. elseif($this->fields[$field]['type']=='dropdown')
  257. {
  258. ?>
  259. <?php if(isset($this->fields[$field]['error'])):?>
  260. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  261. <td colspan="3" align="center"><?php echo $this->fields[$field]['error'];?></td>
  262. </tr>
  263. <tr class="form_error" title="<?php echo $this->fields[$field]['error'];?>">
  264. <?php else: ?>
  265. <tr>
  266. <?php endif;?>
  267. <td align="right"><?php echo $this->fields[$field]['caption'];?></td>
  268. <td align="left" colspan="<?php if(isset($this->fields[$field]['description'])) echo 1; else echo 2;?>">
  269. <select name="<?php echo md5($this->csrf.$field);?>">
  270. <?php foreach(array_keys($this->fields[$field]['value']) as $value):?>
  271. <option value="<?php echo $value;?>"
  272. <?php if($value==$this->fields[$field]['selected']) echo ' selected="selected" ';?>
  273. >
  274. <?php echo $this->fields[$field]['value'][$value];//. ' '.$value.'='.$this->fields[$field]['selected'] ;?>
  275. </option>
  276. <?php endforeach;?>
  277. </select>
  278. </td>
  279. <?php if(isset($this->fields[$field]['description'])) echo '<td align="left">'.$this->fields[$field]['description'].'</td>'; else echo '<td></td>';?>
  280. </tr>
  281. <?php
  282. }
  283. elseif($this->fields[$field]['type']=='label')
  284. {
  285. ?><tr>
  286. <td align="center" colspan="3" id="<?php echo md5($this->csrf.$field);?>"><?php echo $this->fields[$field]['caption'];?></td>
  287. </tr><?php
  288. }
  289. elseif($this->fields[$field]['type']=='hidden')
  290. {
  291. ?><input name="<?php echo md5($this->csrf.$field);?>" type="hidden" value="<?php echo $this->fields[$field]['value'];?>"><?php
  292. }
  293. }
  294. ?>
  295. <tr>
  296. <td></td>
  297. <td align="center">
  298. <p>
  299. <?php if($submit_text) echo '<input type="submit" value="'.$submit_text.'">';?>
  300. <?php if($reset_text) echo '<input type="reset" value="'.$reset_text.'">';?>
  301. </p>
  302. </td>
  303. <td></td>
  304. </tr>
  305. </table>
  306. </form>
  307. <?php
  308. return ob_get_clean();
  309. }
  310. public function setError($name,$error_text)
  311. {
  312. if(isset($this->fields[$name]))
  313. {
  314. $this->fields[$name]['error']=$error_text;
  315. return true;
  316. }
  317. else
  318. {
  319. return false;
  320. }
  321. }
  322. public function hasError()
  323. {
  324. return $this->hasErrors;
  325. }
  326. public function __toString()
  327. {
  328. return $this->render();
  329. }
  330. public function getClean($name=null)
  331. {
  332. if($this->submited)
  333. if($name)
  334. {
  335. return isset($this->clean[$name]) ? $this->clean[$name] : false;
  336. }
  337. else
  338. {
  339. return $this->clean;
  340. }
  341. else
  342. return false;
  343. }
  344. }