* @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 = <<The module has been generated successfully.

To access the module, you need to add this to your application configuration:

EOD; $code = << [ '{$this->moduleID}' => [ 'class' => '{$this->moduleClass}', ], ], ...... EOD; return $output . '
' . 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'; } }