You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					437 lines
				
				12 KiB
			
		
		
			
		
	
	
					437 lines
				
				12 KiB
			| 
											12 years ago
										 | <?php
 | ||
|  | /**
 | ||
|  |  * @link http://www.yiiframework.com/
 | ||
|  |  * @copyright Copyright (c) 2008 Yii Software LLC
 | ||
|  |  * @license http://www.yiiframework.com/license/
 | ||
|  |  */
 | ||
|  | 
 | ||
|  | namespace yii\gii\generators\crud;
 | ||
|  | 
 | ||
| 
											12 years ago
										 | use Yii;
 | ||
| 
											12 years ago
										 | use yii\db\ActiveRecord;
 | ||
| 
											12 years ago
										 | use yii\db\BaseActiveRecord;
 | ||
| 
											12 years ago
										 | use yii\db\Schema;
 | ||
| 
											12 years ago
										 | use yii\gii\CodeFile;
 | ||
| 
											12 years ago
										 | use yii\helpers\Inflector;
 | ||
| 
											12 years ago
										 | use yii\web\Controller;
 | ||
|  | 
 | ||
| 
											12 years ago
										 | /**
 | ||
|  |  *
 | ||
|  |  * @author Qiang Xue <qiang.xue@gmail.com>
 | ||
|  |  * @since 2.0
 | ||
|  |  */
 | ||
|  | class Generator extends \yii\gii\Generator
 | ||
