Skip to content

Commit

Permalink
Add crud generator
Browse files Browse the repository at this point in the history
  • Loading branch information
thecodeholic committed Feb 14, 2017
1 parent 4d92416 commit 9f9797e
Show file tree
Hide file tree
Showing 10 changed files with 657 additions and 0 deletions.
90 changes: 90 additions & 0 deletions generators/crud/Generator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php
/**
* @link http://www.omicronsoft.net/
* @copyright Copyright (c) 2017 Omicronsoft GSC
* @license http://www.omicronsoft.net/license/
*/

namespace omcrn\gii\generators\crud;
use omcrn\gii\helpers\Column;
use yii\behaviors\TimestampBehavior;

/**
*
* @inheritdoc
* @author Zura Sekhniashvili <[email protected]>
* @package omcrn\gii\generators\crud
*/
class Generator extends \yii\gii\generators\crud\Generator
{
public $possibleCreatedAtAttributes = ['create_date', 'created_at'];
public $possibleUpdatedAtAttributes = ['update_date', 'updated_at'];

public function init()
{
$timestampBehavior = new TimestampBehavior();
if (!in_array($timestampBehavior->createdAtAttribute, $this->possibleCreatedAtAttributes)){
$this->possibleCreatedAtAttributes[] = $timestampBehavior->createdAtAttribute;
}
if (!in_array($timestampBehavior->updatedAtAttribute, $this->possibleUpdatedAtAttributes)){
$this->possibleUpdatedAtAttributes[] = $timestampBehavior->updatedAtAttribute;
}
parent::init();
}

/**
*
*
* @author Zura Sekhniashvili <[email protected]>
* @return \yii\db\ColumnSchema[]
*/
public function getColumns()
{
return $this->tableSchema->columns;
}

public function getColumnsForGeneration()
{
$columns = [];
$table = $this->getTableSchema();
foreach ($this->getColumns() as $attribute => $column) {
// \centigen\base\helpers\UtilHelper::vardump($column);
if ((in_array($attribute, $this->possibleCreatedAtAttributes) || in_array($attribute, $this->possibleUpdatedAtAttributes))
&& Column::isUnixTimestampColumn($table, $attribute)){
continue;
}
$columns[$attribute] = $column;
}
return $columns;
}

public function generateActiveField($attribute)
{
$tableSchema = $this->getTableSchema();
if ($tableSchema && isset($tableSchema->columns[$attribute])){
$column = $tableSchema->columns[$attribute];
if ($column->type === 'datetime' || $column->type === 'timestamp'){
return "\$form->field(\$model, '$attribute')->widget('trntv\yii\datetime\DateTimeWidget', [
'momentDatetimeFormat' => Yii::\$app->formatter->getMomentDatetimeFormat() ?: 'yyyy-MM-dd\'T\'HH:mm:ssZZZZZ',
]) ";
} else if (in_array($attribute, ['status', 'is_active'])){
return "\$form->field(\$model, '$attribute')->checkbox()";
}
}
return parent::generateActiveField($attribute);
}

/**
* @inheritdoc
*/
public function generateColumnFormat($columnSchema)
{
if ($columnSchema->type === 'datetime' || $columnSchema->type === 'timestamp' ||
((in_array($columnSchema->name, $this->possibleCreatedAtAttributes) || in_array($columnSchema->name, $this->possibleUpdatedAtAttributes))
&& Column::isUnixTimestampColumn($columnSchema))){
return 'datetime';
}
return parent::generateColumnFormat($columnSchema);
}

}
176 changes: 176 additions & 0 deletions generators/crud/default/controller.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
<?php
/**
* This is the template for generating a CRUD controller class file.
*/

use yii\db\ActiveRecordInterface;
use yii\helpers\StringHelper;


/* @var $this yii\web\View */
/* @var $generator yii\gii\generators\crud\Generator */

$controllerClass = StringHelper::basename($generator->controllerClass);
$modelClass = StringHelper::basename($generator->modelClass);
$searchModelClass = StringHelper::basename($generator->searchModelClass);
if ($modelClass === $searchModelClass) {
$searchModelAlias = $searchModelClass . 'Search';
}

/* @var $class ActiveRecordInterface */
$class = $generator->modelClass;
$pks = $class::primaryKey();
$urlParams = $generator->generateUrlParams();
$actionParams = $generator->generateActionParams();
$actionParamComments = $generator->generateActionParamComments();

echo "<?php\n";
?>

namespace <?= StringHelper::dirname(ltrim($generator->controllerClass, '\\')) ?>;

