diff --git a/.gitignore b/.gitignore index fb8818a5a07beb5be1c6b17181bd4d5cea077f94..3f2ebf8ce386ea0bf49af91dca00f2043fc394fb 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ composer.lock *.css.map !.gitkeep .env +.svn .vscode diff --git a/application/admin/command/Crud.php b/application/admin/command/Crud.php index f207386b53f80c36496f8326343ee7079eabe91b..27b77e0007058695d80e07c7dbaa921f0a50dcf8 100755 --- a/application/admin/command/Crud.php +++ b/application/admin/command/Crud.php @@ -116,6 +116,11 @@ class Crud extends Command */ protected $editorClass = 'editor'; + /** + * langList的key最长字节数 + */ + protected $fieldMaxLen = 0; + protected function configure() { $this @@ -325,8 +330,8 @@ class Crud extends Command $controllerUrl = strtolower(implode('/', $controllerArr)); $controllerBaseName = strtolower(implode(DS, $controllerArr)); - //视图文件 - $viewDir = $adminPath . 'view' . DS . $controllerBaseName . DS; + //视图文件 -- 如果控制器名字为驼峰形式,目录名需要转为下划线 + $viewDir = $adminPath . 'view' . DS . strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', implode(DS, $controllerArr))) . DS; //最终将生成的文件路径 $javascriptFile = ROOT_PATH . 'public' . DS . 'assets' . DS . 'js' . DS . 'backend' . DS . $controllerBaseName . '.js'; @@ -483,6 +488,7 @@ class Crud extends Command //循环所有字段,开始构造视图的HTML和JS信息 foreach ($columnList as $k => $v) { $field = $v['COLUMN_NAME']; + $langField = mb_ucfirst($field); $itemArr = []; // 这里构建Enum和Set类型的列表数据 if (in_array($v['DATA_TYPE'], ['enum', 'set', 'tinyint'])) { @@ -540,6 +546,7 @@ class Crud extends Command $formEditElement = $this->getReplacedStub('html/select', ['field' => $field, 'fieldName' => $fieldName, 'fieldList' => $this->getFieldListName($field), 'attrStr' => Form::attributes($attrArr), 'selectedValue' => "\$row.{$field}"]); } else if ($inputType == 'datetime') { $cssClassArr[] = 'datetimepicker'; + $attrArr['placeholder'] = "{:__('Please select')}{:__('{$langField}')}"; $attrArr['class'] = implode(' ', $cssClassArr); $format = "YYYY-MM-DD HH:mm:ss"; $phpFormat = "Y-m-d H:i:s"; @@ -595,6 +602,7 @@ class Crud extends Command $formEditElement = $this->getReplacedStub('html/' . $inputType, ['field' => $field, 'fieldName' => $fieldName, 'fieldList' => $this->getFieldListName($field), 'attrStr' => Form::attributes($attrArr), 'selectedValue' => "\$row.{$field}"]); } else if ($inputType == 'textarea') { $cssClassArr[] = $this->isMatchSuffix($field, $this->editorSuffix) ? $this->editorClass : ''; + $attrArr['placeholder'] = "{:__('Please input')}{:__('{$langField}')}"; $attrArr['class'] = implode(' ', $cssClassArr); $attrArr['rows'] = 5; $formAddElement = Form::textarea($fieldName, $defaultValue, $attrArr); @@ -615,17 +623,20 @@ class Crud extends Command $formAddElement = $this->getReplacedStub('html/' . $inputType, ['field' => $field, 'fieldName' => $fieldName, 'fieldYes' => $yes, 'fieldNo' => $no, 'attrStr' => Form::attributes($attrArr), 'fieldValue' => $defaultValue, 'fieldSwitchClass' => $defaultValue == $no ? $stateNoClass : '']); $formEditElement = $this->getReplacedStub('html/' . $inputType, ['field' => $field, 'fieldName' => $fieldName, 'fieldYes' => $yes, 'fieldNo' => $no, 'attrStr' => Form::attributes($attrArr), 'fieldValue' => "{\$row.{$field}}", 'fieldSwitchClass' => "{eq name=\"\$row.{$field}\" value=\"{$no}\"}fa-flip-horizontal text-gray{/eq}"]); } else if ($inputType == 'citypicker') { + $attrArr['placeholder'] = "{:__('Please select')}{:__('{$langField}')}"; $attrArr['class'] = implode(' ', $cssClassArr); $attrArr['data-toggle'] = "city-picker"; $formAddElement = sprintf("
%s
", Form::input('text', $fieldName, $defaultValue, $attrArr)); $formEditElement = sprintf("
%s
", Form::input('text', $fieldName, $editValue, $attrArr)); } else { + $attrArr['placeholder'] = "{:__('Please input')}{:__('{$langField}')}"; $search = $replace = ''; //特殊字段为关联搜索 if ($this->isMatchSuffix($field, $this->selectpageSuffix)) { $inputType = 'text'; $defaultValue = ''; $attrArr['data-rule'] = 'required'; + $attrArr['placeholder'] = "{:__('Please select')}{:__('{$langField}')}"; $cssClassArr[] = 'selectpage'; $selectpageController = str_replace('_', '/', substr($field, 0, strripos($field, '_'))); $attrArr['data-source'] = $selectpageController . "/index"; @@ -695,6 +706,8 @@ class Crud extends Command $javascriptList[] = $this->getJsColumn($field, $v['DATA_TYPE'], $inputType && in_array($inputType, ['select', 'checkbox', 'radio']) ? '_text' : '', $itemArr); } if ($this->headingFilterField && $this->headingFilterField == $field && $itemArr) { + //如果字段名含有下划线,需要转为小驼峰 + $field = $this->getCamelizeName($field); $headingHtml = $this->getReplacedStub('html/heading-html', ['field' => $field]); } //排序方式,如果有指定排序字段,否则按主键排序 @@ -730,9 +743,19 @@ class Crud extends Command $editList = implode("\n", array_filter($editList)); $javascriptList = implode(",\n", array_filter($javascriptList)); $langList = implode(",\n", array_filter($langList)); + //数组等号对齐 + $langList = array_filter(explode(",\n", $langList . ",\n")); + foreach ($langList as &$line) { + if (preg_match("/^\s+'([^']+)'\s*=>\s*'([^']+)'\s*/is", $line, $matches)) { + $line = " '{$matches[1]}'" . str_pad('=>', ($this->fieldMaxLen - strlen($matches[1]) + 3), ' ', STR_PAD_LEFT) . " '{$matches[2]}'"; + } + } + unset($line); + $langList = implode(",\n", array_filter($langList)). ","; //表注释 $tableComment = $modelTableInfo['Comment']; + $tableCNName = mb_substr($tableComment, -1) == '表' ? mb_substr($tableComment, 0, -1) : $tableComment; $tableComment = mb_substr($tableComment, -1) == '表' ? mb_substr($tableComment, 0, -1) . '管理' : $tableComment; $modelInit = ''; @@ -754,6 +777,7 @@ class Crud extends Command 'modelTableTypeName' => $modelTableTypeName, 'validateName' => $validateName, 'tableComment' => $tableComment, + 'tableCNName' => $tableCNName, 'iconName' => $iconName, 'pk' => $priKey, 'order' => $order, @@ -1072,6 +1096,7 @@ EOD; { if ($content || !Lang::has($field)) { $itemArr = []; + $this->fieldMaxLen = strlen($field) > $this->fieldMaxLen ? strlen($field) : $this->fieldMaxLen; $content = str_replace(',', ',', $content); if (stripos($content, ':') !== false && stripos($content, ',') && stripos($content, '=') !== false) { list($fieldLang, $item) = explode(':', $content); @@ -1081,6 +1106,7 @@ EOD; if (count($valArr) == 2) { list($key, $value) = $valArr; $itemArr[$field . ' ' . $key] = $value; + $this->fieldMaxLen = strlen($field . ' ' . $key) > $this->fieldMaxLen ? strlen($field . ' ' . $key) : $this->fieldMaxLen; } } } else { @@ -1088,7 +1114,7 @@ EOD; } $resultArr = []; foreach ($itemArr as $k => $v) { - $resultArr[] = " '" . mb_ucfirst($k) . "' => '{$v}'"; + $resultArr[] = " '" . mb_ucfirst($k) . "' => '{$v}'"; } return implode(",\n", $resultArr); } else { @@ -1129,7 +1155,7 @@ EOD; } $stringArr[] = "'" . $k . "' => " . ($is_var ? $v : "'{$v}'"); } - return implode(",", $stringArr); + return implode(", ", $stringArr); } protected function getItemArray($item, $field, $comment) @@ -1243,8 +1269,8 @@ EOD; $langField = mb_ucfirst($field); return << - -
+ +
{$content}
@@ -1270,11 +1296,11 @@ EOD; return << {$content} +
- {$previewcontainer} EOD; diff --git a/application/admin/command/Crud/stubs/add.stub b/application/admin/command/Crud/stubs/add.stub index 68d6de24138cf9d2f3b1aea801b6f07f6e54201b..d4bd212c2d3dec091b1a8d483707346159f26f73 100644 --- a/application/admin/command/Crud/stubs/add.stub +++ b/application/admin/command/Crud/stubs/add.stub @@ -1,9 +1,7 @@ -
- + {%addList%}