我最近开始创建自己的Gii模板,在这种情况下,用于CRUD。
现在我注意到,在使用Gii创建模型时,您有一个表名的自动完成功能,在选择此项后,还会自动生成Model类名。
如何为我的CRUD模板实现此行为?我已经为我的模板创建了一个自定义CRUD生成器:
namespace app\templates\gii\crud\custom;
class Generator extends \yii\gii\generators\crud\Generator
{
// ...
}
我需要包括哪些内容:
包含自动填充以选择现有的Model类来为
根据之前选择的Model类自动生成SearchModel名称(例如app \ model \ CategoryModel成为app \ model \ CategorySearchModel)
答案 0 :(得分:0)
如果仅创建模板,则不需要扩展生成器。您可以使用相同的Gii生成器。只需要在配置中附加到gii你的模板。创建:https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/topics-creating-your-own-templates.md
中描述的模板答案 1 :(得分:0)
在无法在生成器本身中包含自动完成功能后,我使用Javascript构建了一个解决方法。
重要提示:此解决方案假设您使用的是yii高级模板,并且正在使用后端应用程序中的Gii。如果不是这种情况,则需要调整代码
首先,我在gii/templates/crud/form.php
中包含了我的JS脚本,请注意,此目的地可能与您的不同,具体取决于您设置Gii模板的位置。
\backend\assets\CrudAutocompleteAsset::register($this);
echo $form->field($generator, 'templateDestination')->dropDownList([
"backend" => "Backend",
"frontend" => "Frontend"
]);
您还需要将公共财产templateDestination
包含在Generator
课程中。如果您不使用高级模板,则此选项和选择字段都不是必需的。那你只需要资产。如果您不知道如何使用资产,请查看Yii2 guide about Assets
/**
* Destination namespace of generated code for advanced yii template
* @var string
*/
public $templateDestination = "backend";
资产CrudAutocompleteAsset
将刊登我的js文件。我做了sample on JS fiddle
$(document).ready(function () {
var templateDestinationSelect = $("select[name='Generator[templateDestination]']");
var modelClassInput = $("input[name='Generator[modelClass]']");
var searchModelClassInput = $("input[name='Generator[searchModelClass]']");
var controllerClassInput = $("input[name='Generator[controllerClass]']");
var viewPathInput = $("input[name='Generator[viewPath]']");
modelClassInput.change(function () {
var destination = templateDestinationSelect.val();
var modelClass = $(this).val();
var modelNs = modelClass.substr(0, modelClass.lastIndexOf("\\"));
var targetNs = destination + modelNs.substr(modelNs.indexOf("\\"));
var modelClassName = modelClass.substr(modelClass.lastIndexOf("\\") + 1);
var modelViewName = modelClassName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
var modelSearchClass = modelNs + "\\" + modelClassName + "Search";
searchModelClassInput.val(modelSearchClass);
var controllerClassName = targetNs.replace("models", "controllers") + "\\" + modelClassName + "Controller";
controllerClassInput.val(controllerClassName);
var viewPath = "@app/../" + destination + "views/" + modelViewName;
viewPathInput.val(viewPath);
})