use Yii;
use <?= ltrim($generator->modelClass, '\\') ?>;
<?php if (!empty($generator->searchModelClass)): ?>
use <?= ltrim($generator->searchModelClass, '\\') . (isset($searchModelAlias) ? " as $searchModelAlias" : "") ?>;
<?php else: ?>
use yii\data\ActiveDataProvider;
<?php endif; ?>
use <?= ltrim($generator->baseControllerClass, '\\') ?>;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

/**
* <?= $controllerClass ?> implements the CRUD actions for <?= $modelClass ?> model.
*/
class <?= $controllerClass ?> extends <?= StringHelper::basename($generator->baseControllerClass) . "\n" ?>
{
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
];
}

/**
* Lists all <?= $modelClass ?> models.
* @return mixed
*/
public function actionIndex()
{
<?php if (!empty($generator->searchModelClass)): ?>
$searchModel = new <?= isset($searchModelAlias) ? $searchModelAlias : $searchModelClass ?>();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
<?php else: ?>
$dataProvider = new ActiveDataProvider([
'query' => <?= $modelClass ?>::find(),
]);

return $this->render('index', [
'dataProvider' => $dataProvider,
]);
<?php endif; ?>
}

/**
* Displays a single <?= $modelClass ?> model.
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
* @return mixed
*/
public function actionView(<?= $actionParams ?>)
{
return $this->render('view', [
'model' => $this->findModel(<?= $actionParams ?>),
]);
}

/**
* Creates a new <?= $modelClass ?> model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$model = new <?= $modelClass ?>();

if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', <?= $urlParams ?>]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}

/**
* Updates an existing <?= $modelClass ?> model.
* If update is successful, the browser will be redirected to the 'view' page.
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
* @return mixed
*/
public function actionUpdate(<?= $actionParams ?>)
{
$model = $this->findModel(<?= $actionParams ?>);

if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', <?= $urlParams ?>]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}

/**
* Deletes an existing <?= $modelClass ?> model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
* @return mixed
*/
public function actionDelete(<?= $actionParams ?>)
{
$this->findModel(<?= $actionParams ?>)->delete();

return $this->redirect(['index']);
}

/**
* Finds the <?= $modelClass ?> model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* <?= implode("\n * ", $actionParamComments) . "\n" ?>
* @return <?= $modelClass ?> the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel(<?= $actionParams ?>)
{
<?php
if (count($pks) === 1) {
$condition = '$id';
} else {
$condition = [];
foreach ($pks as $pk) {
$condition[] = "'$pk' => \$$pk";
}
$condition = '[' . implode(', ', $condition) . ']';
}
?>
if (($model = <?= $modelClass ?>::findOne(<?= $condition ?>)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
87 changes: 87 additions & 0 deletions generators/crud/default/search.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php
/**
* This is the template for generating CRUD search class of the specified model.
*/

use yii\helpers\StringHelper;


/* @var $this yii\web\View */
/* @var $generator yii\gii\generators\crud\Generator */

$modelClass = StringHelper::basename($generator->modelClass);
$searchModelClass = StringHelper::basename($generator->searchModelClass);
if ($modelClass === $searchModelClass) {
$modelAlias = $modelClass . 'Model';
}
$rules = $generator->generateSearchRules();
$labels = $generator->generateSearchLabels();
$searchAttributes = $generator->getSearchAttributes();
$searchConditions = $generator->generateSearchConditions();

echo "<?php\n";
?>

namespace <?= StringHelper::dirname(ltrim($generator->searchModelClass, '\\')) ?>;

use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use <?= ltrim($generator->modelClass, '\\') . (isset($modelAlias) ? " as $modelAlias" : "") ?>;

/**
* <?= $searchModelClass ?> represents the model behind the search form about `<?= $generator->modelClass ?>`.
*/
class <?= $searchModelClass ?> extends <?= isset($modelAlias) ? $modelAlias : $modelClass ?>

{
/**
* @inheritdoc
*/
public function rules()
{
return [
<?= implode(",\n ", $rules) ?>,
];
}

/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}

/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params)
{
$query = <?= isset($modelAlias) ? $modelAlias : $modelClass ?>::find();

// add conditions that should always apply here

$dataProvider = new ActiveDataProvider([
'query' => $query,
]);

$this->load($params);

if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}

// grid filtering conditions
<?= implode("\n ", $searchConditions) ?>

return $dataProvider;
}
}
Loading

0 comments on commit 9f9797e

Please sign in to comment.