2017-07-02 40 views
0

我最近開始創建自己的模板GII,在這種情況下,CRUD。Yii2 GII:添加自動完成和類名代的自定義模板

現在我注意到,創建與GII模型,當你對錶有名稱的自動完成,並且這個選擇後,Model類名是自動生成的爲好。

如何實現這一行爲對我的CRUD的模板呢?我已經創建了我的模板的自定義CRUD生成:

namespace app\templates\gii\crud\custom; 

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

我有什麼要包括到:

  1. 包括自動完成選擇現有的模型類爲

  2. 創建CRUD操作
  3. 基於先前選擇的Model類自動生成SearchModel名稱(例如app \ model \ CategoryModel變爲app \ model \ CategorySearchModel)

回答

0

暫時無法包括髮電機本身自動完成後,我建立使用JavaScript的解決方法。

重要:此解決方案假定您使用的是警予先進的模板,並使用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); 
})