123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?php
- namespace gii\generators\model;
- use ReflectionClass;
- use yii\base\NotSupportedException;
- use yii\db\Schema;
- class Generator extends \yii\gii\generators\model\Generator
- {
- public $skipRuleColumns = ['created_at', 'updated_at'];
- /**
- * Generates validation rules for the specified table.
- * @param \yii\db\TableSchema $table the table schema
- * @return array the generated validation rules
- */
- public function generateRules($table)
- {
- $types = [];
- $lengths = [];
- foreach ($table->columns as $column) {
- if ($column->autoIncrement || in_array($column->name, $this->skipRuleColumns)) {
- continue;
- }
- if (!$column->allowNull && $column->defaultValue === null) {
- $types['required'][] = $column->name;
- }
- switch ($column->type) {
- case Schema::TYPE_SMALLINT:
- case Schema::TYPE_INTEGER:
- case Schema::TYPE_BIGINT:
- $types['integer'][] = $column->name;
- break;
- case Schema::TYPE_BOOLEAN:
- $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_DECIMAL:
- case Schema::TYPE_MONEY:
- $types['number'][] = $column->name;
- break;
- case Schema::TYPE_DATE:
- case Schema::TYPE_TIME:
- case Schema::TYPE_DATETIME:
- case Schema::TYPE_TIMESTAMP:
- $types['safe'][] = $column->name;
- break;
- default: // strings
- if ($column->size > 0) {
- $lengths[$column->size][] = $column->name;
- } else {
- $types['string'][] = $column->name;
- }
- }
- }
- $rules = [];
- foreach ($types as $type => $columns) {
- $rules[] = "[['" . implode("', '", $columns) . "'], '$type']";
- }
- foreach ($lengths as $length => $columns) {
- $rules[] = "[['" . implode("', '", $columns) . "'], 'string', 'max' => $length]";
- }
- $db = $this->getDbConnection();
- // Unique indexes rules
- try {
- $uniqueIndexes = $db->getSchema()->findUniqueIndexes($table);
- foreach ($uniqueIndexes as $uniqueColumns) {
- // Avoid validating auto incremental columns
- if (!$this->isColumnAutoIncremental($table, $uniqueColumns)) {
- $attributesCount = count($uniqueColumns);
- if ($attributesCount === 1) {
- $rules[] = "[['" . $uniqueColumns[0] . "'], 'unique']";
- } elseif ($attributesCount > 1) {
- $labels = array_intersect_key($this->generateLabels($table), array_flip($uniqueColumns));
- $lastLabel = array_pop($labels);
- $columnsList = implode("', '", $uniqueColumns);
- $rules[] = "[['$columnsList'], 'unique', 'targetAttribute' => ['$columnsList'], 'message' => 'The combination of " . implode(', ', $labels) . " and $lastLabel has already been taken.']";
- }
- }
- }
- } catch (NotSupportedException $e) {
- // doesn't support unique indexes information...do nothing
- }
- // Exist rules for foreign keys
- 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;
- }
- $refClassName = $this->generateClassName($refTable);
- unset($refs[0]);
- $attributes = implode("', '", array_keys($refs));
- $targetAttributes = [];
- foreach ($refs as $key => $value) {
- $targetAttributes[] = "'$key' => '$value'";
- }
- $targetAttributes = implode(', ', $targetAttributes);
- $rules[] = "[['$attributes'], 'exist', 'skipOnError' => true, 'targetClass' => $refClassName::className(), 'targetAttribute' => [$targetAttributes]]";
- }
- return $rules;
- }
- public function formView()
- {
- $class = new ReflectionClass(get_parent_class());
- return dirname($class->getFileName()) . '/form.php';
- }
- }
|