Yii2 Gii:将自动填充和类名生成添加到自定义模板

时间:2017-07-02 12:07:36

标签: php yii yii2 gii

我最近开始创建自己的Gii模板,在这种情况下,用于CRUD。

现在我注意到,在使用Gii创建模型时,您有一个表名的自动完成功能,在选择此项后,还会自动生成Model类名。

如何为我的CRUD模板实现此行为?我已经为我的模板创建了一个自定义CRUD生成器:

namespace app\templates\gii\crud\custom;

class Generator extends \yii\gii\generators\crud\Generator
{
    // ...
}

我需要包括哪些内容:

  1. 包含自动填充以选择现有的Model类来为

  2. 创建CRUD操作
  3. 根据之前选择的Model类自动生成SearchModel名称(例如app \ model \ CategoryModel成为app \ model \ CategorySearchModel)

2 个答案:

答案 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);
})