PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/duhajo/protected/extensions/gtc/fullCrud/CodeProvider.php

https://bitbucket.org/duhajo/duhajoyii
PHP | 179 lines | 158 code | 13 blank | 8 comment | 20 complexity | 8b20f67ba3286ed1bbdaa14874eb6e0a MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause, LGPL-2.1
  1. <?php
  2. /**
  3. * Class to provide code snippets for CRUD generation
  4. */
  5. class CodeProvider
  6. {
  7. public function resolveController($relation)
  8. {
  9. $model = new $relation[1];
  10. $reflection = new ReflectionClass($model);
  11. $module = preg_match("/\/modules\/([a-zA-Z0-9]+)\//", $reflection->getFileName(), $matches);
  12. $modulePrefix = (isset($matches[$module])) ? "/" . $matches[$module] . "/" : "";
  13. $controller = $modulePrefix . strtolower(substr($relation[1], 0, 1)) . substr($relation[1], 1);
  14. return $controller;
  15. }
  16. public function generateRelationHeader($model, $relationName, $relationInfo)
  17. {
  18. $controller = $this->resolveController($relationInfo); // TODO
  19. $code = "";
  20. #$code .= "echo '<span class=label>" . $relationInfo[0] . "</span>';";
  21. $code .= "\$this->widget('bootstrap.widgets.TbButtonGroup', array(
  22. 'type'=>'', // '', 'primary', 'info', 'success', 'warning', 'danger' or 'inverse'
  23. 'buttons'=>array(
  24. array('label'=>'{$relationName}', 'icon'=>'icon-list-alt', 'url'=> array('{$controller}/admin')),
  25. array('icon'=>'icon-plus', 'url'=>array('" . $controller . "/create', '$relationInfo[1]' => array('$relationInfo[2]'=>\$model->{\$model->tableSchema->primaryKey}))),
  26. ),
  27. ));";
  28. return $code;
  29. }
  30. public function generateRelation($model, $relationName, $relationInfo)
  31. {
  32. if ($columns = CActiveRecord::model($relationInfo[1])->tableSchema->columns) {
  33. $suggestedfield = FullCrudCode::suggestName($columns);
  34. $field = current($columns);
  35. $style = $relationInfo[0] == 'CManyManyRelation' ? 'listbox' : 'dropdownlist';
  36. if (is_object($field)) {
  37. if ($relationInfo[0] == 'CManyManyRelation')
  38. $allowEmpty = 'false';
  39. elseif ($relationInfo[0] == 'CHasOneRelation') {
  40. $allowEmpty = (CActiveRecord::model($relationInfo[1])->tableSchema->columns[$relationInfo[2]]->allowNull ? 'true' : 'false');
  41. return "if (\$model->{$relationName} !== null) echo \$model->{$relationName}->{$suggestedfield};";
  42. }
  43. else
  44. $allowEmpty = (CActiveRecord::model($model)->tableSchema->columns[$relationInfo[2]]->allowNull ? 'true' : 'false');
  45. return("\$this->widget(
  46. 'Relation',
  47. array(
  48. 'model' => \$model,
  49. 'relation' => '{$relationName}',
  50. 'fields' => '{$suggestedfield}',
  51. 'allowEmpty' => {$allowEmpty},
  52. 'style' => '{$style}',
  53. 'htmlOptions' => array(
  54. 'checkAll' => Yii::t('app', 'Choose all'),
  55. ),)
  56. )");
  57. }
  58. }
  59. }
  60. /**
  61. * @param CActiveRecord $modelClass
  62. * @param CDbColumnSchema $column
  63. */
  64. static public function generateActiveField($model, $column)
  65. {
  66. if (strtoupper($column->dbType) == 'TINYINT(1)'
  67. || strtoupper($column->dbType) == 'BIT'
  68. || strtoupper($column->dbType) == 'BOOL'
  69. || strtoupper($column->dbType) == 'BOOLEAN') {
  70. return "echo \$form->checkBox(\$model,'{$column->name}')";
  71. } else if (strtoupper($column->dbType) == 'DATE') {
  72. $modelname = get_class($model);
  73. } else if (substr(strtoupper($column->dbType), 0, 4) == 'ENUM') {
  74. $string = sprintf("echo CHtml::activeDropDownList(\$model, '%s', array(\n", $column->name);
  75. $enum_values = explode(',', substr($column->dbType, 4, strlen($column->dbType) - 1));
  76. foreach ($enum_values as $value) {
  77. $value = trim($value, "()'");
  78. $string .= "\t\t\t'$value' => Yii::t('app', '" . $value . "') ,\n";
  79. }
  80. $string .= '))';
  81. return $string;
  82. } else {
  83. return null;
  84. }
  85. }
  86. /**
  87. * @param CActiveRecord $modelClass
  88. * @param CDbColumnSchema $column
  89. */
  90. public function generateValueField($modelClass, $column, $view = false)
  91. {
  92. if ($column->isForeignKey) {
  93. $model = CActiveRecord::model($modelClass);
  94. $table = $model->getTableSchema();
  95. $fk = $table->foreignKeys[$column->name];
  96. // We have to look into relations to find the correct model class (i.e. if models are generated with table prefix)
  97. // TODO: do not repeat yourself (foreach) - this is a hotfix
  98. foreach ($model->relations() as $key => $value) {
  99. if (strcasecmp($value[2], $column->name) == 0)
  100. $relation = $value;
  101. }
  102. $fmodel = CActiveRecord::model($relation[1]);
  103. $fmodelName = $relation[1];
  104. $modelTable = ucfirst($fmodel->tableName());
  105. $fcolumns = $fmodel->attributeNames();
  106. /* if (method_exists($fmodel,'get_label')) {
  107. $fcolumns[1] = "_label";
  108. } */
  109. //$rel = $model->getActiveRelation($column->name);
  110. $relname = strtolower($fk[0]);
  111. foreach ($model->relations() as $key => $value) {
  112. if (strcasecmp($value[2], $column->name) == 0)
  113. $relname = $key;
  114. }
  115. //return("\$model->{$relname}->{$fcolumns[1]}");
  116. //return("CHtml::value(\$model,\"{$relname}.{$fcolumns[1]}\")");
  117. //return("{$relname}.{$fcolumns[1]}");
  118. if ($view === true) {
  119. return "array(
  120. 'name'=>'{$column->name}',
  121. 'value'=>CHtml::value(\$model,'{$relname}.{$fcolumns[1]}'),
  122. )";
  123. } elseif ($view == 'search')
  124. return "\$form->dropDownList(\$model,'{$column->name}',CHtml::listData({$fmodelName}::model()->findAll(), '{$fmodel->getTableSchema()->primaryKey}', '{$fcolumns[1]}'),array('prompt'=>Yii::t('app', 'All')))";
  125. else
  126. return "array(
  127. 'name'=>'{$column->name}',
  128. 'value'=>'CHtml::value(\$data,\\'{$relname}.{$fcolumns[1]}\\')',
  129. 'filter'=>CHtml::listData({$fmodelName}::model()->findAll(), '{$fcolumns[0]}', '{$fcolumns[1]}'),
  130. )";
  131. //{$relname}.{$fcolumns[1]}
  132. } else if (strtoupper($column->dbType) == 'BOOLEAN'
  133. or strtoupper($column->dbType) == 'TINYINT(1)' or
  134. strtoupper($column->dbType) == 'BIT') {
  135. if ($view) {
  136. return "array(
  137. 'name'=>'{$column->name}',
  138. 'value'=>\$model->{$column->name}?Yii::t('app', 'Yes'):Yii::t('app', 'No'),
  139. )";
  140. } else
  141. return "array(
  142. 'name'=>'{$column->name}',
  143. 'value'=>'\$data->{$column->name}?Yii::t(\\'app\\',\\'Yes\\'):Yii::t(\\'app\\', \\'No\\')',
  144. 'filter'=>array('0'=>Yii::t('app','No'),'1'=>Yii::t('app','Yes')),
  145. )";
  146. } else if ($column->name == 'createtime'
  147. or $column->name == 'updatetime'
  148. or $column->name == 'timestamp') {
  149. return "array(
  150. 'name'=>'{$column->name}',
  151. 'value' =>'date(\"Y. m. d G:i:s\", \$data->{$column->name})')";
  152. } else {
  153. return("'" . $column->name . "'");
  154. }
  155. }
  156. }
  157. ?>