|  | {
 | ||
| 
											12 years ago
										 | 	public $modelClass;
 | ||
| 
											12 years ago
										 | 	public $moduleID;
 | ||
|  | 	public $controllerClass;
 | ||
| 
											12 years ago
										 | 	public $baseControllerClass = 'yii\web\Controller';
 | ||
| 
											12 years ago
										 | 	public $indexWidgetType = 'grid';
 | ||
|  | 	public $searchModelClass;
 | ||
| 
											12 years ago
										 | 
 | ||
| 
											12 years ago
										 | 	public function getName()
 | ||
|  | 	{
 | ||
|  | 		return 'CRUD Generator';
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	public function getDescription()
 | ||
|  | 	{
 | ||
|  | 		return 'This generator generates a controller and views that implement CRUD (Create, Read, Update, Delete)
 | ||
|  | 			operations for the specified data model.';
 | ||
|  | 	}
 | ||
| 
											12 years ago
										 | 
 | ||
| 
											12 years ago
										 | 	public function rules()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return array_merge(parent::rules(), [
 | ||
| 
											12 years ago
										 | 			[['moduleID', 'controllerClass', 'modelClass', 'searchModelClass', 'baseControllerClass'], 'filter', 'filter' => 'trim'],
 | ||
|  | 			[['modelClass', 'searchModelClass', 'controllerClass', 'baseControllerClass', 'indexWidgetType'], 'required'],
 | ||
|  | 			[['searchModelClass'], 'compare', 'compareAttribute' => 'modelClass', 'operator' => '!==', 'message' => 'Search Model Class must not be equal to Model Class.'],
 | ||
|  | 			[['modelClass', 'controllerClass', 'baseControllerClass', 'searchModelClass'], 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
 | ||
| 
											12 years ago
										 | 			[['modelClass'], 'validateClass', 'params' => ['extends' => BaseActiveRecord::className()]],
 | ||
| 
											12 years ago
										 | 			[['baseControllerClass'], 'validateClass', 'params' => ['extends' => Controller::className()]],
 | ||
|  | 			[['controllerClass'], 'match', 'pattern' => '/Controller$/', 'message' => 'Controller class name must be suffixed with "Controller".'],
 | ||
|  | 			[['controllerClass', 'searchModelClass'], 'validateNewClass'],
 | ||
|  | 			[['indexWidgetType'], 'in', 'range' => ['grid', 'list']],
 | ||
|  | 			[['modelClass'], 'validateModelClass'],
 | ||
|  | 			[['moduleID'], 'validateModuleID'],
 | ||
| 
											12 years ago
										 | 		]);
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	public function attributeLabels()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return array_merge(parent::attributeLabels(), [
 | ||
| 
											12 years ago
										 | 			'modelClass' => 'Model Class',
 | ||
| 
											12 years ago
										 | 			'moduleID' => 'Module ID',
 | ||
|  | 			'controllerClass' => 'Controller Class',
 | ||
| 
											12 years ago
										 | 			'baseControllerClass' => 'Base Controller Class',
 | ||
| 
											12 years ago
										 | 			'indexWidgetType' => 'Widget Used in Index Page',
 | ||
|  | 			'searchModelClass' => 'Search Model Class',
 | ||
| 
											12 years ago
										 | 		]);
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
| 
											12 years ago
										 | 	 * @inheritdoc
 | ||
| 
											12 years ago
										 | 	 */
 | ||
|  | 	public function hints()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return [
 | ||
| 
											12 years ago
										 | 			'modelClass' => 'This is the ActiveRecord class associated with the table that CRUD will be built upon.
 | ||
|  | 				You should provide a fully qualified class name, e.g., <code>app\models\Post</code>.',
 | ||
| 
											12 years ago
										 | 			'controllerClass' => 'This is the name of the controller class to be generated. You should
 | ||
|  | 				provide a fully qualified namespaced class, .e.g, <code>app\controllers\PostController</code>.',
 | ||
| 
											12 years ago
										 | 			'baseControllerClass' => 'This is the class that the new CRUD controller class will extend from.
 | ||
|  | 				You should provide a fully qualified class name, e.g., <code>yii\web\Controller</code>.',
 | ||
| 
											12 years ago
										 | 			'moduleID' => 'This is the ID of the module that the generated controller will belong to.
 | ||
|  | 				If not set, it means the controller will belong to the application.',
 | ||
| 
											12 years ago
										 | 			'indexWidgetType' => 'This is the widget type to be used in the index page to display list of the models.
 | ||
|  | 				You may choose either <code>GridView</code> or <code>ListView</code>',
 | ||
| 
											12 years ago
										 | 			'searchModelClass' => 'This is the class representing the data being collected in the search form.
 | ||
| 
											12 years ago
										 | 			 	A fully qualified namespaced class name is required, e.g., <code>app\models\search\PostSearch</code>.',
 | ||
| 
											12 years ago
										 | 		];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	public function requiredTemplates()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return ['controller.php'];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
| 
											12 years ago
										 | 	 * @inheritdoc
 | ||
| 
											12 years ago
										 | 	 */
 | ||
|  | 	public function stickyAttributes()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return ['baseControllerClass', 'moduleID', 'indexWidgetType'];
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	public function validateModelClass()
 | ||
|  | 	{
 | ||
|  | 		/** @var ActiveRecord $class */
 | ||
|  | 		$class = $this->modelClass;
 | ||
|  | 		$pk = $class::primaryKey();
 | ||
|  | 		if (empty($pk)) {
 | ||
|  | 			$this->addError('modelClass', "The table associated with $class must have primary key(s).");
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	public function validateModuleID()
 | ||
|  | 	{
 | ||
|  | 		if (!empty($this->moduleID)) {
 | ||
|  | 			$module = Yii::$app->getModule($this->moduleID);
 | ||
|  | 			if ($module === null) {
 | ||
|  | 				$this->addError('moduleID', "Module '{$this->moduleID}' does not exist.");
 | ||
|  | 			}
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 	/**
 | ||
| 
											12 years ago
										 | 	 * @inheritdoc
 | ||
| 
											12 years ago
										 | 	 */
 | ||
|  | 	public function generate()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		$controllerFile = Yii::getAlias('@' . str_replace('\\', '/', ltrim($this->controllerClass, '\\')) . '.php');
 | ||
|  | 		$searchModel = Yii::getAlias('@' . str_replace('\\', '/', ltrim($this->searchModelClass, '\\') . '.php'));
 | ||
| 
											12 years ago
										 | 		$files = [
 | ||
| 
											12 years ago
										 | 			new CodeFile($controllerFile, $this->render('controller.php')),
 | ||
|  | 			new CodeFile($searchModel, $this->render('search.php')),
 | ||
| 
											12 years ago
										 | 		];
 | ||
| 
											12 years ago
										 | 
 | ||
| 
											12 years ago
										 | 		$viewPath = $this->getViewPath();
 | ||
| 
											12 years ago
										 | 		$templatePath = $this->getTemplatePath() . '/views';
 | ||
|  | 		foreach (scandir($templatePath) as $file) {
 | ||
|  | 			if (is_file($templatePath . '/' . $file) && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
 | ||
|  | 				$files[] = new CodeFile("$viewPath/$file", $this->render("views/$file"));
 | ||
| 
											12 years ago
										 | 			}
 | ||
|  | 		}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 
 | ||
| 
											12 years ago
										 | 		return $files;
 | ||
| 
											12 years ago
										 | 	}
 | ||
| 
											12 years ago
										 | 
 | ||
|  | 	/**
 | ||
|  | 	 * @return string the controller ID (without the module ID prefix)
 | ||
|  | 	 */
 | ||
|  | 	public function getControllerID()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		$pos = strrpos($this->controllerClass, '\\');
 | ||
|  | 		$class = substr(substr($this->controllerClass, $pos + 1), 0, -10);
 | ||
|  | 		return Inflector::camel2id($class);
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * @return string the action view file path
 | ||
|  | 	 */
 | ||
|  | 	public function getViewPath()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		$module = empty($this->moduleID) ? Yii::$app : Yii::$app->getModule($this->moduleID);
 | ||
| 
											12 years ago
										 | 		return $module->getViewPath() . '/' . $this->getControllerID() ;
 | ||
|  | 	}
 | ||
| 
											12 years ago
										 | 
 | ||
|  | 	public function getNameAttribute()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		foreach ($this->getColumnNames() as $name) {
 | ||
| 
											12 years ago
										 | 			if (!strcasecmp($name, 'name') || !strcasecmp($name, 'title')) {
 | ||
|  | 				return $name;
 | ||
|  | 			}
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 		/** @var \yii\db\ActiveRecord $class */
 | ||
|  | 		$class = $this->modelClass;
 | ||
| 
											12 years ago
										 | 		$pk = $class::primaryKey();
 | ||
|  | 		return $pk[0];
 | ||
|  | 	}
 | ||
| 
											12 years ago
										 | 
 | ||
|  | 	/**
 | ||
|  | 	 * @param string $attribute
 | ||
|  | 	 * @return string
 | ||
|  | 	 */
 | ||
| 
											12 years ago
										 | 	public function generateActiveField($attribute)
 | ||
| 
											12 years ago
										 | 	{
 | ||
| 
											12 years ago
										 | 		$tableSchema = $this->getTableSchema();
 | ||
| 
											12 years ago
										 | 		if ($tableSchema === false || !isset($tableSchema->columns[$attribute])) {
 | ||
|  | 			if (preg_match('/^(password|pass|passwd|passcode)$/i', $attribute)) {
 | ||
|  | 				return "\$form->field(\$model, '$attribute')->passwordInput();";
 | ||
|  | 			} else {
 | ||
|  | 				return "\$form->field(\$model, '$attribute');";
 | ||
|  | 			}
 | ||
| 
											12 years ago
										 | 		}
 | ||
|  | 		$column = $tableSchema->columns[$attribute];
 | ||
|  | 		if ($column->phpType === 'boolean') {
 | ||
| 
											12 years ago
										 | 			return "\$form->field(\$model, '$attribute')->checkbox()";
 | ||
| 
											12 years ago
										 | 		} elseif ($column->type === 'text') {
 | ||
| 
											12 years ago
										 | 			return "\$form->field(\$model, '$attribute')->textarea(['rows' => 6])";
 | ||
| 
											12 years ago
										 | 		} else {
 | ||
|  | 			if (preg_match('/^(password|pass|passwd|passcode)$/i', $column->name)) {
 | ||
|  | 				$input = 'passwordInput';
 | ||
|  | 			} else {
 | ||
|  | 				$input = 'textInput';
 | ||
|  | 			}
 | ||
|  | 			if ($column->phpType !== 'string' || $column->size === null) {
 | ||
| 
											12 years ago
										 | 				return "\$form->field(\$model, '$attribute')->$input()";
 | ||
| 
											12 years ago
										 | 			} else {
 | ||
| 
											12 years ago
										 | 				return "\$form->field(\$model, '$attribute')->$input(['maxlength' => $column->size])";
 | ||
| 
											12 years ago
										 | 			}
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
| 
											12 years ago
										 | 	 * @param string $attribute
 | ||
|  | 	 * @return string
 | ||
|  | 	 */
 | ||
|  | 	public function generateActiveSearchField($attribute)
 | ||
|  | 	{
 | ||
|  | 		$tableSchema = $this->getTableSchema();
 | ||
| 
											12 years ago
										 | 		if ($tableSchema === false) {
 | ||
|  | 			return "\$form->field(\$model, '$attribute')";
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 		$column = $tableSchema->columns[$attribute];
 | ||
|  | 		if ($column->phpType === 'boolean') {
 | ||
| 
											12 years ago
										 | 			return "\$form->field(\$model, '$attribute')->checkbox()";
 | ||
| 
											12 years ago
										 | 		} else {
 | ||
| 
											12 years ago
										 | 			return "\$form->field(\$model, '$attribute')";
 | ||
| 
											12 years ago
										 | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
| 
											12 years ago
										 | 	 * @param \yii\db\ColumnSchema $column
 | ||
|  | 	 * @return string
 | ||
|  | 	 */
 | ||
|  | 	public function generateColumnFormat($column)
 | ||
|  | 	{
 | ||
|  | 		if ($column->phpType === 'boolean') {
 | ||
|  | 			return 'boolean';
 | ||
|  | 		} elseif ($column->type === 'text') {
 | ||
|  | 			return 'ntext';
 | ||
|  | 		} elseif (stripos($column->name, 'time') !== false && $column->phpType === 'integer') {
 | ||
|  | 			return 'datetime';
 | ||
|  | 		} elseif (stripos($column->name, 'email') !== false) {
 | ||
|  | 			return 'email';
 | ||
|  | 		} elseif (stripos($column->name, 'url') !== false) {
 | ||
|  | 			return 'url';
 | ||
|  | 		} else {
 | ||
|  | 			return 'text';
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
| 
											12 years ago
										 | 
 | ||
|  | 	/**
 | ||
|  | 	 * Generates validation rules for the search model.
 | ||
|  | 	 * @return array the generated validation rules
 | ||
|  | 	 */
 | ||
|  | 	public function generateSearchRules()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		if (($table = $this->getTableSchema()) === false) {
 | ||
|  | 			return ["[['" . implode("', '", $this->getColumnNames()) . "'], 'safe']"];
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 		$types = [];
 | ||
| 
											12 years ago
										 | 		foreach ($table->columns as $column) {
 | ||
|  | 			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 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:
 | ||
|  | 				default:
 | ||
|  | 					$types['safe'][] = $column->name;
 | ||
|  | 					break;
 | ||
|  | 			}
 | ||
|  | 		}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | 		$rules = [];
 | ||
| 
											12 years ago
										 | 		foreach ($types as $type => $columns) {
 | ||
| 
											12 years ago
										 | 			$rules[] = "[['" . implode("', '", $columns) . "'], '$type']";
 | ||
| 
											12 years ago
										 | 		}
 | ||
|  | 
 | ||
|  | 		return $rules;
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	public function getSearchAttributes()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		return $this->getColumnNames();
 | ||
| 
											12 years ago
										 | 	}
 | ||
|  | 
 | ||
|  | 	/**
 | ||
|  | 	 * Generates the attribute labels for the search model.
 | ||
|  | 	 * @return array the generated attribute labels (name => label)
 | ||
|  | 	 */
 | ||
|  | 	public function generateSearchLabels()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		$labels = [];
 | ||
| 
											12 years ago
										 | 		foreach ($this->getColumnNames() as $name) {
 | ||
|  | 			if (!strcasecmp($name, 'id')) {
 | ||
|  | 				$labels[$name] = 'ID';
 | ||
| 
											12 years ago
										 | 			} else {
 | ||
| 
											12 years ago
										 | 				$label = Inflector::camel2words($name);
 | ||
| 
											12 years ago
										 | 				if (strcasecmp(substr($label, -3), ' id') === 0) {
 | ||
|  | 					$label = substr($label, 0, -3) . ' ID';
 | ||
|  | 				}
 | ||
| 
											12 years ago
										 | 				$labels[$name] = $label;
 | ||
| 
											12 years ago
										 | 			}
 | ||
|  | 		}
 | ||
|  | 		return $labels;
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	public function generateSearchConditions()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		$columns = [];
 | ||
|  | 		if (($table = $this->getTableSchema()) === false) {
 | ||
|  | 			$class = $this->modelClass;
 | ||
|  | 			$model = new $class();
 | ||
|  | 			foreach ($model->attributes() as $attribute) {
 | ||
|  | 				$columns[$attribute] = 'unknown';
 | ||
|  | 			}
 | ||
|  | 		} else {
 | ||
|  | 			foreach ($table->columns as $column) {
 | ||
|  | 				$columns[$column->name] = $column->type;
 | ||
|  | 			}
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 		$conditions = [];
 | ||
| 
											12 years ago
										 | 		foreach ($columns as $column => $type) {
 | ||
|  | 			switch ($type) {
 | ||
| 
											12 years ago
										 | 				case Schema::TYPE_SMALLINT:
 | ||
|  | 				case Schema::TYPE_INTEGER:
 | ||
|  | 				case Schema::TYPE_BIGINT:
 | ||
|  | 				case Schema::TYPE_BOOLEAN:
 | ||
|  | 				case Schema::TYPE_FLOAT:
 | ||
|  | 				case Schema::TYPE_DECIMAL:
 | ||
|  | 				case Schema::TYPE_MONEY:
 | ||
|  | 				case Schema::TYPE_DATE:
 | ||
|  | 				case Schema::TYPE_TIME:
 | ||
|  | 				case Schema::TYPE_DATETIME:
 | ||
|  | 				case Schema::TYPE_TIMESTAMP:
 | ||
| 
											12 years ago
										 | 					$conditions[] = "\$this->addCondition(\$query, '{$column}');";
 | ||
| 
											12 years ago
										 | 					break;
 | ||
|  | 				default:
 | ||
| 
											12 years ago
										 | 					$conditions[] = "\$this->addCondition(\$query, '{$column}', true);";
 | ||
| 
											12 years ago
										 | 					break;
 | ||
|  | 			}
 | ||
|  | 		}
 | ||
|  | 
 | ||
|  | 		return $conditions;
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	public function generateUrlParams()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		/** @var ActiveRecord $class */
 | ||
|  | 		$class = $this->modelClass;
 | ||
|  | 		$pks = $class::primaryKey();
 | ||
| 
											12 years ago
										 | 		if (count($pks) === 1) {
 | ||
|  | 			return "'id' => \$model->{$pks[0]}";
 | ||
|  | 		} else {
 | ||
| 
											12 years ago
										 | 			$params = [];
 | ||
| 
											12 years ago
										 | 			foreach ($pks as $pk) {
 | ||
|  | 				$params[] = "'$pk' => \$model->$pk";
 | ||
|  | 			}
 | ||
|  | 			return implode(', ', $params);
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	public function generateActionParams()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		/** @var ActiveRecord $class */
 | ||
|  | 		$class = $this->modelClass;
 | ||
|  | 		$pks = $class::primaryKey();
 | ||
| 
											12 years ago
										 | 		if (count($pks) === 1) {
 | ||
|  | 			return '$id';
 | ||
|  | 		} else {
 | ||
|  | 			return '$' . implode(', $', $pks);
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	public function generateActionParamComments()
 | ||
|  | 	{
 | ||
| 
											12 years ago
										 | 		/** @var ActiveRecord $class */
 | ||
|  | 		$class = $this->modelClass;
 | ||
|  | 		$pks = $class::primaryKey();
 | ||
| 
											12 years ago
										 | 		if (($table = $this->getTableSchema()) === false) {
 | ||
|  | 			$params = [];
 | ||
|  | 			foreach ($pks as $pk) {
 | ||
|  | 				$params[] = '@param ' . (substr(strtolower($pk), -2) == 'id' ? 'integer' : 'string') . ' $' . $pk;
 | ||
|  | 			}
 | ||
|  | 			return $params;
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 		if (count($pks) === 1) {
 | ||
| 
											12 years ago
										 | 			return ['@param ' . $table->columns[$pks[0]]->phpType . ' $id'];
 | ||
| 
											12 years ago
										 | 		} else {
 | ||
| 
											12 years ago
										 | 			$params = [];
 | ||
| 
											12 years ago
										 | 			foreach ($pks as $pk) {
 | ||
|  | 				$params[] = '@param ' . $table->columns[$pk]->phpType . ' $' . $pk;
 | ||
|  | 			}
 | ||
|  | 			return $params;
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
|  | 	public function getTableSchema()
 | ||
|  | 	{
 | ||
|  | 		/** @var ActiveRecord $class */
 | ||
|  | 		$class = $this->modelClass;
 | ||
| 
											12 years ago
										 | 		if (is_subclass_of($class, 'yii\db\ActiveRecord')) {
 | ||
|  | 			return $class::getTableSchema();
 | ||
|  | 		} else {
 | ||
|  | 			return false;
 | ||
|  | 		}
 | ||
| 
											12 years ago
										 | 	}
 | ||
| 
											12 years ago
										 | 
 | ||
|  | 	public function getColumnNames()
 | ||
|  | 	{
 | ||
|  | 		/** @var ActiveRecord $class */
 | ||
|  | 		$class = $this->modelClass;
 | ||
|  | 		if (is_subclass_of($class, 'yii\db\ActiveRecord')) {
 | ||
|  | 			return $class::getTableSchema()->getColumnNames();
 | ||
|  | 		} else {
 | ||
|  | 			$model = new $class();
 | ||
|  | 			return $model->attributes();
 | ||
|  | 		}
 | ||
|  | 	}
 | ||
|  | 
 | ||
| 
											12 years ago
										 | }
 |