/** * 创建模块 * * @param unknown_type $module_info */ private function create_module($module_info, $table_name = 'demo', $app_name = '') { import("@.ORG.file"); $file = new file(); if ($app_name == '') { $db_node = M('node'); $app_name = $db_node->where("id='{$module_info['pid']}'")->getField('name'); } //创建模块的文件 $content = $file->read_file("/Lib/Action/DemoAction.class.php"); $content = str_replace('[应用名称]', $module_info['title'], $content); $content = str_replace('[描述]', $module_info['remark'], $content); $content = str_replace('[demo]', $_SESSION['nickname'], $content); $content = str_replace('[日期]', date('Y-m-d'), $content); $content = str_replace('[数据表名]', $table_name, $content); $content = str_replace('class DemoAction extends', "class {$module_info['name']}Action extends", $content); $file->write_file("/Lib/Action/{$app_name}/{$module_info['name']}Action.class.php", $content); return $module_info; }
/** * 生成操作节点为的代码,要在“/Tpl/应用/”中生成“模块-index.html、模块-add.html、模块-edit.html” * * @param unknown_type $node_info */ private function action_create_code($action_info, $table_name, $demo_type = 'index') { //找出模块 $db_node = M('node'); $module_info = $db_node->where("id='{$action_info['pid']}'")->find(); //找出应用 $app_info = $db_node->where("id='{$module_info['pid']}'")->find(); $lib_file = "/Lib/Action/{$app_info['name']}/{$module_info['name']}Action.class.php"; if (!file_exists($_SERVER['DOCUMENT_ROOT'] . $lib_file)) { echo '不存在此模块'; return false; } import("@.ORG.file"); $file = new file(); $content = $file->read_file($lib_file); //删除代码的最后一个字符,然后连接在一起 $content = substr($content, 0, -1); $date = date('Y-m-d'); $function = <<<EOF /** * {$action_info['title']} * {$action_info['remark']} * @author {$_SESSION['loginUserName']} * @date {$date} */ public function {$action_info['name']}(){ } } EOF; $content = $content . $function; $rs = $file->write_file($lib_file, $content); if (!$rs) { return false; } //HTML文件写入 $table_name = $table_name ? $table_name : $module_info['name']; $this->create_html($app_info['name'], $module_info['name'], $action_info['name'], $demo_type, $table_name); return true; }
/** * 创建代码 * */ private function create_html($app_name, $module_name, $action_name, $demo_type, $table_name) { import("@.ORG.file"); $file = new file(); $db_field = M('field'); $field_list = $db_field->where("table_name='{$table_name}'")->order('listorder ASC ,id ASC')->select(); $content = $file->read_file("/Tpl/Public/Demo-{$demo_type}.html"); switch ($demo_type) { case 'index': $textarea_height = 0; foreach ($field_list as $val) { $name_th .= '<th><a href="?_order=' . $val['field'] . '&_sort={$sort}">' . $val['name'] . '</a><if condition="$order eq \'' . $val['field'] . '\'"><img src="__PUBLIC__/images/{$sortImg}.gif" width="9px" height="9px" alt="{$sortAlt}" /></if></th>'; $field_td .= '<td>{$info[' . $val['field'] . ']}</td>'; if ($val['formtype'] == 'textarea') { //当是多行文本时要增加多2行的高度 $textarea_height = $textarea_height + 40; } if ($val['issearch']) { switch ($val['formtype']) { case 'select': case 'radio': case 'checkbox': eval('$setting=' . $val['setting'] . ';'); $search_form .= "<select name='{$val['field']}'><option value='-1'>请选择{$val['name']}</option>"; foreach ($setting as $v) { $search_form .= "<option value='{$v['value']}' <if condition=\"\$_REQUEST['{$val['field']}'] eq '{$v['value']}'\">selected=\"selected\"</if>\">{$v['name']}</option>\n"; } $search_form .= "</select>\n"; break; default: $search_form .= "{$val['name']}:<input name='{$val['field']}' type='text' value='{\$Think.request.{$val['field']}}' />\n"; break; } } } if ($search_form) { $search_form = '<div class="form-div"> <form name="searchForm" action=""> <img width="26" height="22" border="0" alt="SEARCH" src="__PUBLIC__/images/icon_search.gif"> ' . $search_form . ' <input type="submit" class="button" value=" 搜索 "> </form> </div>'; } $field_num = count($field_list); //计算出话框的宽和高 $column_num = $field_num < 12 ? 2 : ($field_num % 3 == 0 ? 3 : 4); //可以根据字段的数量来决定有多少列 $row_num = ceil($field_num / $column_num); $dialog_width = 120 * $column_num * 2; //因为每一个字段要占2列数据界面 $dialog_height = 100 + 25 * $row_num + $textarea_height; //设置添加、修改的对话框URL参数,只要同一个list的action的curd操作都是和list的前缀一样时有效 if (strstr($action_name, 'list')) { $action_pre = str_replace('list', '', $action_name); } else { $action_pre = ''; } $select = array('[¥name]', '[¥field]', '[¥search]', '[¥dialog_width]', '[¥dialog_height]', '[¥action_pre]'); $content = str_replace($select, array($name_th, $field_td, $search_form, $dialog_width, $dialog_height, $action_pre), $content); $file->write_file("/Tpl/{$app_name}/{$module_name}-{$action_name}.html", $content); case 'export': foreach ($field_list as $val) { $name_th .= ',' . $val['name']; $field_td .= ',{$info[' . $val['field'] . ']}'; } $select = array('[¥name]', '[¥field]'); $content = str_replace($select, array($name_th, $field_td), $content); $file->write_file("/Tpl/{$app_name}/{$module_name}-{$action_name}.html", $content); break; case 'import': foreach ($field_list as $val) { $field_key .= "<input name=\"field_key[{$val['name']}]\" type=\"hidden\" value=\"{$val['field']}\" />"; } $content = str_replace('[¥field_key]', $field_key, $content); $file->write_file("/Tpl/{$app_name}/{$module_name}-{$action_name}.html", $content); break; case 'add': $field_num = count($field_list); $column_num = $field_num < 12 ? 2 : ($field_num % 3 == 0 ? 3 : 4); //可以根据字段的数量来决定有多少列 $tr = 1; foreach ($field_list as $val) { $formtype = ''; switch ($val['formtype']) { case 'text': $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']}'>{$val['tips']}"; break; case 'password': $formtype = "<input name='{$val['field']}' type='password' class='{$val['field']}'>{$val['tips']}"; break; case 'textarea': $formtype = "<textarea name='{$val['field']}' class='{$val['field']}'></textarea>{$val['tips']}"; break; case 'select': $formtype = '<select name="' . $val['field'] . '" class="' . $val['field'] . '">'; eval('$select_list=' . $val['setting'] . ';'); foreach ($select_list as $v) { $formtype .= '<option value="' . $v['value'] . '" >' . $v['name'] . '</option>'; } $formtype .= '</select>' . $val['tips']; break; case 'checkbox': eval('$checkbox_list=' . $val['setting'] . ';'); foreach ($checkbox_list as $v) { $formtype .= '<input type="checkbox" name="' . $val['field'] . '[]" class="' . $val['field'] . '" value="' . $v['value'] . '" />' . $v['name']; } break; case 'radio': eval('$radio_list=' . $val['setting'] . ';'); foreach ($radio_list as $v) { $formtype .= '<input type="radio" name="' . $val['field'] . '[]" class="' . $val['field'] . '" value="' . $v['value'] . '" />' . $v['name']; } break; case 'date': $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']} date'>{$val['tips']}"; $replace_date = "\$('.date').datepicker();\n"; break; case 'date_time': $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']} date_time'>{$val['tips']}"; $replace_time = "\$('.date_time').datetimepicker();\n"; break; default: $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']}'>{$val['tips']}"; break; } if ($i++ % $column_num == 0 && $tr == 1) { $html .= "<tr>"; } $html .= "<th>{$val['name']}</th><td>{$formtype}</td>"; if ($i % $column_num == 0 && $tr == $column_num) { $html .= "</tr>\n"; $tr = 0; } $tr++; } //当列数不够时要补全 $row_num = ceil($field_num / $column_num); for ($i = 0; $i < $column_num * $row_num - $field_num; $i++) { $html .= "<th> </th><td> </td>"; } if ($column_num * $row_num == $field_num) { $html .= "</tr>\n"; } $content = str_replace('[¥html]', $html, $content); //替换日期 if ($replace_date) { $content = str_replace('<!--[¥date]-->', $replace_date . $replace_time, $content); } $file->write_file("/Tpl/{$app_name}/{$module_name}-{$action_name}.html", $content); break; case 'edit': $field_num = count($field_list); $column_num = $field_num < 12 ? 2 : ($field_num % 3 == 0 ? 3 : 4); //可以根据字段的数量来决定有多少列 $tr = 1; foreach ($field_list as $val) { $formtype = ''; switch ($val['formtype']) { case 'text': $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']}' value='" . '{$info[' . $val['field'] . ']}' . "'>{$val['tips']}"; break; case 'password': $formtype = "<input name='{$val['field']}' type='password' class='{$val['field']}'>{$val['tips']}"; break; case 'textarea': $formtype = "<textarea name='{$val['field']}' class='{$val['field']}'>" . '{$info[' . $val['field'] . ']}' . "</textarea>{$val['tips']}"; break; case 'select': $formtype = '<select name="' . $val['field'] . '" class="' . $val['field'] . '">'; eval('$select_list=' . $val['setting'] . ';'); foreach ($select_list as $v) { $formtype .= '<option value="' . $v['value'] . '" <if condition="$info[' . $val['field'] . '] eq \'' . $v['value'] . '\'">selected</if>>' . $v['name'] . '</option>'; } $formtype .= '</select>' . $val['tips']; break; case 'checkbox': eval('$checkbox_list=' . $val['setting'] . ';'); foreach ($checkbox_list as $v) { $formtype .= '<input type="checkbox" name="' . $val['field'] . '[]" id="' . $val['field'] . '" value="' . $v['value'] . '" <if condition="$info[' . $val['field'] . '] eq \'' . $v['value'] . '\'">checked="checked"</if> />' . $v['name']; } break; case 'radio': eval('$radio_list=' . $val['setting'] . ';'); foreach ($radio_list as $v) { $formtype .= '<input type="radio" name="' . $val['field'] . '" class="' . $val['field'] . '" value="' . $v['value'] . '" <if condition="$info[' . $val['field'] . '] eq \'' . $v['value'] . '\'">checked="checked"</if>/>' . $v['name']; } break; case 'date': $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']} date' value='" . '{$info[' . $val['field'] . ']}' . "'>{$val['tips']}"; $replace_date = "\$('.date').datepicker();\n"; break; case 'date_time': $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']} date_time' value='" . '{$info[' . $val['field'] . ']}' . "'>{$val['tips']}"; $replace_time = "\$('.date_time').datetimepicker();\n"; break; default: $formtype = "<input name='{$val['field']}' type='text' class='{$val['field']}' value='" . '{$info[' . $val['field'] . ']}' . "'>{$val['tips']}"; break; } if ($i++ % $column_num == 0 && $tr == 1) { //加个tr标记 $html .= "<tr>"; } $html .= "<th>{$val['name']}</th><td>{$formtype}</td>"; if ($i % $column_num == 0 && $tr == $column_num) { //关闭tr标记 $html .= "</tr>\n"; $tr = 0; } $tr++; } //当列数不够时要补全 $row_num = ceil($field_num / $column_num); for ($i = 0; $i < $column_num * $row_num - $field_num; $i++) { $html .= "<th> </th><td> </td>"; } if ($column_num * $row_num == $field_num) { $html .= "</tr>\n"; } $content = str_replace('[¥html]', $html, $content); //替换日期 if ($replace_date) { $content = str_replace('<!--[¥date]-->', $replace_date . $replace_time, $content); } $file->write_file("/Tpl/{$app_name}/{$module_name}-{$action_name}.html", $content); break; case 'show': $field_num = count($field_list); $column_num = $field_num < 12 ? 1 : ($field_num % 3 == 0 ? 3 : 4); //可以根据字段的数量来决定有多少列 $tr = 1; foreach ($field_list as $val) { if ($i++ % $column_num == 0 && $tr == 1) { $html .= "<tr>"; } $html .= '<th width="10%">' . $val['name'] . '</th><td>{$info[' . $val['field'] . ']}</td>'; if ($i % $column_num == 0 && $tr == $column_num) { $html .= "</tr>\n"; $tr = 0; } $tr++; } //当列数不够时要补全 $row_num = ceil($field_num / $column_num); for ($i = 0; $i < $column_num * $row_num - $field_num; $i++) { $html .= "<th> </th><td> </td>"; } if ($column_num * $row_num == $field_num) { $html .= "</tr>\n"; } $content = str_replace('[¥html]', $html, $content); $file->write_file("/Tpl/{$app_name}/{$module_name}-{$action_name}.html", $content); break; } }
/** * 分析出类中的说明,和操作的类 * 第一个是模型 的一些信息 * @param unknown_type $file * @return $arr=array( * array('level'=>2,'title'=>'在文件中是用[title][/title]包围 的','name'=>'类名','remark'=>'在系统中是用[des][/des]包围的'), * array('level'=>3,'title'=>'每一个public函数前面的注释用[title][/title]包围的','name'=>'函数名','remark'=>'每一个public函数前面的注释') * ); */ private function analysis_file($file) { import("@.ORG.file"); $obj_file = new file(); $content = $obj_file->read_file($file); $arr = explode('Action extends', $content); $module_str = $arr[0]; $action_str = $arr[1]; $module_arr = explode('class', $module_str); preg_match("/(\\[title\\])[^(\\[\\/title\\])]*(\\[\\/title\\])/", $module_str, $title); $title = str_replace('[title]', '', str_replace('[/title]', '', $title[0])); preg_match("/(\\[des\\])[^(\\[\\/des\\])]*(\\[\\/des\\])/", $module_str, $des); $des = str_replace('[des]', '', str_replace('[/des]', '', $des[0])); $title = trim($title) ? trim($title) . '模块' : trim($module_arr[1]); $module_info = array(array('level' => 2, 'title' => $title, 'name' => trim($module_arr[1]), 'remark' => $des)); //模块的信息 //分析操作的信息 preg_match_all("/(public function)\\s+\\w+/", $action_str, $match_action); $delete_action = array('__construct'); foreach ($match_action[0] as $action) { $action_name = trim(str_replace('public function', '', $action)); if (!in_array($action_name, $delete_action)) { //排除开一些自动生成的必需的方法 $name = trim(str_replace('_before_', '', $action_name)); $title = $name; $remark = $name; $action_info[] = array('level' => 3, 'name' => $name, 'title' => $title, 'remark' => $remark); } } return array_merge($module_info, $action_info); }
/** * 创建应用的各个文件 */ private function create_app($app_info) { import("@.ORG.file"); $file = new file(); //建立Action里的应用文件夹 $file->create_folder("/Lib/Action/", $app_info['name']); //创建Tpl下相应模块的文件夹和默认操作HTML文件 $file->create_folder("/Tpl/", $app_info['name']); //在配置文件中要自动加入这个应用 $content = $file->read_file('/Conf/sys_app_group_list.php'); $content = str_replace('";', ",{$app_info['name']}\";", $content); $file->write_file('/Conf/sys_app_group_list.php', $content, true); return true; }