* @since 2.0
*/
class Generator extends \yii\gii\Generator
{
public $moduleClass;
public $moduleID;
/**
* @inheritdoc
*/
public function getName()
{
return 'Module Generator';
}
/**
* @inheritdoc
*/
public function getDescription()
{
return 'This generator helps you to generate the skeleton code needed by a Yii module.';
}
/**
* @inheritdoc
*/
public function rules()
{
return array_merge(parent::rules(), [
[['moduleID', 'moduleClass'], 'filter', 'filter' => 'trim'],
[['moduleID', 'moduleClass'], 'required'],
[['moduleID'], 'match', 'pattern' => '/^[\w\\-]+$/', 'message' => 'Only word characters and dashes are allowed.'],
[['moduleClass'], 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'],
[['moduleClass'], 'validateModuleClass'],
]);
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'moduleID' => 'Module ID',
'moduleClass' => 'Module Class',
];
}
/**
* @inheritdoc
*/
public function hints()
{
return [
'moduleID' => 'This refers to the ID of the module, e.g., admin
.',
'moduleClass' => 'This is the fully qualified class name of the module, e.g., app\modules\admin\Module
.',
];
}
/**
* @inheritdoc
*/
public function successMessage()
{
if (Yii::$app->hasModule($this->moduleID)) {
$link = Html::a('try it now', Yii::$app->getUrlManager()->createUrl($this->moduleID), ['target' => '_blank']);
return "The module has been generated successfully. You may $link.";
}
$output = <<
To access the module, you need to add this to your application configuration:
EOD; $code = <<' . highlight_string($code, true) . ''; } /** * @inheritdoc */ public function requiredTemplates() { return ['module.php', 'controller.php', 'view.php']; } /** * @inheritdoc */ public function generate() { $files = []; $modulePath = $this->getModulePath(); $files[] = new CodeFile( $modulePath . '/' . StringHelper::basename($this->moduleClass) . '.php', $this->render("module.php") ); $files[] = new CodeFile( $modulePath . '/controllers/DefaultController.php', $this->render("controller.php") ); $files[] = new CodeFile( $modulePath . '/views/default/index.php', $this->render("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) === false) { $this->addError('moduleClass', 'Module class must be properly namespaced.'); } if (substr($this->moduleClass, -1, 1) == '\\') { $this->addError('moduleClass', 'Module class name must not be empty. Please enter a fully qualified class name. e.g. "app\\modules\\admin\\Module".'); } } /** * @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'; } }