Generator.php 6.28 KB
Newer Older
1 2
<?php
/**
3
 * @link http://www.yiiframework.com/
4
 * @copyright Copyright (c) 2008 Yii Software LLC
5
 * @license http://www.yiiframework.com/license/
6 7 8 9 10
 */

namespace yii\gii\generators\extension;

use Yii;
11
use yii\gii\CodeFile;
12 13 14

/**
 * This generator will generate the skeleton files needed by an extension.
Tobias Munk committed
15
 *
16 17 18 19
 * @property string $keywordsArrayJson A json encoded array with the given keywords. This property is
 * read-only.
 * @property boolean $outputPath The directory that contains the module class. This property is read-only.
 *
20
 * @author Tobias Munk <schmunk@usrbin.de>
21
 * @since 2.0
22 23 24 25
 */
class Generator extends \yii\gii\Generator
{
	public $vendorName;
26
	public $packageName = "yii2-";
27
	public $namespace;
28
	public $type = "yii2-extension";
29
	public $keywords = "yii2,extension";
30 31
	public $title;
	public $description;
32
	public $outputPath = "@app/runtime/tmp-extensions";
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
	public $license;
	public $authorName;
	public $authorEmail;

	/**
	 * @inheritdoc
	 */
	public function getName()
	{
		return 'Extension Generator';
	}

	/**
	 * @inheritdoc
	 */
	public function getDescription()
	{
		return 'This generator helps you to generate the files needed by a Yii extension.';
	}

	/**
	 * @inheritdoc
	 */
	public function rules()
	{
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
		return array_merge(
			parent::rules(),
			[
				[['vendorName', 'packageName'], 'filter', 'filter' => 'trim'],
				[
					[
						'vendorName',
						'packageName',
						'namespace',
						'type',
						'license',
						'title',
						'description',
						'authorName',
						'authorEmail',
						'outputPath'
					],
					'required'
				],
77
				[['keywords'], 'safe'],
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
				[['authorEmail'], 'email'],
				[
					['vendorName', 'packageName'],
					'match',
					'pattern' => '/^[a-z0-9\-\.]+$/',
					'message' => 'Only lowercase word characters, dashes and dots are allowed.'
				],
				[
					['namespace'],
					'match',
					'pattern' => '/^[a-zA-Z0-9\\\]+\\\$/',
					'message' => 'Only letters, numbers and backslashes are allowed. PSR-4 namespaces must end with a namespace separator.'
				],
			]
		);
93 94 95 96 97 98 99 100
	}

	/**
	 * @inheritdoc
	 */
	public function attributeLabels()
	{
		return [
101
			'vendorName'  => 'Vendor Name',
102
			'packageName' => 'Package Name',
103
			'license'     => 'License',
104 105 106 107 108 109 110 111 112
		];
	}

	/**
	 * @inheritdoc
	 */
	public function hints()
	{
		return [
Tobias Munk committed
113 114 115
			'vendorName'  => 'This refers to the name of the publisher, your GitHub user name is usually a good choice, eg. <code>myself</code>.',
			'packageName' => 'This is the name of the extension on packagist, eg. <code>yii2-foobar</code>.',
			'namespace'   => 'PSR-4, eg. <code>myself\foobar\</code> This will be added to your autoloading by composer. Do not use yii or yii2 in the namespace.',
116 117 118
			'keywords'    => 'Comma separated keywords for this extension.',
			'outputPath'  => 'The temporary location of the generated files.',
			'title'       => 'A more descriptive name of your application for the README file.',
119 120 121 122 123 124 125 126 127
			'description' => 'A sentence or subline describing the main purpose of the extension.',
		];
	}

	/**
	 * @inheritdoc
	 */
	public function stickyAttributes()
	{
128
		return ['vendorName', 'outputPath', 'authorName', 'authorEmail'];
129 130 131 132 133 134 135
	}

