Commit 3852e0b7 by Qiang Xue

finished module code generator.

parent 4a02e0b5
...@@ -169,7 +169,7 @@ abstract class Application extends Module ...@@ -169,7 +169,7 @@ abstract class Application extends Module
public function registerErrorHandlers() public function registerErrorHandlers()
{ {
if (YII_ENABLE_ERROR_HANDLER) { if (YII_ENABLE_ERROR_HANDLER) {
//ini_set('display_errors', 0); ini_set('display_errors', 0);
set_exception_handler(array($this, 'handleException')); set_exception_handler(array($this, 'handleException'));
set_error_handler(array($this, 'handleError'), error_reporting()); set_error_handler(array($this, 'handleError'), error_reporting());
if ($this->memoryReserveSize > 0) { if ($this->memoryReserveSize > 0) {
...@@ -419,7 +419,6 @@ abstract class Application extends Module ...@@ -419,7 +419,6 @@ abstract class Application extends Module
// disable error capturing to avoid recursive errors while handling exceptions // disable error capturing to avoid recursive errors while handling exceptions
restore_error_handler(); restore_error_handler();
restore_exception_handler(); restore_exception_handler();
try { try {
$this->logException($exception); $this->logException($exception);
if (($handler = $this->getErrorHandler()) !== null) { if (($handler = $this->getErrorHandler()) !== null) {
......
...@@ -28,7 +28,7 @@ yii.gii = (function ($) { ...@@ -28,7 +28,7 @@ yii.gii = (function ($) {
} }
$(this).before('<div class="sticky-value">' + value + '</div>').hide(); $(this).before('<div class="sticky-value">' + value + '</div>').hide();
}); });
$('.sticky-value').on('click', function() { $('.sticky-value').on('click', function () {
$(this).hide(); $(this).hide();
$(this).next().show().get(0).focus(); $(this).next().show().get(0).focus();
}); });
...@@ -76,10 +76,19 @@ yii.gii = (function ($) { ...@@ -76,10 +76,19 @@ yii.gii = (function ($) {
initPreviewDiffLinks(); initPreviewDiffLinks();
initConfirmationCheckboxes(); initConfirmationCheckboxes();
$('.default-view .form-group input,select,textarea').change(function(){ // hide Generate button if any input is changed
$('.default-view .form-group input,select,textarea').change(function () {
$('.default-view-results,.default-view-files').hide(); $('.default-view-results,.default-view-files').hide();
$('.default-view button[name="generate"]').hide(); $('.default-view button[name="generate"]').hide();
}); });
$('.module-form #generator-moduleclass').change(function () {
var value = $(this).val().match(/(\w+)\\\w+$/);
var $idInput = $('#generator-moduleid');
if (value && value[1] && $idInput.val() == '') {
$idInput.val(value[1]);
}
});
} }
}; };
})(jQuery); })(jQuery);
...@@ -45,6 +45,7 @@ body { ...@@ -45,6 +45,7 @@ body {
.default-view .sticky-value { .default-view .sticky-value {
padding: 6px 12px; padding: 6px 12px;
background: lightyellow; background: lightyellow;
overflow: auto;
} }
.default-view .modal-dialog { .default-view .modal-dialog {
...@@ -99,6 +100,10 @@ body { ...@@ -99,6 +100,10 @@ body {
padding: 1px; padding: 1px;
} }
.default-view-results .alert pre {
background: white;
}
.default-diff pre { .default-diff pre {
padding: 0; padding: 0;
margin: 0; margin: 0;
......
...@@ -8,8 +8,9 @@ use yii\helpers\Inflector; ...@@ -8,8 +8,9 @@ use yii\helpers\Inflector;
* @var yii\base\View $this * @var yii\base\View $this
* @var yii\gii\generators\controller\Generator $generator * @var yii\gii\generators\controller\Generator $generator
*/ */
echo "<?php\n";
?> ?>
<?php echo "<?php\n"; ?>
<?php if (!empty($generator->ns)): ?> <?php if (!empty($generator->ns)): ?>
namespace <?php echo $generator->ns; ?>; namespace <?php echo $generator->ns; ?>;
......
...@@ -6,8 +6,9 @@ ...@@ -6,8 +6,9 @@
* @var yii\gii\generators\controller\Generator $generator * @var yii\gii\generators\controller\Generator $generator
* @var string $action the action ID * @var string $action the action ID
*/ */
echo "<?php\n";
?> ?>
<?php echo "<?php\n"; ?>
/** /**
* @var yii\base\View $this * @var yii\base\View $this
*/ */
......
...@@ -4,8 +4,7 @@ ...@@ -4,8 +4,7 @@
* @var yii\widgets\ActiveForm $form * @var yii\widgets\ActiveForm $form
* @var yii\gii\generators\controller\Generator $generator * @var yii\gii\generators\controller\Generator $generator
*/ */
?> echo $form->field($generator, 'controller');
<?php echo $form->field($generator, 'controller'); ?> echo $form->field($generator, 'actions');
<?php echo $form->field($generator, 'actions'); ?> echo $form->field($generator, 'ns');
<?php echo $form->field($generator, 'ns'); ?> echo $form->field($generator, 'baseClass');
<?php echo $form->field($generator, 'baseClass'); ?>
...@@ -12,6 +12,7 @@ use yii\base\Model; ...@@ -12,6 +12,7 @@ use yii\base\Model;
use yii\gii\CodeFile; use yii\gii\CodeFile;
/** /**
* This generator will generate an action view file based on the specified model class.
* *
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0 * @since 2.0
...@@ -124,9 +125,7 @@ class Generator extends \yii\gii\Generator ...@@ -124,9 +125,7 @@ class Generator extends \yii\gii\Generator
return <<<EOD return <<<EOD
<p>The form has been generated successfully.</p> <p>The form has been generated successfully.</p>
<p>You may add the following code in an appropriate controller class to invoke the view:</p> <p>You may add the following code in an appropriate controller class to invoke the view:</p>
<pre style="background:white"> <pre>$code</pre>
$code
</pre>
EOD; EOD;
} }
......
...@@ -8,8 +8,10 @@ use yii\helpers\Inflector; ...@@ -8,8 +8,10 @@ use yii\helpers\Inflector;
* @var yii\base\View $this * @var yii\base\View $this
* @var yii\gii\generators\form\Generator $generator * @var yii\gii\generators\form\Generator $generator
*/ */
echo "<?php\n";
?> ?>
<?php echo "<?php\n"; ?>
public function action<?php echo Inflector::id2camel(trim(basename($generator->viewName), '_')); ?>() public function action<?php echo Inflector::id2camel(trim(basename($generator->viewName), '_')); ?>()
{ {
$model = new <?php echo $generator->modelClass; ?><?php echo empty($generator->scenarioName) ? '' : "(array('scenario' => '{$generator->scenarioName}'))"; ?>; $model = new <?php echo $generator->modelClass; ?><?php echo empty($generator->scenarioName) ? '' : "(array('scenario' => '{$generator->scenarioName}'))"; ?>;
......
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
* @var yii\base\View $this * @var yii\base\View $this
* @var yii\gii\generators\form\Generator $generator * @var yii\gii\generators\form\Generator $generator
*/ */
echo "<?php\n";
?> ?>
<?php echo "<?php\n"; ?>
use yii\helpers\Html; use yii\helpers\Html;
use yii\widgets\ActiveForm; use yii\widgets\ActiveForm;
......
...@@ -4,8 +4,7 @@ ...@@ -4,8 +4,7 @@
* @var yii\widgets\ActiveForm $form * @var yii\widgets\ActiveForm $form
* @var yii\gii\generators\form\Generator $generator * @var yii\gii\generators\form\Generator $generator
*/ */
?> echo $form->field($generator, 'viewName');
<?php echo $form->field($generator, 'viewName'); ?> echo $form->field($generator, 'modelClass');
<?php echo $form->field($generator, 'modelClass'); ?> echo $form->field($generator, 'scenarioName');
<?php echo $form->field($generator, 'scenarioName'); ?> echo $form->field($generator, 'viewPath');
<?php echo $form->field($generator, 'viewPath'); ?>
...@@ -7,18 +7,33 @@ ...@@ -7,18 +7,33 @@
namespace yii\gii\generators\module; namespace yii\gii\generators\module;
use Yii;
use yii\gii\CodeFile;
use yii\helpers\Html;
use yii\helpers\StringHelper;
/** /**
* This generator will generate the skeleton code needed by a module.
* *
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0 * @since 2.0
*/ */
class Generator extends \yii\gii\Generator class Generator extends \yii\gii\Generator
{ {
public $moduleClass;
public $moduleID;
/**
* @inheritdoc
*/
public function getName() public function getName()
{ {
return 'Module Generator'; return 'Module Generator';
} }
/**
* @inheritdoc
*/
public function getDescription() public function getDescription()
{ {
return 'This generator helps you to generate the skeleton code needed by a Yii module.'; return 'This generator helps you to generate the skeleton code needed by a Yii module.';
...@@ -27,8 +42,127 @@ class Generator extends \yii\gii\Generator ...@@ -27,8 +42,127 @@ class Generator extends \yii\gii\Generator
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function rules()
{
return array_merge(parent::rules(), array(
array('moduleID, moduleClass', 'filter', 'filter' => 'trim'),
array('moduleID, moduleClass', 'required'),
array('moduleID', 'match', 'pattern' => '/^[\w\\-]+$/', 'message' => 'Only word characters and dashes are allowed.'),
array('moduleClass', 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'),
array('moduleClass', 'validateModuleClass'),
));
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return array(
'moduleID' => 'Module ID',
'moduleClass' => 'Module Class',
);
}
/**
* @inheritdoc
*/
public function hints()
{
return array(
'moduleID' => 'This refers to the ID of the module, e.g., <code>admin</code>.',
'moduleClass' => 'This is the fully qualified class name of the module, e.g., <code>app\modules\admin\Module</code>.',
);
}
/**
* @inheritdoc
*/
public function successMessage()
{
if (Yii::$app->hasModule($this->moduleID)) {
$link = Html::a('try it now', Yii::$app->getUrlManager()->createUrl($this->moduleID), array('target' => '_blank'));
return "The module has been generated successfully. You may $link.";
}
$output = <<<EOD
<p>The module has been generated successfully.</p>
<p>To access the module, you need to modify the application configuration as follows:</p>
EOD;
$code = <<<EOD
<?php
return array(
'modules'=>array(
'{$this->moduleID}' => array(
'class' => '{$this->moduleClass}',
),
),
......
);
EOD;
return $output . '<pre>' . highlight_string($code, true) . '</pre>';
}
/**
* @inheritdoc
*/
public function requiredTemplates()
{
return array(
'module.php',
'controller.php',
'view.php',
);
}
/**
* @inheritdoc
*/
public function generate() public function generate()
{ {
return array(); $files = array();
$modulePath = $this->getModulePath();
$templatePath = $this->getTemplatePath();
$files[] = new CodeFile(
$modulePath . '/' . StringHelper::basename($this->moduleClass) . '.php',
$this->render("$templatePath/module.php")
);
$files[] = new CodeFile(
$modulePath . '/controllers/DefaultController.php',
$this->render("$templatePath/controller.php")
);
$files[] = new CodeFile(
$modulePath . '/views/default/index.php',
$this->render("$templatePath/view.php")
);
return $files;
}
/**
* Validates [[moduleClass]] to make sure it is a fully qualified class name.
*/
public function validateModuleClass()
{
if (strpos($this->moduleClass, '\\') === false || Yii::getAlias('@' . str_replace('\\', '/', $this->moduleClass)) === false) {
$this->addError('moduleClass', 'Module class must be properly namespaced.');
}
}
/**
* @return boolean the directory that contains the module class
*/
public function getModulePath()
{
return Yii::getAlias('@' . str_replace('\\', '/', substr($this->moduleClass, 0, strrpos($this->moduleClass, '\\'))));
}
/**
* @return string the controller namespace of the module.
*/
public function getControllerNamespace()
{
return substr($this->moduleClass, 0, strrpos($this->moduleClass, '\\')) . '\controllers';
} }
} }
<?php
/**
* This is the template for generating a controller class within a module.
*
* @var yii\base\View $this
* @var yii\gii\generators\module\Generator $generator
*/
echo "<?php\n";
?>
namespace <?php echo $generator->getControllerNamespace(); ?>;
use yii\web\Controller;
class DefaultController extends Controller
{
public function actionIndex()
{
$this->render('index');
}
}
<?php
/**
* This is the template for generating a module class file.
*
* @var yii\base\View $this
* @var yii\gii\generators\module\Generator $generator
*/
$className = $generator->moduleClass;
$pos = strrpos($className, '\\');
$ns = ltrim(substr($className, 0, $pos), '\\');
$className = substr($className, $pos + 1);
echo "<?php\n";
?>
namespace <?php echo $ns; ?>
class <?php echo $className; ?> extends \yii\web\Module
{
public $controllerNamespace = '<?php echo $generator->getControllerNamespace(); ?>';
public function init()
{
parent::init();
// custom initialization code goes here
}
}
<?php
/**
* @var yii\base\View $this
* @var yii\gii\generators\module\Generator $generator
*/
?>
<div class="<?php echo $generator->moduleID . '-default-index'; ?>">
<h1><?php echo "<?php"; ?> echo $this->context->action->uniqueId; ?></h1>
<p>
This is the view content for action "<?php echo "<?php"; ?> echo $this->context->action->id; ?>".
The action belongs to the controller "<?php echo "<?php"; ?> echo get_class($this->context); ?>"
in the "<?php echo "<?php"; ?> echo $this->context->module->id; ?>" module.
</p>
<p>
You may customize this page by editing the following file:<br>
<code><?php echo "<?php"; ?> echo __FILE__; ?></code>
</p>
</div>
<?php
/**
* @var yii\base\View $this
* @var yii\widgets\ActiveForm $form
* @var yii\gii\generators\module\Generator $generator
*/
?>
<div class="module-form">
<?php
echo $form->field($generator, 'moduleClass');
echo $form->field($generator, 'moduleID');
?>
</div>
...@@ -9,6 +9,7 @@ use yii\gii\CodeFile; ...@@ -9,6 +9,7 @@ use yii\gii\CodeFile;
/** /**
* @var yii\base\View $this * @var yii\base\View $this
* @var yii\gii\Generator $generator * @var yii\gii\Generator $generator
* @var string $id
* @var yii\widgets\ActiveForm $form * @var yii\widgets\ActiveForm $form
* @var string $results * @var string $results
* @var boolean $hasError * @var boolean $hasError
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment