在生成器本身无法包含自动完成功能后,我使用 Javascript 构建了一个解决方法。
重要提示:此解决方案假设您使用的是 yii 高级模板,并且正在使用来自后端应用程序的 Gii。如果不是这种情况,您将需要调整代码
首先,我将我的 JS 脚本包含在 gii/templates/crud/form.php 中,请注意,此目标可能与您的不同,具体取决于您设置 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);
})