	/**
	 * @inheritdoc
	 */
	public function successMessage()
	{
136
		$outputPath = realpath(\Yii::getAlias($this->outputPath));
137
		$output1 = <<<EOD
138
<p><em>The extension has been generated successfully.</em></p>
139
<p>To enable it in your application, you need to create a git repository
Tobias Munk committed
140
and require it via composer.</p>
141
EOD;
142
		$code1 = <<<EOD
143
cd {$outputPath}/{$this->packageName}
144 145 146 147

git init
git add -A
git commit
148 149
git remote add origin https://path.to/your/repo
git push -u origin master
150
EOD;
151
		$output2 = <<<EOD
Tobias Munk committed
152
<p>The next step is just for <em>initial development</em>, skip it if you directly publish the extension on packagist.org</p>
153 154
<p>Add the newly created repo to your composer.json.</p>
EOD;
155
		$code2 = <<<EOD
156 157 158
"repositories":[
	{
		"type": "git",
159
		"url": "https://path.to/your/repo"
160 161 162
	}
]
EOD;
163
		$output3 = <<<EOD
164
<p class="well">Note: You may use the url <code>file://{$outputPath}/{$this->packageName}</code> for testing.</p>
165 166
<p>Require the package with composer</p>
EOD;
167
		$code3 = <<<EOD
168
composer.phar require {$this->vendorName}/{$this->packageName}:dev-master
169
EOD;
170
		$output4 = <<<EOD
171 172
<p>And use it in your application.</p>
EOD;
173
		$code4 = <<<EOD
174
\\{$this->namespace}AutoloadExample::widget();
175
EOD;
176
		$output5 = <<<EOD
Tobias Munk committed
177 178 179
<p>When you have finished development register your extension at <a href='https://packagist.org/' target='_blank'>packagist.org</a>.</p>
EOD;

180
		$return = $output1 . '<pre>' . highlight_string($code1, true) . '</pre>';
181 182 183
		$return .= $output2 . '<pre>' . highlight_string($code2, true) . '</pre>';
		$return .= $output3 . '<pre>' . highlight_string($code3, true) . '</pre>';
		$return .= $output4 . '<pre>' . highlight_string($code4, true) . '</pre>';
Tobias Munk committed
184
		$return .= $output5;
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
		return $return;
	}

	/**
	 * @inheritdoc
	 */
	public function requiredTemplates()
	{
		return ['composer.json', 'AutoloadExample.php', 'README.md'];
	}

	/**
	 * @inheritdoc
	 */
	public function generate()
	{
201
		$files = [];
202
		$modulePath = $this->getOutputPath();
203
		$files[] = new CodeFile(
204 205 206
			$modulePath . '/' . $this->packageName . '/composer.json',
			$this->render("composer.json")
		);
207
		$files[] = new CodeFile(
208 209 210
			$modulePath . '/' . $this->packageName . '/AutoloadExample.php',
			$this->render("AutoloadExample.php")
		);
211
		$files[] = new CodeFile(
212 213 214 215 216 217 218 219 220 221 222 223
			$modulePath . '/' . $this->packageName . '/README.md',
			$this->render("README.md")
		);
		return $files;
	}

	/**
	 * @return boolean the directory that contains the module class
	 */
	public function getOutputPath()
	{
		return Yii::getAlias($this->outputPath);
224 225 226
	}

	/**
227
	 * @return string a json encoded array with the given keywords
228 229 230 231
	 */
	public function getKeywordsArrayJson()
	{
		return json_encode(explode(',', $this->keywords));
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
	}

	/**
	 * @return array options for type drop-down
	 */
	public function optsType()
	{
		$licenses = [
			'yii2-extension',
			'library',
		];
		return array_combine($licenses, $licenses);
	}

	/**
	 * @return array options for license drop-down
	 */
	public function optsLicense()
	{
		$licenses = [
			'Apache-2.0',
			'BSD-2-Clause',
			'BSD-3-Clause',
			'BSD-4-Clause',
			'GPL-2.0',
			'GPL-2.0+',
			'GPL-3.0',
			'GPL-3.0+',
			'LGPL-2.1',
			'LGPL-2.1+',
			'LGPL-3.0',
			'LGPL-3.0+',
			'MIT'
		];
		return array_combine($licenses, $licenses);
	}
}