【问题标题】:Yii2 Gii : Add autocomplete and class name generation to custom templateYii2 Gii:向自定义模板添加自动完成和类名生成
【发布时间】:2017-07-02 12:07:36
【问题描述】:

我最近开始为 CRUD 创建自己的 Gii 模板。

现在我注意到,在使用 Gii 创建模型时,您会自动完成表名,选择此选项后,模型类名称也会自动生成。

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

namespace app\templates\gii\crud\custom;

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

我必须包括什么:

  1. 包括自动完成功能以选择现有模型类来为其创建 CRUD 操作

  2. 根据之前选择的 Model 类自动生成 SearchModel 名称(如 app\model\CategoryModel 变为 app\model\CategorySearchModel)

【问题讨论】:

    标签: php yii yii2 gii


    【解决方案1】:

    如果只创建模板,则不需要扩展生成器。您可以使用相同的 Gii 生成器。只需要在配置中附加到 gii 你的模板。创建模板描述于:https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/topics-creating-your-own-templates.md

    【讨论】:

    • 不是我的问题,我已经有了模板和生成器。问题是如何将自动完成值添加到 Gii 的后端,因为这是由生成器构建的
    【解决方案2】:

    在生成器本身无法包含自动完成功能后,我使用 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);
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2016-09-15
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多