diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index b992b6ad4..db90da477 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,8 @@ + + ### What steps will reproduce the problem? ### What's expected? @@ -11,4 +16,5 @@ | ---------------- | --- | Yii version | | PHP version | +| Database version | | Operating system | diff --git a/CHANGELOG.md b/CHANGELOG.md index 44d7d108f..850b266ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,23 @@ Yii Framework 2 gii extension Change Log ======================================== -2.0.7 under development +2.0.8 under development ----------------------- +- Bug #379: Fixed bug in view page where delete button not work well (zacksleo) +- Bug #327: Fixed bug in Model generator when $baseClass is an abstract class (rhertogh) +- Enh #366: Option to allow standardized class names capitals in model generator (slinstj) +- Enh #378: Remove useless import of `Yii` from CRUD generator search model template (CeBe) + + +2.0.7 May 3, 2018 +----------------- + +- Bug #185: Fixed bug in Model generators when FKs pointing to non-existing tables (adipriyantobpn) +- Bug #328: Fixed bug in CRUD update view generator (ricpelo) - Bug #333: Fixed incorrect validation rule for TINYINT column type (nostop8) -- Bug #328: Fix bug in CRUD update view generator (ricpelo) +- Bug #340: Fixed bug in CRUD SearchModel generator (JeanWolf) +- Bug #351: Fixed incorrect validation rule for JSON column type (silverfire) 2.0.6 December 23, 2017 diff --git a/LICENSE.md b/LICENSE.md index e98f03df8..ee872b9ab 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,3 @@ -The Yii framework is free software. It is released under the terms of -the following BSD License. - Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) All rights reserved. diff --git a/composer.json b/composer.json index 7b45a9a49..d4475be28 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ ], "require": { "php": ">=5.5", - "yiisoft/yii2": "2.0.*", + "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap4": "1.0.x-dev", "phpspec/php-diff": ">=1.0.2", "bower-asset/typeahead.js": "0.10.* | ~0.11.0", @@ -48,6 +48,14 @@ "dev-master": "2.2.x-dev" } }, + "config": { + "fxp-asset": { + "installer-paths": { + "npm-asset-library": "vendor/npm", + "bower-asset-library": "vendor/bower" + } + } + }, "repositories": [ { "type": "composer", diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 2ddee0e31..cef186303 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -1,11 +1,11 @@ Yii 2 Gii エクステンション ========================== -このエクステンションは、Yii 2 アプリケーションのために、Gii と呼ばれるウェブベースのコードジェネレータを提供します。 +このエクステンションは、Yii 2 アプリケーションのために、Gii と呼ばれるウェブ・ベースのコード・ジェネレータを提供します。 Gii を使うと、モデル、フォーム、モジュール、CRUD などを素早く生成することが出来ます。 -Gii はウェブベースのインタフェイスを提供しており、あなたの望みのコードを対話的に生成することが出来ます。 -Gii は、また、ほとんどの時間はコンソールウィンドウで仕事をすることを好む人たちのために、コマンドラインのインタフェイスも提供しています。 +Gii はウェブ・ベースのインタフェイスを提供しており、あなたの望みのコードを対話的に生成することが出来ます。 +Gii は、また、ほとんどの時間はコンソール・ウィンドウで仕事をすることを好む人たちのために、コマンドラインのインタフェイスも提供しています。 始めよう diff --git a/docs/guide-ja/basic-usage.md b/docs/guide-ja/basic-usage.md index 3e5a30aa7..6b8f7460d 100644 --- a/docs/guide-ja/basic-usage.md +++ b/docs/guide-ja/basic-usage.md @@ -1,18 +1,18 @@ 基本的な使用方法 ================ -Gii にアクセスすると、最初に、ジェネレータを選択できるエントリページが開かれます。 +Gii にアクセスすると、最初に、ジェネレータを選択できるエントリ・ページが開かれます。 -![Gii エントリページ](images/gii-entry.png) +![Gii エントリ・ページ](images/gii-entry.png) デフォルトでは、以下のジェネレータを利用できます。 -- **モデルジェネレータ** - このジェネレータは、指定したデータベーステーブルの ActiveRecord クラスを生成します。 -- **CRUD ジェネレータ** - このジェネレータは、指定されたデータモデルの CRUD 操作 (作成・読み出し・更新・削除) を実装するコントローラとビューを生成します。 -- **コントローラジェネレータ** - このジェネレータは、新しいコントローラのクラスと、一つまたはいくつかのコントローラアクションおよびそれに対応するビューを迅速に生成するのを手助けしてくれます。 -- **フォームジェネレータ** - このジェネレータは、指定されたモデルクラスのための、入力を収集するフォームを表示するビュースクリプトを生成します。 -- **モジュールジェネレータ** - このジェネレータは、Yii のモジュールが必要とするコードのスケルトンを生成するのを手助けしてくれます。 -- **エクステンションジェネレータ** - このジェネレータは、Yii のエクステンションが必要とするファイルの生成を手助けしてくれます。 +- **モデルジェネレータ** - このジェネレータは、指定したデータベース・テーブルの ActiveRecord クラスを生成します。 +- **CRUD ジェネレータ** - このジェネレータは、指定されたデータ・モデルの CRUD 操作 (作成・読み出し・更新・削除) を実装するコントローラとビューを生成します。 +- **コントローラ・ジェネレータ** - このジェネレータは、新しいコントローラのクラスと、一つまたはいくつかのコントローラ・アクションおよびそれに対応するビューを迅速に生成するのを手助けしてくれます。 +- **フォーム・ジェネレータ** - このジェネレータは、指定されたモデル・クラスのための、入力を収集するフォームを表示するビュー・スクリプトを生成します。 +- **モジュール・ジェネレータ** - このジェネレータは、Yii のモジュールが必要とするコードのスケルトンを生成するのを手助けしてくれます。 +- **エクステンション・ジェネレータ** - このジェネレータは、Yii のエクステンションが必要とするファイルの生成を手助けしてくれます。 "Start" ボタンをクリックしてジェネレータを選択すると、ジェネレータのパラメータを構成するためのフォームが表示されます。 あなたの要求を満たすようにフォームに入力して "Preview" ボタンをクリックすると、Gii が生成しようとしているコードのプレビューが出来ます。 @@ -24,14 +24,14 @@ Gii にアクセスすると、最初に、ジェネレータを選択できる ファイルが既に存在する場合は、既存のコードと生成されるコードのどこが異なるかを示す差分ビューも提供されます。 その場合は、どのファイルを上書きし、どのファイルを上書きしないかを選択することも出来ます。 -> Tip: データベースに変更を加えた後で、モデルジェネレータを使ってモデルを更新したい場合は、Gii のプレビューからコードをコピーして、あなたのコードに変更をマージすることが出来ます。 +> Tip: データベースに変更を加えた後で、モデル・ジェネレータを使ってモデルを更新したい場合は、Gii のプレビューからコードをコピーして、あなたのコードに変更をマージすることが出来ます。 PHPStorm の [クリップボードと比較](http://www.jetbrains.com/phpstorm/webhelp/comparing-files.html) のような IDE の機能を使うと良いでしょう。 [Aptana Studio](http://www.aptana.com/products/studio3/download) や [Eclipse](http://www.eclipse.org/pdt/) ベースのエディタも [AnyEdit tools plugin](http://andrei.gmxhome.de/anyedit/) を使って [クリップボードと比較](http://andrei.gmxhome.de/anyedit/examples.html) をすることが出来ます。 この機能を使うと、関係のある変更だけを取り込んで、あなた自身のコードを取り消すような他の変更は放っておくことが出来ます。 コードをレビューして、生成すべきファイルを選択し、"Generate" ボタンをクリックするとファイルが生成されます。 すべてうまく行けば、これで終りです。 -Gii がファイルを生成できないというエラーが出た場合は、ウェブサーバがファイルを作成してディレクトリに書き込むことが出来るように、ディレクトリのアクセス権限を修正しなければなりません。 +Gii がファイルを生成できないというエラーが出た場合は、ウェブ・サーバがファイルを作成してディレクトリに書き込むことが出来るように、ディレクトリのアクセス権限を修正しなければなりません。 > Note: Gii によって生成されるコードは、あなたの要求に従って修正すべきテンプレートに過ぎません。 Gii は新しいものを素早く作成する手助けをするために存在するものですが、そのまま使用できるコードを作成するようなものではありません。 diff --git a/docs/guide-ja/installation.md b/docs/guide-ja/installation.md index bed30c5b8..7e9f941b6 100644 --- a/docs/guide-ja/installation.md +++ b/docs/guide-ja/installation.md @@ -46,7 +46,7 @@ http://localhost/path/to/index.php?r=gii http://localhost/path/to/index.php/gii ``` -> Note: ローカルホスト以外の IP から Gii にアクセスしようとすると、デフォルトでは、アクセスが拒否されます。 +> Note: ローカル・ホスト以外の IP から Gii にアクセスしようとすると、デフォルトでは、アクセスが拒否されます。 > このデフォルトを回避するためには、許可される IP アドレスを構成情報に追加してください。 > ```php @@ -56,16 +56,16 @@ http://localhost/path/to/index.php/gii ], ``` -コンソールアプリケーションの構成情報において同じように Gii を構成すると、次のようにして、コマンドウィンドウから Gii にアクセスすることが出来ます。 +コンソールアプリケーションの構成情報において同じように Gii を構成すると、次のようにして、コマンド・ウィンドウから Gii にアクセスすることが出来ます。 ``` -# パスをアプリケーションのベースパスに変更 +# パスをアプリケーションのベース・パスに変更 cd path/to/AppBasePath # Gii に関するヘルプ情報を表示 yii help gii -# Gii のモデルジェネレータに関するヘルプ情報を表示 +# Gii のモデル・ジェネレータに関するヘルプ情報を表示 yii help gii/model # city テーブルから City モデルを生成 @@ -73,9 +73,9 @@ yii gii/model --tableName=city --modelClass=City ``` -### ベーシックアプリケーション +### ベーシック・アプリケーション -ベーシックプロジェクトテンプレートの構成情報の構造は少し違っており、Gii は `config/web.php` の中で構成しなければなりません。 +ベーシック・プロジェクト・テンプレートの構成情報の構造は少し違っており、Gii は `config/web.php` の中で構成しなければなりません。 ```php // ... diff --git a/docs/guide-ja/topics-creating-your-own-generators.md b/docs/guide-ja/topics-creating-your-own-generators.md index 658cc8f1c..405427cdb 100644 --- a/docs/guide-ja/topics-creating-your-own-generators.md +++ b/docs/guide-ja/topics-creating-your-own-generators.md @@ -2,7 +2,7 @@ ================================== どれでもジェネレータのフォルダを開くと、`form.php` と `Generator.php` の二つのファイルがあります。 -一つ目はフォームで、二番目のものがジェネレータクラスです。 +一つ目はフォームで、二番目のものがジェネレータ・クラスです。 あなた自身のジェネレータを作成するためには、これらのクラスをどこかのフォルダで作成またはオーバーライドする必要があります。 ここでも、前の節でしたのと同じように、構成情報をカスタマイズします。 diff --git a/docs/guide-ja/topics-creating-your-own-templates.md b/docs/guide-ja/topics-creating-your-own-templates.md index ed2c9dc4d..c29ec85dd 100644 --- a/docs/guide-ja/topics-creating-your-own-templates.md +++ b/docs/guide-ja/topics-creating-your-own-templates.md @@ -46,7 +46,7 @@ if (YII_ENV_DEV) { 'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'], 'generators' => [ // ここ 'crud' => [ // ジェネレータの名前 - 'class' => 'yii\gii\generators\crud\Generator', // ジェネレータクラス + 'class' => 'yii\gii\generators\crud\Generator', // ジェネレータ・クラス 'templates' => [ //setting for out templates 'myCrud' => '@app/myTemplates/crud/default', // テンプレート名 => テンプレートへのパス ] diff --git a/src/CodeFile.php b/src/CodeFile.php index 909e4e7af..1a449cdc0 100644 --- a/src/CodeFile.php +++ b/src/CodeFile.php @@ -95,12 +95,12 @@ public function save() } if (@file_put_contents($this->path, $this->content) === false) { return "Unable to write the file '{$this->path}'."; - } else { - $mask = @umask(0); - @chmod($this->path, $module->newFileMode); - @umask($mask); } + $mask = @umask(0); + @chmod($this->path, $module->newFileMode); + @umask($mask); + return true; } @@ -111,9 +111,9 @@ public function getRelativePath() { if (strpos($this->path, Yii::$app->basePath) === 0) { return substr($this->path, strlen(Yii::$app->basePath) + 1); - } else { - return $this->path; } + + return $this->path; } /** @@ -123,9 +123,9 @@ public function getType() { if (($pos = strrpos($this->path, '.')) !== false) { return substr($this->path, $pos + 1); - } else { - return 'unknown'; } + + return 'unknown'; } /** @@ -145,9 +145,9 @@ public function preview() return highlight_string($this->content, true); } elseif (!in_array($type, ['jpg', 'gif', 'png', 'exe'])) { return nl2br(Html::encode($this->content)); - } else { - return false; } + + return false; } /** @@ -162,9 +162,9 @@ public function diff() return false; } elseif ($this->operation === self::OP_OVERWRITE) { return $this->renderDiff(file($this->path), $this->content); - } else { - return ''; } + + return ''; } /** diff --git a/src/Generator.php b/src/Generator.php index a0eedb9da..915e71bcf 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -296,9 +296,9 @@ public function getTemplatePath() { if (isset($this->templates[$this->template])) { return $this->templates[$this->template]; - } else { - throw new InvalidConfigException("Unknown template: {$this->template}"); } + + throw new InvalidConfigException("Unknown template: {$this->template}"); } /** diff --git a/src/console/GenerateController.php b/src/console/GenerateController.php index 4e6335c9b..64d1bdd22 100644 --- a/src/console/GenerateController.php +++ b/src/console/GenerateController.php @@ -143,10 +143,10 @@ public function getActionHelpSummary($action) { if ($action instanceof InlineAction) { return parent::getActionHelpSummary($action); - } else { - /** @var $action GenerateAction */ - return $action->generator->getName(); } + + /** @var $action GenerateAction */ + return $action->generator->getName(); } /** @@ -156,11 +156,12 @@ public function getActionHelp($action) { if ($action instanceof InlineAction) { return parent::getActionHelp($action); - } else { - /** @var $action GenerateAction */ - $description = $action->generator->getDescription(); - return wordwrap(preg_replace('/\s+/', ' ', $description)); } + + /** @var $action GenerateAction */ + $description = $action->generator->getDescription(); + + return wordwrap(preg_replace('/\s+/', ' ', $description)); } /** diff --git a/src/controllers/DefaultController.php b/src/controllers/DefaultController.php index ba904ef79..19dd92c11 100644 --- a/src/controllers/DefaultController.php +++ b/src/controllers/DefaultController.php @@ -81,9 +81,8 @@ public function actionPreview($id, $file) $content = $f->preview(); if ($content !== false) { return '
SOME_TABLE
or Other_Table
will have class names SomeTable
+ and OtherTable
, respectively. If not checked, the same tables will have class names SOMETABLE
+ and OtherTable
instead.',
'baseClass' => 'This is the base class of the new ActiveRecord class. It should be a fully qualified namespaced class name.',
'generateRelations' => 'This indicates whether the generator should generate relations based on
foreign key constraints it detects in the database. Note that if your database contains too many tables,
@@ -322,7 +329,7 @@ public function generateRules($table)
$types['boolean'][] = $column->name;
break;
case Schema::TYPE_FLOAT:
- case 'double': // Schema::TYPE_DOUBLE, which is available since Yii 2.0.3
+ case Schema::TYPE_DOUBLE:
case Schema::TYPE_DECIMAL:
case Schema::TYPE_MONEY:
$types['number'][] = $column->name;
@@ -331,6 +338,7 @@ public function generateRules($table)
case Schema::TYPE_TIME:
case Schema::TYPE_DATETIME:
case Schema::TYPE_TIMESTAMP:
+ case Schema::TYPE_JSON:
$types['safe'][] = $column->name;
break;
default: // strings
@@ -562,6 +570,10 @@ protected function addInverseRelations($relations)
foreach ($table->foreignKeys as $refs) {
$refTable = $refs[0];
$refTableSchema = $db->getTableSchema($refTable);
+ if ($refTableSchema === null) {
+ // Foreign key could point to non-existing table: https://github.com/yiisoft/yii2-gii/issues/34
+ continue;
+ }
unset($refs[0]);
$fks = array_keys($refs);
@@ -684,9 +696,23 @@ protected function generateRelationName($relations, $table, $key, $multiple)
/* @var $baseModel \yii\db\ActiveRecord */
if ($baseModel === null) {
$baseClass = $this->baseClass;
- $baseModel = new $baseClass();
+ $baseClassReflector = new \ReflectionClass($baseClass);
+ if ($baseClassReflector->isAbstract()) {
+ $baseClassWrapper =
+ 'namespace ' . __NAMESPACE__ . ';'.
+ 'class GiiBaseClassWrapper extends \\' . $baseClass . ' {' .
+ 'public static function tableName(){' .
+ 'return "' . addslashes($table->fullName) . '";' .
+ '}' .
+ '};' .
+ 'return new GiiBaseClassWrapper();';
+ $baseModel = eval($baseClassWrapper);
+ } else {
+ $baseModel = new $baseClass();
+ }
$baseModel->setAttributes([]);
}
+
if (!empty($key) && strcasecmp($key, 'id')) {
if (substr_compare($key, 'id', -2, 2, true) === 0) {
$key = rtrim(substr($key, 0, -2), '_');
@@ -875,7 +901,14 @@ protected function generateClassName($tableName, $useSchemaName = null)
}
}
- return $this->classNames[$fullTableName] = Inflector::id2camel($schemaName.$className, '_');
+ if ($this->standardizeCapitals) {
+ $schemaName = ctype_upper(preg_replace('/[_-]/', '', $schemaName)) ? strtolower($schemaName) : $schemaName;
+ $className = ctype_upper(preg_replace('/[_-]/', '', $className)) ? strtolower($className) : $className;
+ return $this->classNames[$fullTableName] = Inflector::camelize(Inflector::camel2words($schemaName.$className));
+ } else {
+ return $this->classNames[$fullTableName] = Inflector::id2camel($schemaName.$className, '_');
+ }
+
}
/**
diff --git a/src/generators/model/form.php b/src/generators/model/form.php
index 7c67e64fe..96a29f6a0 100644
--- a/src/generators/model/form.php
+++ b/src/generators/model/form.php
@@ -8,6 +8,7 @@
echo $form->field($generator, 'tableName')->textInput(['table_prefix' => $generator->getTablePrefix()]);
echo $form->field($generator, 'modelClass');
+echo $form->field($generator, 'standardizeCapitals')->checkbox();
echo $form->field($generator, 'ns');
echo $form->field($generator, 'baseClass');
echo $form->field($generator, 'db');
diff --git a/src/resource/gii.js b/src/resource/gii.js
index 532e28988..db8b91206 100644
--- a/src/resource/gii.js
+++ b/src/resource/gii.js
@@ -218,13 +218,15 @@ yii.gii = (function ($) {
initToggleActions();
initFilterRows();
- // model generator: hide class name inputs when table name input contains *
+ // model generator: hide class name inputs and show psr class name checkbox
+ // when table name input contains *
$('#model-generator #generator-tablename').change(function () {
var show = ($(this).val().indexOf('*') === -1);
$('.field-generator-modelclass').toggle(show);
if ($('#generator-generatequery').is(':checked')) {
$('.field-generator-queryclass').toggle(show);
}
+ $('.field-generator-caseinsensitive').toggle(!show);
}).change();
// model generator: translate table name to model class
diff --git a/src/views/layouts/main.php b/src/views/layouts/main.php
index c9f34a584..e380d03ee 100644
--- a/src/views/layouts/main.php
+++ b/src/views/layouts/main.php
@@ -16,7 +16,7 @@
- = Html::csrfMetaTags() ?>
+ registerCsrfMetaTags() ?>