2017-07-02 14 views
0

私は最近、自分のGiiテンプレート(この場合はCRUD)の作成を開始しました。Yii2 Gii:カスタムテンプレートにオートコンプリートとクラス名の生成を追加する

Giiでモデルを作成するときに、テーブル名のオートコンプリートがあり、これを選択するとモデルクラス名も自動的に生成されます。

私のCRUDテンプレートにこの動作を実装するにはどうすればよいですか?私はすでに私のテンプレートのカスタムCRUDジェネレータを作成している:私はに含める必要があります

namespace app\templates\gii\crud\custom; 

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

何:

  1. のためにCRUD操作を作成するには、既存のモデルクラスを選択するために、オートコンプリートを含めます
  2. 以前に選択したモデルクラスに基づいてSearchModel名を自動的に生成します(app \ model \ CategoryModelはapp \ model \ CategorySearchModelになります)

答えて

0

自動生成機能自体に含まれていないため、私は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" 
]); 

また、あなたのGeneratorクラスにパブリックプロパティtemplateDestinationを含める必要があります。拡張テンプレートを使用しない場合は、これも選択フィールドも必要ありません。すると、アセットが必要になります。あなたは資産を使用する方法がわからない場合は、Yii2 guide about Assets

/** 
* Destination namespace of generated code for advanced yii template 
* @var string 
*/ 
public $templateDestination = "backend"; 

資産CrudAutocompleteAsset意志の広告私のjsファイルをチェックしてください。私は作った

$(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); 
}) 
0

テンプレートのみを作成する場合は、ジェネレータを拡張する必要はありません。同じGiiジェネレータを使うことができます。あなたのテンプレートへのconfigへのアタッチだけが必要です。テンプレートの作成については、https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/topics-creating-your-own-templates.md

+0

私の質問は、私はすでに私のテンプレートとジェネレータがあります。問題は、Giiのバックエンドにオートコンプリート値を追加する方法でした。これは、ジェネレータによって構築されるためです – StoryTeller

関連する問題