PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/util/generateController.php

https://gitlab.com/efabian/maya
PHP | 381 lines | 311 code | 48 blank | 22 comment | 52 complexity | 5177600809ccb6c650703b0c5630475c MD5 | raw file
  1. <?php
  2. /** Main model of maya framework
  3. * Object contaiting model objects for main maya framework.
  4. *
  5. * Copyright (C) 20014-2020 Edgardo Fabian <edgardo.fabian@gmail.com>
  6. * LICENSE: This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 3
  9. * of the License, or (at your option) any later version.
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://opensource.org/licenses/gpl-license.php>;.
  16. * @package Maya
  17. * @author Edgardo Fabian <edgardo.fabian@gmail.com>
  18. * @link http://maya.gahum.tech
  19. */
  20. require_once __DIR__.'/../config/database.cfg.php';
  21. require_once __DIR__.'/../config/paths.cfg.php';
  22. $paths = new Paths();
  23. if (file_exists(__DIR__.'/../maya/generate.php'))
  24. {
  25. require_once __DIR__.'/../maya/generate.php';
  26. } else
  27. {
  28. require_once __DIR__.'/../maya/maya/generate.php';
  29. }
  30. if (isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] === 'POST'))
  31. {
  32. $argv = array();
  33. $argv[] = 'generateController.php';
  34. $argv[] = $_POST['table'];
  35. $argc = 2;
  36. if ($_POST['link_image'])
  37. {
  38. $argv[] = 'link_image';
  39. $argc = $argc+1;
  40. }
  41. if ($_POST['singular_table'])
  42. {
  43. $argv[] = 'singular_table';
  44. $argc = $argc+1;
  45. }
  46. if ($_POST['login_register'])
  47. {
  48. $argv[] = 'login_register';
  49. $argc = $argc+1;
  50. }
  51. if ($_POST['no_repeat'])
  52. {
  53. $argv[] = 'no_repeat='.$_POST['no_repeat'];
  54. $argc = $argc+1;
  55. }
  56. if ($_POST['force_not_restful'])
  57. {
  58. $argv[] = 'restful=false';
  59. $argc = $argc+1;
  60. }
  61. }
  62. //die(json_encode($argv));
  63. if ($argc<2)
  64. {
  65. print_r("Insufficient parameters\n");
  66. print_r("generateController table_name login_register new_edit link_image\n");
  67. print_r("login_register, new_edit and link_image are optional\n");
  68. print_r("* login_register means include loginRestAction() and registerRestAction()\n");
  69. print_r("* link_image means include uploadImageAction()\n");
  70. } else
  71. {
  72. print_r("processing....\n");
  73. if (!file_exists("../usr/controller"))
  74. {
  75. mkdir(__DIR__."/../usr/controller");
  76. }
  77. if (!file_exists("../old/usr/controller"))
  78. {
  79. mkdir(__DIR__."/../old/usr/controller");
  80. }
  81. if (!file_exists("../usr_generated/controller"))
  82. {
  83. mkdir(__DIR__."/../usr_generated/controller");
  84. }
  85. if (!file_exists("../old/usr_generated/controller"))
  86. {
  87. mkdir(__DIR__."/../old/usr_generated/controller");
  88. }
  89. $table = $argv[1];
  90. if (in_array('singular_table',$argv))
  91. {
  92. $table_element = $table;
  93. $users_table = 'user';
  94. $element_array = $table.'s';
  95. } else
  96. {
  97. $table_element = generateTableElementName($table);
  98. $users_table = 'users';
  99. $element_array = $table;
  100. }
  101. $controller_name = getFunctionName(ucfirst($table));
  102. $class_name = getFunctionName($table_element);
  103. $mysqli = new mysqli($db_host,$db_user, $db_password, $db);
  104. if ($mysqli->connect_errno)
  105. {
  106. echo "Failed to connect to MySQL: " . $mysqli->connect_error;
  107. }
  108. //get primary key
  109. $sql = "SHOW KEYS FROM $table WHERE Key_name = 'PRIMARY';";
  110. $res = $mysqli->query($sql);
  111. $primary = 'id';
  112. if ($mysqli->affected_rows>0)
  113. {
  114. $row = $res->fetch_array();
  115. $primary = $row['Column_name'];
  116. } else
  117. {
  118. print_r("No primary key");
  119. die();
  120. }
  121. $primary_function_name = getFunctionName($primary);
  122. $header = file_get_contents('header.tem');
  123. $entity="<?php \r\n$header\r\n";
  124. $entity.="require_once 'MayaSecurity.php';\nrequire_once 'security.cfg.php';\n";
  125. if (defined('GOOGLE_CLIENT_ID') || defined('FACEBOOK_CLIENT_ID'))
  126. {
  127. $entity.="require_once __DIR__.'/../../lib/vendor/autoload.php';\n";
  128. }
  129. if ($table===$users_table)
  130. {
  131. $entity.="require_once 'Configurations.php';\n";
  132. }
  133. $security_tem = file_get_contents('security.tem');
  134. $ctrl_temp=file_get_contents('controller.tem');
  135. if ((in_array('login_register',$argv)) || ($table===$users_table))
  136. {
  137. $login_register = file_get_contents('login_register.tem');
  138. if (defined('GOOGLE_CLIENT_ID'))
  139. {
  140. $google_login=file_get_contents('google_login.tem');
  141. }
  142. else $google_login='';
  143. $login_register=str_replace('[GOOGLE_LOGIN]',$google_login,$login_register);
  144. if (defined('FACEBOOK_CLIENT_ID'))
  145. {
  146. $facebook_login=file_get_contents('facebook_login.tem');
  147. }
  148. else $facebook_login='';
  149. $login_register=str_replace('[FACEBOOK_LOGIN]',$facebook_login,$login_register);
  150. $log_reg_tem = str_replace('[PRIMARY_FUNCTION]',$primary_function_name,$login_register);
  151. $ctrl_template = str_replace ('[LOGIN_REGISTER_LOGOUT]',$log_reg_tem,$ctrl_temp);
  152. $ctrl_template = str_replace ('[SECURITY]',$security_tem,$ctrl_template);
  153. } else
  154. {
  155. $ctrl_template = str_replace ('[LOGIN_REGISTER_LOGOUT]','',$ctrl_temp);
  156. }
  157. if (in_array('restful=false',$argv))
  158. {
  159. if ($table===$users_table)
  160. {
  161. $new_save_tem = file_get_contents('user_edit.tem');
  162. } else
  163. {
  164. $new_save_tem = file_get_contents('new_edit.tem');
  165. }
  166. $ctrl_template = str_replace ('[NEW_EDIT]',$new_save_tem,$ctrl_template);
  167. $ctrl_template = str_replace ('[SECURITY]',$security_tem,$ctrl_template);
  168. } else
  169. {
  170. if ($table===$users_table)
  171. {
  172. $new_save_tem = file_get_contents('user_edit_rest.tem')."\r\n".file_get_contents('user_edit.tem');
  173. } else
  174. {
  175. $new_save_tem = file_get_contents('new_edit_rest.tem')."\r\n".file_get_contents('new_edit.tem');
  176. }
  177. $ctrl_template = str_replace ('[NEW_EDIT]',$new_save_tem,$ctrl_template);
  178. $ctrl_template = str_replace ('[SECURITY]',$security_tem,$ctrl_template);
  179. }
  180. $no_repeat_field = array();
  181. foreach ($argv as $arg)
  182. {
  183. if (!(strpos($arg,'NO_REPEAT')===false))
  184. {
  185. $equal = strpos($arg,'=');
  186. $no_repeat_field[] = substr($argv,$equal+1);
  187. }
  188. }
  189. $no_repeat='';
  190. if (count($no_repeat_field)>0)
  191. {
  192. $no_repeat = ' $old_'.$table_element.' = new '.getFunctionName($table_element).'();'."\r\n";
  193. $no_repeat.= ' $old_'.$table_element.' = $old_'.$table_element.'->find(array(';
  194. $i=0;
  195. foreach($no_repeat_field as $field)
  196. {
  197. $i=$i+1;
  198. if ($i==count($no_repeat_field))
  199. {
  200. $no_repeat.='"'.$field.'"=>$'.$table_element.'->get'.getFunctionName($field).'()));'."\r\n";
  201. } else
  202. {
  203. $no_repeat.='"'.$field.'"=>$'.$table_element.'->get'.getFunctionName($field).'(),';
  204. }
  205. }
  206. $no_repeat.= 'if ($old_'.$table_element.'->getId()>0)'."\r\n".' {';
  207. $no_repeat.='$message="User with the same email=".$'.user.'->getName()." already exist!"'."\r\n";
  208. $no_repeat.='$success=false;'."\r\n";
  209. $no_repeat.='} else'."\r\n";
  210. }
  211. $res->close();
  212. $sql ="SELECT column_name, data_type,character_maximum_length FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$table' and TABLE_SCHEMA='$db';";
  213. $res = $mysqli->query($sql);
  214. $post_entity = "\r\n";
  215. $post_entity_new = "";
  216. $array_to_object = $post_entity;
  217. $column_image_tem=file_get_contents('column_image.tem');
  218. $column_images='';
  219. while ($row = $res->fetch_array())
  220. {
  221. $data_type = $row['data_type'];
  222. $data = $row['column_name'];
  223. if ($data === $primary)
  224. {
  225. } else
  226. {
  227. if (($data_type==='timestamp')|| (trim(strtolower($data))==='salt') || (trim(strtolower($data))==='password'))
  228. {
  229. //skip
  230. }
  231. else if (((trim(strtolower($data))==='created')||(trim(strtolower($data))==='modified')||(trim(strtolower($data))==='login')) && (($data_type==='datetime')))
  232. {
  233. if (strpos($post_entity,'$now=new DateTime()')===FALSE) $post_entity.=' $now=new DateTime();'."\r\n";
  234. $post_entity.= ' $'.$table_element.'->set'.getFunctionName($data).'($now->format("Y-m-d H:i:s"));'."\r\n";
  235. } else
  236. if (strpos($data,'_ids')>0)
  237. {
  238. $idsx = strpos($data,'_ids');
  239. if ($idsx > 0)
  240. {
  241. $post_entity.= ' if (array_key_exists("'.$data.'",$_POST))'."\n";
  242. $post_entity.= ' {'."\n";
  243. $post_entity.= ' $'.$data.'='.'$_POST["'.$data.'"];'."\n";
  244. $post_entity.= ' $str_'.$data.'="" '.";\n";
  245. $post_entity.= ' if (is_array($'.$data.'))'."\n";
  246. $post_entity.= ' {'."\n";
  247. $post_entity.= ' $str_'.$data.'=implode(",",$'.$data.');'."\n";
  248. $post_entity.= ' }'."\n";
  249. $post_entity.= ' $'.$table_element.'->set'.getFunctionName($data).'($str_'.$data.');'."\r\n";
  250. $post_entity.= ' }'."\n";
  251. } else
  252. {
  253. }
  254. } else if (strpos($data,'_image'))
  255. {
  256. $column_image=str_replace('[IMAGE_NAME]',getFunctionName($data),$column_image_tem);
  257. $column_image=str_replace('[IMAGE_FOLDER]',$data,$column_image);
  258. $column_image = str_replace('[TABLE_ELEMENT]',$table_element,$column_image);
  259. $column_image = str_replace('[TABLE]',$table,$column_image);
  260. $column_image = str_replace('[CLASS_NAME]',$class_name,$column_image);
  261. $column_images.=$column_image;
  262. } else if (($table=='users') && ($data=='role'))
  263. {
  264. $post_entity.= ' if (array_key_exists("'.$data.'",$_POST))'."\r\n";
  265. $post_entity.= " {\r\n";
  266. $post_entity.= ' $role=0;'."\r\n";;
  267. $post_entity.= ' if (is_array($_POST["'.$data.'"]))'."\r\n";
  268. $post_entity.= " {\r\n";
  269. $post_entity.= ' $rol = new Role();'."\r\n";
  270. $post_entity.= ' $role = $rol->arrayToIntegerEncoded($_POST["'.$data.'"]);'."\r\n";
  271. $post_entity.= " }\r\n";
  272. $post_entity.= ' $'.$table_element.'->set'.getFunctionName($data).'($role);'."\r\n";
  273. $post_entity.= " }\r\n";
  274. $entity.="require_once 'Role.php';\n";
  275. } else
  276. {
  277. $post_entity.= ' if (array_key_exists("'.$data.'",$_POST)) $'.$table_element.'->set'.getFunctionName($data).'('.'$_POST["'.$data.'"]);'."\r\n";
  278. }
  279. }
  280. $array_to_object.=' $'.$table_element.'->set'.getFunctionName($data).'('.'$row["'.$data.'"]);'."\r\n";
  281. }
  282. if ($post_entity_new)
  283. {
  284. $post_entity_new=' $now = new DateTime("NOW");'."\r\n".$post_entity_new;
  285. }
  286. if (in_array('link_image',$argv) || $column_images )
  287. {
  288. $entity.="require_once 'MayaImage.php';\n";
  289. $upload_image_tem = file_get_contents('upload_image.tem')."\r\n".$column_images;
  290. $upload_image_tem = str_replace('[IMAGE_NAME]','uploadImage',$upload_image_tem);
  291. $upload_image_tem = str_replace('[IMAGE_FOLDER]','',$upload_image_tem);
  292. $ctrl_template = str_replace ('[UPLOAD_IMAGE]',$upload_image_tem,$ctrl_template);
  293. }
  294. else
  295. {
  296. $ctrl_template = str_replace ('[UPLOAD_IMAGE]','',$ctrl_template);
  297. }
  298. $array_to_array_object=$array_to_object.' $'.$element_array.'[]=$'.$table_element.';';
  299. $ctrl_template = str_replace('[TABLE]',$table,$ctrl_template);
  300. $ctrl_template = str_replace('[TABLE_ELEMENT]',$table_element,$ctrl_template);
  301. $ctrl_template = str_replace('[CLASS_NAME]',$class_name,$ctrl_template);
  302. $ctrl_template = str_replace('[PRIMARY]',$primary,$ctrl_template);
  303. $ctrl_template = str_replace('[CONTROLLER_NAME]',$controller_name,$ctrl_template);
  304. $ctrl_template = str_replace('[CONTAINER]','div.page',$ctrl_template);
  305. $ctrl_template = str_replace('[ADMIN_DIR]',$paths->admin,$ctrl_template);
  306. $ctrl_template = str_replace('[UNIT_TRANSFER]',$array_to_object,$ctrl_template);
  307. $ctrl_template = str_replace('[TABLE_TRANSFER]',$array_to_array_object,$ctrl_template);
  308. $ctrl_template = str_replace('[POST_ENTITY]',$post_entity,$ctrl_template);
  309. $ctrl_template = str_replace('[POST_ENTITY_NEW]',$post_entity.$post_entity_new,$ctrl_template);
  310. //die($post_entity.$post_entity_new);
  311. $ctrl_final = str_replace('[NO_REPEAT]',$no_repeat,$ctrl_template);
  312. $entity.=$ctrl_final."\r\n";
  313. if (file_exists("../usr_generated/controller/Maya$controller_name"."Controller.php"))
  314. {
  315. $now = new DateTime('NOW');
  316. print_r("Storing backup at ../old/usr_generated/controller/Maya$controller_name"."Controller".$now->format('Ymd_his').".bak"."\n");
  317. $backup = file_get_contents("../usr_generated/controller/Maya$controller_name"."Controller.php");
  318. file_put_contents("../old/usr_generated/controller/Maya$controller_name"."Controller".$now->format('Ymd_his').".bak",$backup);
  319. }
  320. $entity_extended="<?php \r\n$header\r\n";
  321. $entity_extended.="require_once 'Maya".$controller_name."Controller.php';\r\n";
  322. $entity_extended.="class ".$controller_name."Controller extends Maya".$controller_name."Controller \r\n";
  323. $entity_extended.="{ \r\n}\r\n";
  324. if (file_exists("../usr/controller/$controller_name"."Controller.php"))
  325. {
  326. } else
  327. {
  328. print_r("Writing ../usr/controller/$controller_name"."Controller.php\n");
  329. file_put_contents("../usr/controller/$controller_name"."Controller.php",$entity_extended);
  330. }
  331. file_put_contents("../usr_generated/controller/Maya$controller_name"."Controller.php",$entity);
  332. print_r("done! $table created at ../usr_generated/controller/Maya$controller_name"."Controller.php\n");
  333. }