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 @@
-