Browse Source
			
			
			
			
				
		* master: (806 commits)
  avoid confusing docs about autoload return value
  doc fix.
  Fixed doc.
  Fixed autoloader behavior according to leading \
  Fix in RequestPanel
  changed to trace from info.
  Removed yii\debug\Module::enabled.
  minor enhancement of debugger.
  Refactored the basic app.
  Added ErrorAction.
  Use `hasAttribute()` instead to avoid code duplication
  refactored NavBar and basic app navbar.
  test break fix.
  test break fix.
  Fixed test breaks.
  #735: removed hiddenInput to avoid confusion.
  ResizableAsset typo fix!
  Update radio and checkbox due to e3801fbf6b
  css fix.
  Fixed the basic app template.
  ...
Conflicts:
	.travis.yml
	tests/unit/data/config.php
			
			
				tags/2.0.0-beta
			
			
		
				 657 changed files with 58806 additions and 21231 deletions
			
			
		@ -0,0 +1,4 @@
					 | 
				
			||||
service_name: travis-ci | 
				
			||||
src_dir: framework/yii | 
				
			||||
coverage_clover: tests/unit/runtime/coveralls/clover.xml | 
				
			||||
json_path: tests/unit/runtime/coveralls/coveralls-upload.json | 
				
			||||
@ -0,0 +1,23 @@
					 | 
				
			||||
# Autodetect text files | 
				
			||||
* text=auto | 
				
			||||
 | 
				
			||||
# ...Unless the name matches the following overriding patterns | 
				
			||||
 | 
				
			||||
# Definitively text files | 
				
			||||
*.php  text | 
				
			||||
*.css  text | 
				
			||||
*.js   text | 
				
			||||
*.txt  text | 
				
			||||
*.md   text | 
				
			||||
*.xml  text | 
				
			||||
*.json text | 
				
			||||
*.bat  text | 
				
			||||
*.sql  text | 
				
			||||
*.xml  text | 
				
			||||
*.yml  text | 
				
			||||
 | 
				
			||||
# Ensure those won't be messed up with | 
				
			||||
*.png  binary | 
				
			||||
*.jpg  binary | 
				
			||||
*.gif  binary | 
				
			||||
*.ttf  binary | 
				
			||||
@ -0,0 +1,114 @@
					 | 
				
			||||
Yii 2 Advanced Application Template | 
				
			||||
=================================== | 
				
			||||
 | 
				
			||||
**NOTE** Yii 2 and the relevant applications and extensions are still under heavy | 
				
			||||
development. We may make significant changes without prior notices. Please do not | 
				
			||||
use them for production. Please consider using [Yii v1.1](https://github.com/yiisoft/yii) | 
				
			||||
if you have a project to be deployed for production soon. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
Thank you for using Yii 2 Advanced Application Template - an application template | 
				
			||||
that works out-of-box and can be easily customized to fit for your needs. | 
				
			||||
 | 
				
			||||
Yii 2 Advanced Application Template is best suitable for large projects requiring frontend and backend separation, | 
				
			||||
deployment in different environments, configuration nesting etc. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
DIRECTORY STRUCTURE | 
				
			||||
------------------- | 
				
			||||
 | 
				
			||||
``` | 
				
			||||
common | 
				
			||||
	config/             contains shared configurations | 
				
			||||
	models/             contains model classes used in both backend and frontend | 
				
			||||
console | 
				
			||||
	config/             contains console configurations | 
				
			||||
	controllers/        contains console controllers (commands) | 
				
			||||
	migrations/         contains database migrations | 
				
			||||
	models/             contains console-specific model classes | 
				
			||||
	runtime/            contains files generated during runtime | 
				
			||||
backend | 
				
			||||
	assets/             contains application assets such as JavaScript and CSS | 
				
			||||
	config/             contains backend configurations | 
				
			||||
	controllers/        contains Web controller classes | 
				
			||||
	models/             contains backend-specific model classes | 
				
			||||
	runtime/            contains files generated during runtime | 
				
			||||
	views/              contains view files for the Web application | 
				
			||||
	web/                contains the entry script and Web resources | 
				
			||||
frontend | 
				
			||||
	assets/             contains application assets such as JavaScript and CSS | 
				
			||||
	config/             contains frontend configurations | 
				
			||||
	controllers/        contains Web controller classes | 
				
			||||
	models/             contains frontend-specific model classes | 
				
			||||
	runtime/            contains files generated during runtime | 
				
			||||
	views/              contains view files for the Web application | 
				
			||||
	web/                contains the entry script and Web resources | 
				
			||||
vendor/                 contains dependent 3rd-party packages | 
				
			||||
environments/                contains environment-based overrides | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
REQUIREMENTS | 
				
			||||
------------ | 
				
			||||
 | 
				
			||||
The minimum requirement by Yii is that your Web server supports PHP 5.3.?. | 
				
			||||
 | 
				
			||||
In order for captcha to work you need either GD2 extension or ImageMagick PHP extension. | 
				
			||||
 | 
				
			||||
INSTALLATION | 
				
			||||
------------ | 
				
			||||
 | 
				
			||||
### Install via Composer | 
				
			||||
 | 
				
			||||
If you do not have [Composer](http://getcomposer.org/), you may download it from | 
				
			||||
[http://getcomposer.org/](http://getcomposer.org/) or run the following command on Linux/Unix/MacOS: | 
				
			||||
 | 
				
			||||
~~~ | 
				
			||||
curl -s http://getcomposer.org/installer | php | 
				
			||||
~~~ | 
				
			||||
 | 
				
			||||
You can then install the application using the following command: | 
				
			||||
 | 
				
			||||
~~~ | 
				
			||||
php composer.phar create-project --stability=dev yiisoft/yii2-app-advanced yii-advanced | 
				
			||||
~~~ | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Install from an Archive File | 
				
			||||
 | 
				
			||||
This is not currently available. We will provide it when Yii 2 is formally released. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Install from development repository | 
				
			||||
 | 
				
			||||
If you've cloned the [Yii 2 framework main development repository](https://github.com/yiisoft/yii2) you | 
				
			||||
can bootstrap your application with: | 
				
			||||
 | 
				
			||||
~~~ | 
				
			||||
cd yii2/apps/advanced | 
				
			||||
php composer.phar create-project | 
				
			||||
~~~ | 
				
			||||
 | 
				
			||||
*Note: If the above command fails with `[RuntimeException] Not enough arguments.` run | 
				
			||||
`php composer.phar self-update` to obtain an updated version of composer which supports creating projects | 
				
			||||
from local packages.* | 
				
			||||
 | 
				
			||||
 | 
				
			||||
GETTING STARTED | 
				
			||||
--------------- | 
				
			||||
 | 
				
			||||
After you install the application, you have to conduct the following steps to initialize | 
				
			||||
the installed application. You only need to do these once for all. | 
				
			||||
 | 
				
			||||
1. Execute the `init` command and select `dev` as environment. | 
				
			||||
2. Create a new database. It is assumed that MySQL InnoDB is used. If not, adjust `console/migrations/m130524_201442_init.php`. | 
				
			||||
3. In `common/config/params.php` set your database details in `components.db` values. | 
				
			||||
 | 
				
			||||
Now you should be able to access: | 
				
			||||
 | 
				
			||||
- the frontend using the URL `http://localhost/yii-advanced/frontend/web/` | 
				
			||||
- the backend using the URL `http://localhost/yii-advanced/backend/web/` | 
				
			||||
 | 
				
			||||
assuming `yii-advanced` is directly under the document root of your Web server. | 
				
			||||
 | 
				
			||||
@ -0,0 +1,2 @@
					 | 
				
			||||
main-local.php | 
				
			||||
params-local.php | 
				
			||||
@ -0,0 +1,28 @@
					 | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * @link http://www.yiiframework.com/ | 
				
			||||
 * @copyright Copyright (c) 2008 Yii Software LLC | 
				
			||||
 * @license http://www.yiiframework.com/license/ | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
namespace backend\config; | 
				
			||||
use yii\web\AssetBundle; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author Qiang Xue <qiang.xue@gmail.com> | 
				
			||||
 * @since 2.0 | 
				
			||||
 */ | 
				
			||||
class AppAsset extends AssetBundle | 
				
			||||
{ | 
				
			||||
	public $basePath = '@webroot'; | 
				
			||||
	public $baseUrl = '@web'; | 
				
			||||
	public $css = array( | 
				
			||||
		'css/site.css', | 
				
			||||
	); | 
				
			||||
	public $js = array( | 
				
			||||
	); | 
				
			||||
	public $depends = array( | 
				
			||||
		'yii\web\YiiAsset', | 
				
			||||
		'yii\bootstrap\BootstrapAsset', | 
				
			||||
	); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,36 @@
					 | 
				
			||||
<?php | 
				
			||||
$rootDir = __DIR__ . '/../..'; | 
				
			||||
 | 
				
			||||
$params = array_merge( | 
				
			||||
	require($rootDir . '/common/config/params.php'), | 
				
			||||
	require($rootDir . '/common/config/params-local.php'), | 
				
			||||
	require(__DIR__ . '/params.php'), | 
				
			||||
	require(__DIR__ . '/params-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
return array( | 
				
			||||
	'id' => 'app-backend', | 
				
			||||
	'basePath' => dirname(__DIR__), | 
				
			||||
	'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', | 
				
			||||
	'preload' => array('log'), | 
				
			||||
	'controllerNamespace' => 'backend\controllers', | 
				
			||||
	'modules' => array( | 
				
			||||
	), | 
				
			||||
	'components' => array( | 
				
			||||
		'db' => $params['components.db'], | 
				
			||||
		'cache' => $params['components.cache'], | 
				
			||||
		'user' => array( | 
				
			||||
			'class' => 'yii\web\User', | 
				
			||||
			'identityClass' => 'common\models\User', | 
				
			||||
		), | 
				
			||||
		'log' => array( | 
				
			||||
			'targets' => array( | 
				
			||||
				array( | 
				
			||||
					'class' => 'yii\log\FileTarget', | 
				
			||||
					'levels' => array('error', 'warning'), | 
				
			||||
				), | 
				
			||||
			), | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
	'params' => $params, | 
				
			||||
); | 
				
			||||
@ -0,0 +1,33 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
namespace backend\controllers; | 
				
			||||
 | 
				
			||||
use Yii; | 
				
			||||
use yii\web\Controller; | 
				
			||||
use common\models\LoginForm; | 
				
			||||
 | 
				
			||||
class SiteController extends Controller | 
				
			||||
{ | 
				
			||||
	public function actionIndex() | 
				
			||||
	{ | 
				
			||||
		return $this->render('index'); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionLogin() | 
				
			||||
	{ | 
				
			||||
		$model = new LoginForm(); | 
				
			||||
		if ($model->load($_POST) && $model->login()) { | 
				
			||||
			return $this->redirect(array('site/index')); | 
				
			||||
		} else { | 
				
			||||
			return $this->render('login', array( | 
				
			||||
				'model' => $model, | 
				
			||||
			)); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionLogout() | 
				
			||||
	{ | 
				
			||||
		Yii::$app->user->logout(); | 
				
			||||
		return $this->redirect(array('site/index')); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,2 @@
					 | 
				
			||||
* | 
				
			||||
!.gitignore | 
				
			||||
@ -0,0 +1,22 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
Yii::setAlias('common', __DIR__ . '/../'); | 
				
			||||
Yii::setAlias('frontend', __DIR__ . '/../../frontend'); | 
				
			||||
Yii::setAlias('backend', __DIR__ . '/../../backend'); | 
				
			||||
 | 
				
			||||
return array( | 
				
			||||
	'adminEmail' => 'admin@example.com', | 
				
			||||
	'supportEmail' => 'support@example.com', | 
				
			||||
 | 
				
			||||
	'components.cache' => array( | 
				
			||||
		'class' => 'yii\caching\FileCache', | 
				
			||||
	), | 
				
			||||
 | 
				
			||||
	'components.db' => array( | 
				
			||||
		'class' => 'yii\db\Connection', | 
				
			||||
		'dsn' => 'mysql:host=localhost;dbname=yii2advanced', | 
				
			||||
		'username' => 'root', | 
				
			||||
		'password' => '', | 
				
			||||
		'charset' => 'utf8', | 
				
			||||
	), | 
				
			||||
); | 
				
			||||
@ -0,0 +1,58 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
namespace common\models; | 
				
			||||
 | 
				
			||||
use Yii; | 
				
			||||
use yii\base\Model; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * LoginForm is the model behind the login form. | 
				
			||||
 */ | 
				
			||||
class LoginForm extends Model | 
				
			||||
{ | 
				
			||||
	public $username; | 
				
			||||
	public $password; | 
				
			||||
	public $rememberMe = true; | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * @return array the validation rules. | 
				
			||||
	 */ | 
				
			||||
	public function rules() | 
				
			||||
	{ | 
				
			||||
		return array( | 
				
			||||
			// username and password are both required | 
				
			||||
			array('username, password', 'required'), | 
				
			||||
			// password is validated by validatePassword() | 
				
			||||
			array('password', 'validatePassword'), | 
				
			||||
			// rememberMe must be a boolean value | 
				
			||||
			array('rememberMe', 'boolean'), | 
				
			||||
		); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * Validates the password. | 
				
			||||
	 * This method serves as the inline validation for password. | 
				
			||||
	 */ | 
				
			||||
	public function validatePassword() | 
				
			||||
	{ | 
				
			||||
		$user = User::findByUsername($this->username); | 
				
			||||
		if (!$user || !$user->validatePassword($this->password)) { | 
				
			||||
			$this->addError('password', 'Incorrect username or password.'); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * Logs in a user using the provided username and password. | 
				
			||||
	 * @return boolean whether the user is logged in successfully | 
				
			||||
	 */ | 
				
			||||
	public function login() | 
				
			||||
	{ | 
				
			||||
		if ($this->validate()) { | 
				
			||||
			$user = User::findByUsername($this->username); | 
				
			||||
			Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0); | 
				
			||||
			return true; | 
				
			||||
		} else { | 
				
			||||
			return false; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,145 @@
					 | 
				
			||||
<?php | 
				
			||||
namespace common\models; | 
				
			||||
 | 
				
			||||
use yii\db\ActiveRecord; | 
				
			||||
use yii\helpers\Security; | 
				
			||||
use yii\web\Identity; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Class User | 
				
			||||
 * @package common\models | 
				
			||||
 * | 
				
			||||
 * @property integer $id | 
				
			||||
 * @property string $username | 
				
			||||
 * @property string $password_hash | 
				
			||||
 * @property string $password_reset_token | 
				
			||||
 * @property string $email | 
				
			||||
 * @property string $auth_key | 
				
			||||
 * @property integer $role | 
				
			||||
 * @property integer $status | 
				
			||||
 * @property integer $create_time | 
				
			||||
 * @property integer $update_time | 
				
			||||
 */ | 
				
			||||
class User extends ActiveRecord implements Identity | 
				
			||||
{ | 
				
			||||
	/** | 
				
			||||
	 * @var string the raw password. Used to collect password input and isn't saved in database | 
				
			||||
	 */ | 
				
			||||
	public $password; | 
				
			||||
 | 
				
			||||
	const STATUS_DELETED = 0; | 
				
			||||
	const STATUS_ACTIVE = 10; | 
				
			||||
 | 
				
			||||
	const ROLE_USER = 10; | 
				
			||||
 | 
				
			||||
	public function behaviors() | 
				
			||||
	{ | 
				
			||||
		return array( | 
				
			||||
			'timestamp' => array( | 
				
			||||
				'class' => 'yii\behaviors\AutoTimestamp', | 
				
			||||
				'attributes' => array( | 
				
			||||
					ActiveRecord::EVENT_BEFORE_INSERT => array('create_time', 'update_time'), | 
				
			||||
					ActiveRecord::EVENT_BEFORE_UPDATE => 'update_time', | 
				
			||||
				), | 
				
			||||
			), | 
				
			||||
		); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * Finds an identity by the given ID. | 
				
			||||
	 * | 
				
			||||
	 * @param string|integer $id the ID to be looked for | 
				
			||||
	 * @return Identity|null the identity object that matches the given ID. | 
				
			||||
	 */ | 
				
			||||
	public static function findIdentity($id) | 
				
			||||
	{ | 
				
			||||
		return static::find($id); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * Finds user by username | 
				
			||||
	 * | 
				
			||||
	 * @param string $username | 
				
			||||
	 * @return null|User | 
				
			||||
	 */ | 
				
			||||
	public static function findByUsername($username) | 
				
			||||
	{ | 
				
			||||
		return static::find(array('username' => $username, 'status' => static::STATUS_ACTIVE)); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * @return int|string current user ID | 
				
			||||
	 */ | 
				
			||||
	public function getId() | 
				
			||||
	{ | 
				
			||||
		return $this->id; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * @return string current user auth key | 
				
			||||
	 */ | 
				
			||||
	public function getAuthKey() | 
				
			||||
	{ | 
				
			||||
		return $this->auth_key; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * @param string $authKey | 
				
			||||
	 * @return boolean if auth key is valid for current user | 
				
			||||
	 */ | 
				
			||||
	public function validateAuthKey($authKey) | 
				
			||||
	{ | 
				
			||||
		return $this->getAuthKey() === $authKey; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * @param string $password password to validate | 
				
			||||
	 * @return bool if password provided is valid for current user | 
				
			||||
	 */ | 
				
			||||
	public function validatePassword($password) | 
				
			||||
	{ | 
				
			||||
		return Security::validatePassword($password, $this->password_hash); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function rules() | 
				
			||||
	{ | 
				
			||||
		return array( | 
				
			||||
			array('username', 'filter', 'filter' => 'trim'), | 
				
			||||
			array('username', 'required'), | 
				
			||||
			array('username', 'string', 'min' => 2, 'max' => 255), | 
				
			||||
 | 
				
			||||
			array('email', 'filter', 'filter' => 'trim'), | 
				
			||||
			array('email', 'required'), | 
				
			||||
			array('email', 'email'), | 
				
			||||
			array('email', 'unique', 'message' => 'This email address has already been taken.', 'on' => 'signup'), | 
				
			||||
			array('email', 'exist', 'message' => 'There is no user with such email.', 'on' => 'requestPasswordResetToken'), | 
				
			||||
 | 
				
			||||
			array('password', 'required'), | 
				
			||||
			array('password', 'string', 'min' => 6), | 
				
			||||
		); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function scenarios() | 
				
			||||
	{ | 
				
			||||
		return array( | 
				
			||||
			'signup' => array('username', 'email', 'password'), | 
				
			||||
			'login' => array('username', 'password'), | 
				
			||||
			'resetPassword' => array('password'), | 
				
			||||
			'requestPasswordResetToken' => array('email'), | 
				
			||||
		); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function beforeSave($insert) | 
				
			||||
	{ | 
				
			||||
		if (parent::beforeSave($insert)) { | 
				
			||||
			if (($this->isNewRecord || $this->getScenario() === 'resetPassword') && !empty($this->password)) { | 
				
			||||
				$this->password_hash = Security::generatePasswordHash($this->password); | 
				
			||||
			} | 
				
			||||
			if ($this->isNewRecord) { | 
				
			||||
				$this->auth_key = Security::generateRandomKey(); | 
				
			||||
			} | 
				
			||||
			return true; | 
				
			||||
		} | 
				
			||||
		return false; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,38 @@
					 | 
				
			||||
{ | 
				
			||||
	"name": "yiisoft/yii2-app-advanced", | 
				
			||||
	"description": "Yii 2 Advanced Application Template", | 
				
			||||
	"keywords": ["yii", "framework", "advanced", "application template"], | 
				
			||||
	"homepage": "http://www.yiiframework.com/", | 
				
			||||
	"type": "project", | 
				
			||||
	"license": "BSD-3-Clause", | 
				
			||||
	"support": { | 
				
			||||
		"issues": "https://github.com/yiisoft/yii2/issues?state=open", | 
				
			||||
		"forum": "http://www.yiiframework.com/forum/", | 
				
			||||
		"wiki": "http://www.yiiframework.com/wiki/", | 
				
			||||
		"irc": "irc://irc.freenode.net/yii", | 
				
			||||
		"source": "https://github.com/yiisoft/yii2" | 
				
			||||
	}, | 
				
			||||
	"minimum-stability": "dev", | 
				
			||||
	"require": { | 
				
			||||
		"php": ">=5.3.0", | 
				
			||||
		"yiisoft/yii2": "dev-master", | 
				
			||||
		"yiisoft/yii2-composer": "dev-master" | 
				
			||||
	}, | 
				
			||||
	"scripts": { | 
				
			||||
		"post-create-project-cmd": [ | 
				
			||||
			"yii\\composer\\InstallHandler::setPermissions" | 
				
			||||
		] | 
				
			||||
	}, | 
				
			||||
	"extra": { | 
				
			||||
		"yii-install-writable": [ | 
				
			||||
			"backend/runtime", | 
				
			||||
			"backend/web/assets", | 
				
			||||
 | 
				
			||||
			"console/runtime", | 
				
			||||
			"console/migrations", | 
				
			||||
 | 
				
			||||
			"frontend/runtime", | 
				
			||||
			"frontend/web/assets" | 
				
			||||
		] | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,2 @@
					 | 
				
			||||
main-local.php | 
				
			||||
params-local.php | 
				
			||||
@ -0,0 +1,31 @@
					 | 
				
			||||
<?php | 
				
			||||
$rootDir = __DIR__ . '/../..'; | 
				
			||||
 | 
				
			||||
$params = array_merge( | 
				
			||||
	require($rootDir . '/common/config/params.php'), | 
				
			||||
	require($rootDir . '/common/config/params-local.php'), | 
				
			||||
	require(__DIR__ . '/params.php'), | 
				
			||||
	require(__DIR__ . '/params-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
return array( | 
				
			||||
	'id' => 'app-console', | 
				
			||||
	'basePath' => dirname(__DIR__), | 
				
			||||
	'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', | 
				
			||||
	'controllerNamespace' => 'console\controllers', | 
				
			||||
	'modules' => array( | 
				
			||||
	), | 
				
			||||
	'components' => array( | 
				
			||||
		'db' => $params['components.db'], | 
				
			||||
		'cache' => $params['components.cache'], | 
				
			||||
		'log' => array( | 
				
			||||
			'targets' => array( | 
				
			||||
				array( | 
				
			||||
					'class' => 'yii\log\FileTarget', | 
				
			||||
					'levels' => array('error', 'warning'), | 
				
			||||
				), | 
				
			||||
			), | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
	'params' => $params, | 
				
			||||
); | 
				
			||||
@ -0,0 +1,5 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
return array( | 
				
			||||
	'adminEmail' => 'admin@example.com', | 
				
			||||
); | 
				
			||||
@ -0,0 +1,31 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
use yii\db\Schema; | 
				
			||||
 | 
				
			||||
class m130524_201442_init extends \yii\db\Migration | 
				
			||||
{ | 
				
			||||
	public function up() | 
				
			||||
	{ | 
				
			||||
		// MySQL-specific table options. Adjust if you plan working with another DBMS | 
				
			||||
		$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB'; | 
				
			||||
 | 
				
			||||
		$this->createTable('tbl_user', array( | 
				
			||||
			'id' => Schema::TYPE_PK, | 
				
			||||
			'username' => Schema::TYPE_STRING.' NOT NULL', | 
				
			||||
			'auth_key' => Schema::TYPE_STRING.'(32) NOT NULL', | 
				
			||||
			'password_hash' => Schema::TYPE_STRING.' NOT NULL', | 
				
			||||
			'password_reset_token' => Schema::TYPE_STRING.'(32)', | 
				
			||||
			'email' => Schema::TYPE_STRING.' NOT NULL', | 
				
			||||
			'role' => 'tinyint NOT NULL DEFAULT 10', | 
				
			||||
 | 
				
			||||
			'status' => 'tinyint NOT NULL DEFAULT 10', | 
				
			||||
			'create_time' => Schema::TYPE_INTEGER.' NOT NULL', | 
				
			||||
			'update_time' => Schema::TYPE_INTEGER.' NOT NULL', | 
				
			||||
		), $tableOptions); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function down() | 
				
			||||
	{ | 
				
			||||
		$this->dropTable('tbl_user'); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,17 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
	'modules' => array( | 
				
			||||
//		'debug' => array( | 
				
			||||
//			'class' => 'yii\debug\Module', | 
				
			||||
//		), | 
				
			||||
	), | 
				
			||||
	'components' => array( | 
				
			||||
		'log' => array( | 
				
			||||
			'targets' => array( | 
				
			||||
//				array( | 
				
			||||
//					'class' => 'yii\log\DebugTarget', | 
				
			||||
//				) | 
				
			||||
			), | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,14 @@
					 | 
				
			||||
<?php | 
				
			||||
// comment out the following line to disable debug mode | 
				
			||||
defined('YII_DEBUG') or define('YII_DEBUG', true); | 
				
			||||
 | 
				
			||||
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php'); | 
				
			||||
require(__DIR__ . '/../../vendor/autoload.php'); | 
				
			||||
 | 
				
			||||
$config = yii\helpers\ArrayHelper::merge( | 
				
			||||
	require(__DIR__ . '/../config/main.php'), | 
				
			||||
	require(__DIR__ . '/../config/main-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
$application = new yii\web\Application($config); | 
				
			||||
$application->run(); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,17 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
	'modules' => array( | 
				
			||||
//			'debug' => array( | 
				
			||||
//				'class' => 'yii\debug\Module', | 
				
			||||
//			), | 
				
			||||
	), | 
				
			||||
	'components' => array( | 
				
			||||
		'log' => array( | 
				
			||||
			'targets' => array( | 
				
			||||
//				array( | 
				
			||||
//					'class' => 'yii\log\DebugTarget', | 
				
			||||
//				) | 
				
			||||
			), | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,16 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
// comment out the following line to disable debug mode | 
				
			||||
defined('YII_DEBUG') or define('YII_DEBUG', true); | 
				
			||||
 | 
				
			||||
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php'); | 
				
			||||
require(__DIR__ . '/../../vendor/autoload.php'); | 
				
			||||
Yii::importNamespaces(require(__DIR__ . '/../../vendor/composer/autoload_namespaces.php')); | 
				
			||||
 | 
				
			||||
$config = yii\helpers\ArrayHelper::merge( | 
				
			||||
	require(__DIR__ . '/../config/main.php'), | 
				
			||||
	require(__DIR__ . '/../config/main-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
$application = new yii\web\Application($config); | 
				
			||||
$application->run(); | 
				
			||||
@ -0,0 +1,26 @@
					 | 
				
			||||
#!/usr/bin/env php | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * Yii console bootstrap file. | 
				
			||||
 * | 
				
			||||
 * @link http://www.yiiframework.com/ | 
				
			||||
 * @copyright Copyright (c) 2008 Yii Software LLC | 
				
			||||
 * @license http://www.yiiframework.com/license/ | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
defined('YII_DEBUG') or define('YII_DEBUG', true); | 
				
			||||
 | 
				
			||||
// fcgi doesn't have STDIN defined by default | 
				
			||||
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); | 
				
			||||
 | 
				
			||||
require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php'); | 
				
			||||
require(__DIR__ . '/vendor/autoload.php'); | 
				
			||||
Yii::importNamespaces(require(__DIR__ . '/vendor/composer/autoload_namespaces.php')); | 
				
			||||
 | 
				
			||||
$config = yii\helpers\ArrayHelper::merge( | 
				
			||||
	require(__DIR__ . '/console/config/main.php'), | 
				
			||||
	require(__DIR__ . '/console/config/main-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
$application = new yii\console\Application($config); | 
				
			||||
return $application->run(); | 
				
			||||
@ -0,0 +1,38 @@
					 | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * The manifest of files that are local to specific environment. | 
				
			||||
 * This file returns a list of environments that the application | 
				
			||||
 * may be installed under. The returned data must be in the following | 
				
			||||
 * format: | 
				
			||||
 * | 
				
			||||
 * ```php | 
				
			||||
 * return array( | 
				
			||||
 *     'environment name' => array( | 
				
			||||
 *         'path' => 'directory storing the local files', | 
				
			||||
 *         'writable' => array( | 
				
			||||
 *             // list of directories that should be set writable | 
				
			||||
 *         ), | 
				
			||||
 *     ), | 
				
			||||
 * ); | 
				
			||||
 * ``` | 
				
			||||
 */ | 
				
			||||
return array( | 
				
			||||
	'Development' => array( | 
				
			||||
		'path' => 'dev', | 
				
			||||
		'writable' => array( | 
				
			||||
			// handled by composer.json already | 
				
			||||
		), | 
				
			||||
		'executable' => array( | 
				
			||||
			'yii', | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
	'Production' => array( | 
				
			||||
		'path' => 'prod', | 
				
			||||
		'writable' => array( | 
				
			||||
			// handled by composer.json already | 
				
			||||
		), | 
				
			||||
		'executable' => array( | 
				
			||||
			'yii', | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,14 @@
					 | 
				
			||||
<?php | 
				
			||||
// comment out the following line to disable debug mode | 
				
			||||
defined('YII_DEBUG') or define('YII_DEBUG', false); | 
				
			||||
 | 
				
			||||
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php'); | 
				
			||||
require(__DIR__ . '/../../vendor/autoload.php'); | 
				
			||||
 | 
				
			||||
$config = yii\helpers\ArrayHelper::merge( | 
				
			||||
	require(__DIR__ . '/../config/main.php'), | 
				
			||||
	require(__DIR__ . '/../config/main-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
$application = new yii\web\Application($config); | 
				
			||||
$application->run(); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,3 @@
					 | 
				
			||||
<?php | 
				
			||||
return array( | 
				
			||||
); | 
				
			||||
@ -0,0 +1,16 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
// comment out the following line to disable debug mode | 
				
			||||
defined('YII_DEBUG') or define('YII_DEBUG', false); | 
				
			||||
 | 
				
			||||
require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php'); | 
				
			||||
require(__DIR__ . '/../../vendor/autoload.php'); | 
				
			||||
Yii::importNamespaces(require(__DIR__ . '/../../vendor/composer/autoload_namespaces.php')); | 
				
			||||
 | 
				
			||||
$config = yii\helpers\ArrayHelper::merge( | 
				
			||||
	require(__DIR__ . '/../config/main.php'), | 
				
			||||
	require(__DIR__ . '/../config/main-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
$application = new yii\web\Application($config); | 
				
			||||
$application->run(); | 
				
			||||
@ -0,0 +1,26 @@
					 | 
				
			||||
#!/usr/bin/env php | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * Yii console bootstrap file. | 
				
			||||
 * | 
				
			||||
 * @link http://www.yiiframework.com/ | 
				
			||||
 * @copyright Copyright (c) 2008 Yii Software LLC | 
				
			||||
 * @license http://www.yiiframework.com/license/ | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
defined('YII_DEBUG') or define('YII_DEBUG', false); | 
				
			||||
 | 
				
			||||
// fcgi doesn't have STDIN defined by default | 
				
			||||
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); | 
				
			||||
 | 
				
			||||
require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php'); | 
				
			||||
require(__DIR__ . '/vendor/autoload.php'); | 
				
			||||
Yii::importNamespaces(require(__DIR__ . '/vendor/composer/autoload_namespaces.php')); | 
				
			||||
 | 
				
			||||
$config = yii\helpers\ArrayHelper::merge( | 
				
			||||
	require(__DIR__ . '/console/config/main.php'), | 
				
			||||
	require(__DIR__ . '/console/config/main-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
$application = new yii\console\Application($config); | 
				
			||||
return $application->run(); | 
				
			||||
@ -0,0 +1,2 @@
					 | 
				
			||||
main-local.php | 
				
			||||
params-local.php | 
				
			||||
@ -0,0 +1,28 @@
					 | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * @link http://www.yiiframework.com/ | 
				
			||||
 * @copyright Copyright (c) 2008 Yii Software LLC | 
				
			||||
 * @license http://www.yiiframework.com/license/ | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
namespace frontend\config; | 
				
			||||
use yii\web\AssetBundle; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author Qiang Xue <qiang.xue@gmail.com> | 
				
			||||
 * @since 2.0 | 
				
			||||
 */ | 
				
			||||
class AppAsset extends AssetBundle | 
				
			||||
{ | 
				
			||||
	public $basePath = '@webroot'; | 
				
			||||
	public $baseUrl = '@web'; | 
				
			||||
	public $css = array( | 
				
			||||
		'css/site.css', | 
				
			||||
	); | 
				
			||||
	public $js = array( | 
				
			||||
	); | 
				
			||||
	public $depends = array( | 
				
			||||
		'yii\web\YiiAsset', | 
				
			||||
		'yii\bootstrap\BootstrapAsset', | 
				
			||||
	); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,35 @@
					 | 
				
			||||
<?php | 
				
			||||
$rootDir = __DIR__ . '/../..'; | 
				
			||||
 | 
				
			||||
$params = array_merge( | 
				
			||||
	require($rootDir . '/common/config/params.php'), | 
				
			||||
	require($rootDir . '/common/config/params-local.php'), | 
				
			||||
	require(__DIR__ . '/params.php'), | 
				
			||||
	require(__DIR__ . '/params-local.php') | 
				
			||||
); | 
				
			||||
 | 
				
			||||
return array( | 
				
			||||
	'id' => 'app-frontend', | 
				
			||||
	'basePath' => dirname(__DIR__), | 
				
			||||
	'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', | 
				
			||||
	'controllerNamespace' => 'frontend\controllers', | 
				
			||||
	'modules' => array( | 
				
			||||
	), | 
				
			||||
	'components' => array( | 
				
			||||
		'db' => $params['components.db'], | 
				
			||||
		'cache' => $params['components.cache'], | 
				
			||||
		'user' => array( | 
				
			||||
			'class' => 'yii\web\User', | 
				
			||||
			'identityClass' => 'common\models\User', | 
				
			||||
		), | 
				
			||||
		'log' => array( | 
				
			||||
			'targets' => array( | 
				
			||||
				array( | 
				
			||||
					'class' => 'yii\log\FileTarget', | 
				
			||||
					'levels' => array('error', 'warning'), | 
				
			||||
				), | 
				
			||||
			), | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
	'params' => $params, | 
				
			||||
); | 
				
			||||
@ -0,0 +1,5 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
return array( | 
				
			||||
	'adminEmail' => 'admin@example.com', | 
				
			||||
); | 
				
			||||
@ -0,0 +1,146 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
namespace frontend\controllers; | 
				
			||||
 | 
				
			||||
use Yii; | 
				
			||||
use yii\web\Controller; | 
				
			||||
use common\models\LoginForm; | 
				
			||||
use frontend\models\ContactForm; | 
				
			||||
use common\models\User; | 
				
			||||
use yii\web\HttpException; | 
				
			||||
use yii\helpers\Security; | 
				
			||||
 | 
				
			||||
class SiteController extends Controller | 
				
			||||
{ | 
				
			||||
	public function actions() | 
				
			||||
	{ | 
				
			||||
		return array( | 
				
			||||
			'captcha' => array( | 
				
			||||
				'class' => 'yii\captcha\CaptchaAction', | 
				
			||||
			), | 
				
			||||
		); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionIndex() | 
				
			||||
	{ | 
				
			||||
		return $this->render('index'); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionLogin() | 
				
			||||
	{ | 
				
			||||
		$model = new LoginForm(); | 
				
			||||
		if ($model->load($_POST) && $model->login()) { | 
				
			||||
			return $this->redirect(array('site/index')); | 
				
			||||
		} else { | 
				
			||||
			return $this->render('login', array( | 
				
			||||
				'model' => $model, | 
				
			||||
			)); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionLogout() | 
				
			||||
	{ | 
				
			||||
		Yii::$app->user->logout(); | 
				
			||||
		return $this->redirect(array('site/index')); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionContact() | 
				
			||||
	{ | 
				
			||||
		$model = new ContactForm; | 
				
			||||
		if ($model->load($_POST) && $model->contact(Yii::$app->params['adminEmail'])) { | 
				
			||||
			Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.'); | 
				
			||||
			return $this->refresh(); | 
				
			||||
		} else { | 
				
			||||
			return $this->render('contact', array( | 
				
			||||
				'model' => $model, | 
				
			||||
			)); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionAbout() | 
				
			||||
	{ | 
				
			||||
		return $this->render('about'); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionSignup() | 
				
			||||
	{ | 
				
			||||
		$model = new User(); | 
				
			||||
		$model->setScenario('signup'); | 
				
			||||
		if ($model->load($_POST) && $model->save()) { | 
				
			||||
			if (Yii::$app->getUser()->login($model)) { | 
				
			||||
				$this->redirect('index'); | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		return $this->render('signup', array( | 
				
			||||
			'model' => $model, | 
				
			||||
		)); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionRequestPasswordReset() | 
				
			||||
	{ | 
				
			||||
		$model = new User(); | 
				
			||||
		$model->scenario = 'requestPasswordResetToken'; | 
				
			||||
		if ($model->load($_POST) && $model->validate()) { | 
				
			||||
			if ($this->sendPasswordResetEmail($model->email)) { | 
				
			||||
				Yii::$app->getSession()->setFlash('success', 'Check your email for further instructions.'); | 
				
			||||
				$this->redirect('index'); | 
				
			||||
			} else { | 
				
			||||
				Yii::$app->getSession()->setFlash('error', 'There was an error sending email.'); | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		return $this->render('requestPasswordResetToken', array( | 
				
			||||
			'model' => $model, | 
				
			||||
		)); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function actionResetPassword($token) | 
				
			||||
	{ | 
				
			||||
		$model = User::find(array( | 
				
			||||
			'password_reset_token' => $token, | 
				
			||||
			'status' => User::STATUS_ACTIVE, | 
				
			||||
		)); | 
				
			||||
 | 
				
			||||
		if (!$model) { | 
				
			||||
			throw new HttpException(400, 'Wrong password reset token.'); | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		$model->scenario = 'resetPassword'; | 
				
			||||
		if ($model->load($_POST) && $model->save()) { | 
				
			||||
			Yii::$app->getSession()->setFlash('success', 'New password was saved.'); | 
				
			||||
			$this->redirect('index'); | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		return $this->render('resetPassword', array( | 
				
			||||
			'model' => $model, | 
				
			||||
		)); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	private function sendPasswordResetEmail($email) | 
				
			||||
	{ | 
				
			||||
		$user = User::find(array( | 
				
			||||
			'status' => User::STATUS_ACTIVE, | 
				
			||||
			'email' => $email, | 
				
			||||
		)); | 
				
			||||
 | 
				
			||||
		if (!$user) { | 
				
			||||
			return false; | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		$user->password_reset_token = Security::generateRandomKey(); | 
				
			||||
		if ($user->save(false)) { | 
				
			||||
			$fromEmail = \Yii::$app->params['supportEmail']; | 
				
			||||
			$name = '=?UTF-8?B?' . base64_encode(\Yii::$app->name . ' robot') . '?='; | 
				
			||||
			$subject = '=?UTF-8?B?' . base64_encode('Password reset for ' . \Yii::$app->name) . '?='; | 
				
			||||
			$body = $this->renderPartial('/emails/passwordResetToken', array( | 
				
			||||
				'user' => $user, | 
				
			||||
			)); | 
				
			||||
			$headers = "From: $name <{$fromEmail}>\r\n" . | 
				
			||||
				"MIME-Version: 1.0\r\n" . | 
				
			||||
				"Content-type: text/plain; charset=UTF-8"; | 
				
			||||
			return mail($fromEmail, $subject, $body, $headers); | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		return false; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,63 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
namespace frontend\models; | 
				
			||||
 | 
				
			||||
use yii\base\Model; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * ContactForm is the model behind the contact form. | 
				
			||||
 */ | 
				
			||||
class ContactForm extends Model | 
				
			||||
{ | 
				
			||||
	public $name; | 
				
			||||
	public $email; | 
				
			||||
	public $subject; | 
				
			||||
	public $body; | 
				
			||||
	public $verifyCode; | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * @return array the validation rules. | 
				
			||||
	 */ | 
				
			||||
	public function rules() | 
				
			||||
	{ | 
				
			||||
		return array( | 
				
			||||
			// name, email, subject and body are required | 
				
			||||
			array('name, email, subject, body', 'required'), | 
				
			||||
			// email has to be a valid email address | 
				
			||||
			array('email', 'email'), | 
				
			||||
			// verifyCode needs to be entered correctly | 
				
			||||
			array('verifyCode', 'captcha'), | 
				
			||||
		); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * @return array customized attribute labels | 
				
			||||
	 */ | 
				
			||||
	public function attributeLabels() | 
				
			||||
	{ | 
				
			||||
		return array( | 
				
			||||
			'verifyCode' => 'Verification Code', | 
				
			||||
		); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * Sends an email to the specified email address using the information collected by this model. | 
				
			||||
	 * @param string $email the target email address | 
				
			||||
	 * @return boolean whether the model passes validation | 
				
			||||
	 */ | 
				
			||||
	public function contact($email) | 
				
			||||
	{ | 
				
			||||
		if ($this->validate()) { | 
				
			||||
			$name = '=?UTF-8?B?' . base64_encode($this->name) . '?='; | 
				
			||||
			$subject = '=?UTF-8?B?' . base64_encode($this->subject) . '?='; | 
				
			||||
			$headers = "From: $name <{$this->email}>\r\n" . | 
				
			||||
				"Reply-To: {$this->email}\r\n" . | 
				
			||||
				"MIME-Version: 1.0\r\n" . | 
				
			||||
				"Content-type: text/plain; charset=UTF-8"; | 
				
			||||
			mail($email, $subject, $this->body, $headers); | 
				
			||||
			return true; | 
				
			||||
		} else { | 
				
			||||
			return false; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,2 @@
					 | 
				
			||||
* | 
				
			||||
!.gitignore | 
				
			||||
@ -0,0 +1,16 @@
					 | 
				
			||||
<?php | 
				
			||||
use yii\helpers\Html; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @var yii\base\View $this | 
				
			||||
 * @var common\models\User $user; | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
$resetLink = Yii::$app->urlManager->createAbsoluteUrl('site/reset-password', array('token' => $user->password_reset_token)); | 
				
			||||
?> | 
				
			||||
 | 
				
			||||
Hello <?php echo Html::encode($user->username)?>,
 | 
				
			||||
 | 
				
			||||
Follow the link below to reset your password: | 
				
			||||
 | 
				
			||||
<?php Html::a(Html::encode($resetLink), $resetLink)?> | 
				
			||||
@ -0,0 +1,76 @@
					 | 
				
			||||
<?php | 
				
			||||
use frontend\config\AppAsset; | 
				
			||||
use yii\helpers\Html; | 
				
			||||
use yii\widgets\Menu; | 
				
			||||
use yii\widgets\Breadcrumbs; | 
				
			||||
use frontend\widgets\Alert; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @var $this \yii\base\View | 
				
			||||
 * @var $content string | 
				
			||||
 */ | 
				
			||||
AppAsset::register($this); | 
				
			||||
?> | 
				
			||||
<?php $this->beginPage(); ?> | 
				
			||||
<!DOCTYPE html> | 
				
			||||
<html lang="en"> | 
				
			||||
<head> | 
				
			||||
	<meta charset="utf-8"/> | 
				
			||||
	<title><?php echo Html::encode($this->title); ?></title>
 | 
				
			||||
	<?php $this->head(); ?> | 
				
			||||
</head> | 
				
			||||
<body> | 
				
			||||
<div class="container"> | 
				
			||||
	<?php $this->beginBody(); ?> | 
				
			||||
	<div class="masthead"> | 
				
			||||
		<h3 class="muted">My Company</h3> | 
				
			||||
 | 
				
			||||
		<div class="navbar fullwidth"> | 
				
			||||
			<div class="navbar-inner"> | 
				
			||||
				<div class="container"> | 
				
			||||
					<?php | 
				
			||||
						$menuItems = array( | 
				
			||||
							array('label' => 'Home', 'url' => array('/site/index')), | 
				
			||||
							array('label' => 'About', 'url' => array('/site/about')), | 
				
			||||
							array('label' => 'Contact', 'url' => array('/site/contact')), | 
				
			||||
						); | 
				
			||||
						if (Yii::$app->user->isGuest) { | 
				
			||||
							$menuItems[] = array('label' => 'Signup', 'url' => array('/site/signup')); | 
				
			||||
							$menuItems[] = array('label' => 'Login', 'url' => array('/site/login')); | 
				
			||||
						} | 
				
			||||
						else { | 
				
			||||
							$menuItems[] = array('label' => 'Logout (' . Yii::$app->user->identity->username .')' , 'url' => array('/site/logout')); | 
				
			||||
						} | 
				
			||||
						echo Menu::widget(array( | 
				
			||||
							'options' => array('class' => 'nav'), | 
				
			||||
							'items' => $menuItems, | 
				
			||||
						)); | 
				
			||||
					?> | 
				
			||||
				</div> | 
				
			||||
			</div> | 
				
			||||
		</div> | 
				
			||||
		<!-- /.navbar --> | 
				
			||||
	</div> | 
				
			||||
 | 
				
			||||
	<?php echo Breadcrumbs::widget(array( | 
				
			||||
		'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : array(), | 
				
			||||
	)); ?> | 
				
			||||
 | 
				
			||||
	<?php echo Alert::widget()?> | 
				
			||||
 | 
				
			||||
	<?php echo $content; ?> | 
				
			||||
 | 
				
			||||
	<hr> | 
				
			||||
 | 
				
			||||
	<div class="footer"> | 
				
			||||
		<p>© My Company <?php echo date('Y'); ?></p>
 | 
				
			||||
		<p> | 
				
			||||
			<?php echo Yii::powered(); ?> | 
				
			||||
			Template by <a href="http://twitter.github.io/bootstrap/">Twitter Bootstrap</a> | 
				
			||||
		</p> | 
				
			||||
	</div> | 
				
			||||
	<?php $this->endBody(); ?> | 
				
			||||
</div> | 
				
			||||
</body> | 
				
			||||
</html> | 
				
			||||
<?php $this->endPage(); ?> | 
				
			||||
@ -0,0 +1,47 @@
					 | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * @var yii\base\View $this | 
				
			||||
 */ | 
				
			||||
$this->title = 'Welcome'; | 
				
			||||
?> | 
				
			||||
<div class="jumbotron"> | 
				
			||||
	<h1>Welcome!</h1> | 
				
			||||
 | 
				
			||||
	<p class="lead">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus | 
				
			||||
		commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p> | 
				
			||||
	<a class="btn btn-large btn-success" href="http://www.yiiframework.com">Get started with Yii</a> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<hr> | 
				
			||||
 | 
				
			||||
<!-- Example row of columns --> | 
				
			||||
<div class="row-fluid"> | 
				
			||||
	<div class="span4"> | 
				
			||||
		<h2>Heading</h2> | 
				
			||||
 | 
				
			||||
		<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris | 
				
			||||
			condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. | 
				
			||||
			Donec sed odio dui. </p> | 
				
			||||
 | 
				
			||||
		<p><a class="btn" href="#">View details »</a></p> | 
				
			||||
	</div> | 
				
			||||
	<div class="span4"> | 
				
			||||
		<h2>Heading</h2> | 
				
			||||
 | 
				
			||||
		<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris | 
				
			||||
			condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. | 
				
			||||
			Donec sed odio dui. </p> | 
				
			||||
 | 
				
			||||
		<p><a class="btn" href="#">View details »</a></p> | 
				
			||||
	</div> | 
				
			||||
	<div class="span4"> | 
				
			||||
		<h2>Heading</h2> | 
				
			||||
 | 
				
			||||
		<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta | 
				
			||||
			felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum | 
				
			||||
			massa.</p> | 
				
			||||
 | 
				
			||||
		<p><a class="btn" href="#">View details »</a></p> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
@ -0,0 +1,26 @@
					 | 
				
			||||
<?php | 
				
			||||
use yii\helpers\Html; | 
				
			||||
use yii\widgets\ActiveForm; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @var yii\base\View $this | 
				
			||||
 * @var yii\widgets\ActiveForm $form | 
				
			||||
 * @var app\models\LoginForm $model | 
				
			||||
 */ | 
				
			||||
$this->title = 'Login'; | 
				
			||||
$this->params['breadcrumbs'][] = $this->title; | 
				
			||||
?> | 
				
			||||
<h1><?php echo Html::encode($this->title); ?></h1>
 | 
				
			||||
 | 
				
			||||
<p>Please fill out the following fields to login:</p> | 
				
			||||
 | 
				
			||||
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?> | 
				
			||||
	<?php echo $form->field($model, 'username')->textInput(); ?> | 
				
			||||
	<?php echo $form->field($model, 'password')->passwordInput(); ?> | 
				
			||||
	<?php echo $form->field($model, 'rememberMe')->checkbox(); ?> | 
				
			||||
	<div class="form-actions"> | 
				
			||||
		<?php echo Html::submitButton('Login', array('class' => 'btn btn-primary')); ?> | 
				
			||||
	</div> | 
				
			||||
<?php ActiveForm::end(); ?> | 
				
			||||
 | 
				
			||||
<p>If you forgot your password you can <?php echo Html::a('reset it', array('site/request-password-reset'))?>.</p>
 | 
				
			||||
@ -0,0 +1,22 @@
					 | 
				
			||||
<?php | 
				
			||||
use yii\helpers\Html; | 
				
			||||
use yii\widgets\ActiveForm; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @var yii\base\View $this | 
				
			||||
 * @var yii\widgets\ActiveForm $form | 
				
			||||
 * @var frontend\models\User $model | 
				
			||||
 */ | 
				
			||||
$this->title = 'Request password reset'; | 
				
			||||
$this->params['breadcrumbs'][] = $this->title; | 
				
			||||
?> | 
				
			||||
<h1><?php echo Html::encode($this->title); ?></h1>
 | 
				
			||||
 | 
				
			||||
<p>Please fill out your email. A link to reset password will be sent there.</p> | 
				
			||||
 | 
				
			||||
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?> | 
				
			||||
	<?php echo $form->field($model, 'email')->textInput(); ?> | 
				
			||||
	<div class="form-actions"> | 
				
			||||
		<?php echo Html::submitButton('Send', array('class' => 'btn btn-primary')); ?> | 
				
			||||
	</div> | 
				
			||||
<?php ActiveForm::end(); ?> | 
				
			||||
@ -0,0 +1,22 @@
					 | 
				
			||||
<?php | 
				
			||||
use yii\helpers\Html; | 
				
			||||
use yii\widgets\ActiveForm; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @var yii\base\View $this | 
				
			||||
 * @var yii\widgets\ActiveForm $form | 
				
			||||
 * @var common\models\User $model | 
				
			||||
 */ | 
				
			||||
$this->title = 'Reset password'; | 
				
			||||
$this->params['breadcrumbs'][] = $this->title; | 
				
			||||
?> | 
				
			||||
<h1><?php echo Html::encode($this->title); ?></h1>
 | 
				
			||||
 | 
				
			||||
<p>Please choose your new password:</p> | 
				
			||||
 | 
				
			||||
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?> | 
				
			||||
	<?php echo $form->field($model, 'password')->passwordInput(); ?> | 
				
			||||
	<div class="form-actions"> | 
				
			||||
		<?php echo Html::submitButton('Save', array('class' => 'btn btn-primary')); ?> | 
				
			||||
	</div> | 
				
			||||
<?php ActiveForm::end(); ?> | 
				
			||||
@ -0,0 +1,24 @@
					 | 
				
			||||
<?php | 
				
			||||
use yii\helpers\Html; | 
				
			||||
use yii\widgets\ActiveForm; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @var yii\base\View $this | 
				
			||||
 * @var yii\widgets\ActiveForm $form | 
				
			||||
 * @var common\models\User $model | 
				
			||||
 */ | 
				
			||||
$this->title = 'Signup'; | 
				
			||||
$this->params['breadcrumbs'][] = $this->title; | 
				
			||||
?> | 
				
			||||
<h1><?php echo Html::encode($this->title); ?></h1>
 | 
				
			||||
 | 
				
			||||
<p>Please fill out the following fields to signup:</p> | 
				
			||||
 | 
				
			||||
<?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); ?> | 
				
			||||
	<?php echo $form->field($model, 'username')->textInput(); ?> | 
				
			||||
	<?php echo $form->field($model, 'email')->textInput(); ?> | 
				
			||||
	<?php echo $form->field($model, 'password')->passwordInput(); ?> | 
				
			||||
	<div class="form-actions"> | 
				
			||||
		<?php echo Html::submitButton('Signup', array('class' => 'btn btn-primary')); ?> | 
				
			||||
	</div> | 
				
			||||
<?php ActiveForm::end(); ?> | 
				
			||||
@ -0,0 +1,2 @@
					 | 
				
			||||
* | 
				
			||||
!.gitignore | 
				
			||||
@ -0,0 +1,78 @@
					 | 
				
			||||
body { | 
				
			||||
	padding-top: 20px; | 
				
			||||
	padding-bottom: 60px; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Custom container */ | 
				
			||||
.container { | 
				
			||||
	margin: 0 auto; | 
				
			||||
	max-width: 1000px; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.container > hr { | 
				
			||||
	margin: 60px 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Main marketing message and sign up button */ | 
				
			||||
.jumbotron { | 
				
			||||
	margin: 80px 0; | 
				
			||||
	text-align: center; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.jumbotron h1 { | 
				
			||||
	font-size: 100px; | 
				
			||||
	line-height: 1; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.jumbotron .lead { | 
				
			||||
	font-size: 24px; | 
				
			||||
	line-height: 1.25; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.jumbotron .btn { | 
				
			||||
	font-size: 21px; | 
				
			||||
	padding: 14px 24px; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Supporting marketing content */ | 
				
			||||
.marketing { | 
				
			||||
	margin: 60px 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.marketing p + h4 { | 
				
			||||
	margin-top: 28px; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Customize the navbar links to be fill the entire space of the .navbar */ | 
				
			||||
.navbar.fullwidth .navbar-inner { | 
				
			||||
	padding: 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.navbar.fullwidth .nav { | 
				
			||||
	margin: 0; | 
				
			||||
	display: table; | 
				
			||||
	width: 100%; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.navbar.fullwidth .nav li { | 
				
			||||
	display: table-cell; | 
				
			||||
	width: 1%; | 
				
			||||
	float: none; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.navbar.fullwidth .nav li a { | 
				
			||||
	font-weight: bold; | 
				
			||||
	text-align: center; | 
				
			||||
	border-left: 1px solid rgba(255, 255, 255, .75); | 
				
			||||
	border-right: 1px solid rgba(0, 0, 0, .1); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.navbar.fullwidth .nav li:first-child a { | 
				
			||||
	border-left: 0; | 
				
			||||
	border-radius: 3px 0 0 3px; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.navbar.fullwidth .nav li:last-child a { | 
				
			||||
	border-right: 0; | 
				
			||||
	border-radius: 0 3px 3px 0; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,48 @@
					 | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * @link http://www.yiiframework.com/ | 
				
			||||
 * @copyright Copyright (c) 2008 Yii Software LLC | 
				
			||||
 * @license http://www.yiiframework.com/license/ | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
namespace frontend\widgets; | 
				
			||||
 | 
				
			||||
use yii\helpers\Html; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Alert widget renders a message from session flash. You can set message as following: | 
				
			||||
 * | 
				
			||||
 * - \Yii::$app->getSession()->setFlash('error', 'This is the message'); | 
				
			||||
 * - \Yii::$app->getSession()->setFlash('success', 'This is the message'); | 
				
			||||
 * - \Yii::$app->getSession()->setFlash('info', 'This is the message'); | 
				
			||||
 * | 
				
			||||
 * @author Alexander Makarov <sam@rmcerative.ru> | 
				
			||||
 */ | 
				
			||||
class Alert extends \yii\bootstrap\Alert | 
				
			||||
{ | 
				
			||||
	private $_doNotRender = false; | 
				
			||||
	public function init() | 
				
			||||
	{ | 
				
			||||
		if ($this->body = \Yii::$app->getSession()->getFlash('error')) { | 
				
			||||
			Html::addCssClass($this->options, 'alert-error'); | 
				
			||||
		} elseif ($this->body = \Yii::$app->getSession()->getFlash('success')) { | 
				
			||||
			Html::addCssClass($this->options, 'alert-success'); | 
				
			||||
		} elseif ($this->body = \Yii::$app->getSession()->getFlash('info')) { | 
				
			||||
			Html::addCssClass($this->options, 'alert-info'); | 
				
			||||
		} elseif ($this->body = \Yii::$app->getSession()->getFlash('warning')) { | 
				
			||||
 | 
				
			||||
		} else { | 
				
			||||
			$this->_doNotRender = true; | 
				
			||||
			return; | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		parent::init(); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	public function run() | 
				
			||||
	{ | 
				
			||||
		if (!$this->_doNotRender) { | 
				
			||||
			parent::run(); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,112 @@
					 | 
				
			||||
#!/usr/bin/env php | 
				
			||||
<?php | 
				
			||||
$root = str_replace('\\', '/', __DIR__); | 
				
			||||
$envs = require("$root/environments/index.php"); | 
				
			||||
$envNames = array_keys($envs); | 
				
			||||
 | 
				
			||||
echo "Yii Application Init Tool v1.0\n\n"; | 
				
			||||
echo "Which environment do you want the application to be initialized in?\n\n"; | 
				
			||||
foreach ($envNames as $i => $name) { | 
				
			||||
	echo "  [$i] $name\n"; | 
				
			||||
} | 
				
			||||
echo "\n  Your choice [0-" . (count($envs) - 1) . ', or "q" to quit] '; | 
				
			||||
$answer = trim(fgets(STDIN)); | 
				
			||||
if (!ctype_digit($answer) || !isset($envNames[$answer])) { | 
				
			||||
	echo "\n  Quit initialization.\n"; | 
				
			||||
	return; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$env = $envs[$envNames[$answer]]; | 
				
			||||
echo "\n  Initialize the application under '{$envNames[$answer]}' environment? [yes|no] "; | 
				
			||||
$answer = trim(fgets(STDIN)); | 
				
			||||
if (strncasecmp($answer, 'y', 1)) { | 
				
			||||
	echo "\n  Quit initialization.\n"; | 
				
			||||
	return; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
echo "\n  Start initialization ...\n\n"; | 
				
			||||
$files = getFileList("$root/environments/{$env['path']}"); | 
				
			||||
$all = false; | 
				
			||||
foreach ($files as $file) { | 
				
			||||
	if (!copyFile($root, "environments/{$env['path']}/$file", $file, $all)) { | 
				
			||||
		break; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
if (isset($env['writable'])) { | 
				
			||||
	foreach ($env['writable'] as $writable) { | 
				
			||||
		echo "      chmod 0777 $writable\n"; | 
				
			||||
		@chmod("$root/$writable", 0777); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
if (isset($env['executable'])) { | 
				
			||||
	foreach ($env['executable'] as $executable) { | 
				
			||||
		echo "      chmod 0755 $executable\n"; | 
				
			||||
		@chmod("$root/$executable", 0755); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
echo "\n  ... initialization completed.\n\n"; | 
				
			||||
 | 
				
			||||
function getFileList($root, $basePath = '') | 
				
			||||
{ | 
				
			||||
	$files = array(); | 
				
			||||
	$handle = opendir($root); | 
				
			||||
	while (($path = readdir($handle)) !== false) { | 
				
			||||
		if ($path === '.svn' || $path === '.' || $path === '..') { | 
				
			||||
			continue; | 
				
			||||
		} | 
				
			||||
		$fullPath = "$root/$path"; | 
				
			||||
		$relativePath = $basePath === '' ? $path : "$basePath/$path"; | 
				
			||||
		if (is_dir($fullPath)) { | 
				
			||||
			$files = array_merge($files, getFileList($fullPath, $relativePath)); | 
				
			||||
		} else { | 
				
			||||
			$files[] = $relativePath; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
	closedir($handle); | 
				
			||||
	return $files; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
function copyFile($root, $source, $target, &$all) | 
				
			||||
{ | 
				
			||||
	if (!is_file($root . '/' . $source)) { | 
				
			||||
		echo "       skip $target ($source not exist)\n"; | 
				
			||||
		return true; | 
				
			||||
	} | 
				
			||||
	if (is_file($root . '/' . $target)) { | 
				
			||||
		if (file_get_contents($root . '/' . $source) === file_get_contents($root . '/' . $target)) { | 
				
			||||
			echo "  unchanged $target\n"; | 
				
			||||
			return true; | 
				
			||||
		} | 
				
			||||
		if ($all) { | 
				
			||||
			echo "  overwrite $target\n"; | 
				
			||||
		} else { | 
				
			||||
			echo "      exist $target\n"; | 
				
			||||
			echo "            ...overwrite? [Yes|No|All|Quit] "; | 
				
			||||
			$answer = trim(fgets(STDIN)); | 
				
			||||
			if (!strncasecmp($answer, 'q', 1)) { | 
				
			||||
				return false; | 
				
			||||
			} else { | 
				
			||||
				if (!strncasecmp($answer, 'y', 1)) { | 
				
			||||
					echo "  overwrite $target\n"; | 
				
			||||
				} else { | 
				
			||||
					if (!strncasecmp($answer, 'a', 1)) { | 
				
			||||
						echo "  overwrite $target\n"; | 
				
			||||
						$all = true; | 
				
			||||
					} else { | 
				
			||||
						echo "       skip $target\n"; | 
				
			||||
						return true; | 
				
			||||
					} | 
				
			||||
				} | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source)); | 
				
			||||
		return true; | 
				
			||||
	} | 
				
			||||
	echo "   generate $target\n"; | 
				
			||||
	@mkdir(dirname($root . '/' . $target), 0777, true); | 
				
			||||
	file_put_contents($root . '/' . $target, file_get_contents($root . '/' . $source)); | 
				
			||||
	return true; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,20 @@
					 | 
				
			||||
@echo off | 
				
			||||
 | 
				
			||||
rem ------------------------------------------------------------- | 
				
			||||
rem  Yii command line init script for Windows. | 
				
			||||
rem | 
				
			||||
rem  @author Qiang Xue <qiang.xue@gmail.com> | 
				
			||||
rem  @link http://www.yiiframework.com/ | 
				
			||||
rem  @copyright Copyright © 2012 Yii Software LLC | 
				
			||||
rem  @license http://www.yiiframework.com/license/ | 
				
			||||
rem ------------------------------------------------------------- | 
				
			||||
 | 
				
			||||
@setlocal | 
				
			||||
 | 
				
			||||
set YII_PATH=%~dp0 | 
				
			||||
 | 
				
			||||
if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe | 
				
			||||
 | 
				
			||||
"%PHP_COMMAND%" "%YII_PATH%init" %* | 
				
			||||
 | 
				
			||||
@endlocal | 
				
			||||
@ -0,0 +1,32 @@
					 | 
				
			||||
The Yii framework is free software. It is released under the terms of | 
				
			||||
the following BSD License. | 
				
			||||
 | 
				
			||||
Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) | 
				
			||||
All rights reserved. | 
				
			||||
 | 
				
			||||
Redistribution and use in source and binary forms, with or without | 
				
			||||
modification, are permitted provided that the following conditions | 
				
			||||
are met: | 
				
			||||
 | 
				
			||||
 * Redistributions of source code must retain the above copyright | 
				
			||||
   notice, this list of conditions and the following disclaimer. | 
				
			||||
 * Redistributions in binary form must reproduce the above copyright | 
				
			||||
   notice, this list of conditions and the following disclaimer in | 
				
			||||
   the documentation and/or other materials provided with the | 
				
			||||
   distribution. | 
				
			||||
 * Neither the name of Yii Software LLC nor the names of its | 
				
			||||
   contributors may be used to endorse or promote products derived | 
				
			||||
   from this software without specific prior written permission. | 
				
			||||
 | 
				
			||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
				
			||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
				
			||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | 
				
			||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | 
				
			||||
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | 
				
			||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | 
				
			||||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
				
			||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
				
			||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
				
			||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | 
				
			||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
				
			||||
POSSIBILITY OF SUCH DAMAGE. | 
				
			||||
@ -0,0 +1,18 @@
					 | 
				
			||||
paths: | 
				
			||||
    tests: tests | 
				
			||||
    log: tests/_log | 
				
			||||
    data: tests/_data | 
				
			||||
    helpers: tests/_helpers | 
				
			||||
settings: | 
				
			||||
    bootstrap: _bootstrap.php | 
				
			||||
    suite_class: \PHPUnit_Framework_TestSuite | 
				
			||||
    colors: true | 
				
			||||
    memory_limit: 1024M | 
				
			||||
    log: true | 
				
			||||
modules: | 
				
			||||
    config: | 
				
			||||
        Db: | 
				
			||||
            dsn: '' | 
				
			||||
            user: '' | 
				
			||||
            password: '' | 
				
			||||
            dump: tests/_data/dump.sql | 
				
			||||
@ -0,0 +1,29 @@
					 | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * @link http://www.yiiframework.com/ | 
				
			||||
 * @copyright Copyright (c) 2008 Yii Software LLC | 
				
			||||
 * @license http://www.yiiframework.com/license/ | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
namespace app\config; | 
				
			||||
 | 
				
			||||
use yii\web\AssetBundle; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author Qiang Xue <qiang.xue@gmail.com> | 
				
			||||
 * @since 2.0 | 
				
			||||
 */ | 
				
			||||
class AppAsset extends AssetBundle | 
				
			||||
{ | 
				
			||||
	public $basePath = '@webroot'; | 
				
			||||
	public $baseUrl = '@web'; | 
				
			||||
	public $css = array( | 
				
			||||
		'css/site.css', | 
				
			||||
	); | 
				
			||||
	public $js = array( | 
				
			||||
	); | 
				
			||||
	public $depends = array( | 
				
			||||
		'yii\web\YiiAsset', | 
				
			||||
		'yii\bootstrap\BootstrapAsset', | 
				
			||||
	); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,5 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
return array( | 
				
			||||
	'adminEmail' => 'admin@example.com', | 
				
			||||
); | 
				
			||||
@ -0,0 +1,7 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
$config = require(__DIR__ . '/web.php'); | 
				
			||||
 | 
				
			||||
// ... customize $config for the "test" environment here... | 
				
			||||
 | 
				
			||||
return $config; | 
				
			||||
@ -0,0 +1,35 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
$config = array( | 
				
			||||
	'id' => 'bootstrap', | 
				
			||||
	'basePath' => dirname(__DIR__), | 
				
			||||
	'components' => array( | 
				
			||||
		'cache' => array( | 
				
			||||
			'class' => 'yii\caching\FileCache', | 
				
			||||
		), | 
				
			||||
		'user' => array( | 
				
			||||
			'identityClass' => 'app\models\User', | 
				
			||||
		), | 
				
			||||
		'errorHandler' => array( | 
				
			||||
			'errorAction' => 'site/error', | 
				
			||||
		), | 
				
			||||
		'log' => array( | 
				
			||||
			'traceLevel' => YII_DEBUG ? 3 : 0, | 
				
			||||
			'targets' => array( | 
				
			||||
				array( | 
				
			||||
					'class' => 'yii\log\FileTarget', | 
				
			||||
					'levels' => array('error', 'warning'), | 
				
			||||
				), | 
				
			||||
			), | 
				
			||||
		), | 
				
			||||
	), | 
				
			||||
	'params' => require(__DIR__ . '/params.php'), | 
				
			||||
); | 
				
			||||
 | 
				
			||||
if (YII_ENV_DEV) { | 
				
			||||
	$config['preload'][] = 'debug'; | 
				
			||||
	$config['modules']['debug'] = 'yii\debug\Module'; | 
				
			||||
	$config['modules']['gii'] = 'yii\gii\Module'; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
return $config; | 
				
			||||
@ -0,0 +1,103 @@
					 | 
				
			||||
<?php | 
				
			||||
/** | 
				
			||||
 * Application requirement checker script. | 
				
			||||
 * | 
				
			||||
 * In order to run this script use the following console command: | 
				
			||||
 * php requirements.php | 
				
			||||
 * | 
				
			||||
 * In order to run this script from the web, you should copy it to the web root. | 
				
			||||
 * If you are using Linux you can create a hard link instead, using the following command: | 
				
			||||
 * ln requirements.php ../requirements.php | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
// you may need to adjust this path to the correct Yii framework path | 
				
			||||
$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2/yii'; | 
				
			||||
 | 
				
			||||
if (!is_dir($frameworkPath)) { | 
				
			||||
	echo '<h1>Error</h1>'; | 
				
			||||
	echo '<p><strong>The path to yii framework seems to be incorrect.</strong></p>'; | 
				
			||||
	echo '<p>You need to install Yii framework via composer or adjust the framework path in file <abbr title="' . __FILE__ . '">' . basename(__FILE__) .'</abbr>.</p>'; | 
				
			||||
	echo '<p>Please refer to the <abbr title="' . dirname(__FILE__) . '/README.md">README</abbr> on how to install Yii.</p>'; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
require_once($frameworkPath . '/requirements/YiiRequirementChecker.php'); | 
				
			||||
$requirementsChecker = new YiiRequirementChecker(); | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Adjust requirements according to your application specifics. | 
				
			||||
 */ | 
				
			||||
$requirements = array( | 
				
			||||
	// Database : | 
				
			||||
	array( | 
				
			||||
		'name' => 'PDO extension', | 
				
			||||
		'mandatory' => true, | 
				
			||||
		'condition' => extension_loaded('pdo'), | 
				
			||||
		'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>', | 
				
			||||
	), | 
				
			||||
	array( | 
				
			||||
		'name' => 'PDO SQLite extension', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => extension_loaded('pdo_sqlite'), | 
				
			||||
		'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>', | 
				
			||||
		'memo' => 'Required for SQLite database.', | 
				
			||||
	), | 
				
			||||
	array( | 
				
			||||
		'name' => 'PDO MySQL extension', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => extension_loaded('pdo_mysql'), | 
				
			||||
		'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>', | 
				
			||||
		'memo' => 'Required for MySQL database.', | 
				
			||||
	), | 
				
			||||
	// Cache : | 
				
			||||
	array( | 
				
			||||
		'name' => 'Memcache extension', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => extension_loaded('memcache') || extension_loaded('memcached'), | 
				
			||||
		'by' => '<a href="http://www.yiiframework.com/doc/api/CMemCache">CMemCache</a>', | 
				
			||||
		'memo' => extension_loaded('memcached') ? 'To use memcached set <a href="http://www.yiiframework.com/doc/api/CMemCache#useMemcached-detail">CMemCache::useMemcached</a> to <code>true</code>.' : '' | 
				
			||||
	), | 
				
			||||
	array( | 
				
			||||
		'name' => 'APC extension', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => extension_loaded('apc') || extension_loaded('apc'), | 
				
			||||
		'by' => '<a href="http://www.yiiframework.com/doc/api/CApcCache">CApcCache</a>', | 
				
			||||
	), | 
				
			||||
	// Additional PHP extensions : | 
				
			||||
	array( | 
				
			||||
		'name' => 'Mcrypt extension', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => extension_loaded('mcrypt'), | 
				
			||||
		'by' => '<a href="http://www.yiiframework.com/doc/api/CSecurityManager">CSecurityManager</a>', | 
				
			||||
		'memo' => 'Required by encrypt and decrypt methods.' | 
				
			||||
	), | 
				
			||||
	// PHP ini : | 
				
			||||
	'phpSafeMode' => array( | 
				
			||||
		'name' => 'PHP safe mode', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => $requirementsChecker->checkPhpIniOff("safe_mode"), | 
				
			||||
		'by' => 'File uploading and console command execution', | 
				
			||||
		'memo' => '"safe_mode" should be disabled at php.ini', | 
				
			||||
	), | 
				
			||||
	'phpExposePhp' => array( | 
				
			||||
		'name' => 'Expose PHP', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => $requirementsChecker->checkPhpIniOff("expose_php"), | 
				
			||||
		'by' => 'Security reasons', | 
				
			||||
		'memo' => '"expose_php" should be disabled at php.ini', | 
				
			||||
	), | 
				
			||||
	'phpAllowUrlInclude' => array( | 
				
			||||
		'name' => 'PHP allow url include', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"), | 
				
			||||
		'by' => 'Security reasons', | 
				
			||||
		'memo' => '"allow_url_include" should be disabled at php.ini', | 
				
			||||
	), | 
				
			||||
	'phpSmtp' => array( | 
				
			||||
		'name' => 'PHP mail SMTP', | 
				
			||||
		'mandatory' => false, | 
				
			||||
		'condition' => strlen(ini_get('SMTP'))>0, | 
				
			||||
		'by' => 'Email sending', | 
				
			||||
		'memo' => 'PHP mail SMTP server required', | 
				
			||||
	), | 
				
			||||
); | 
				
			||||
$requirementsChecker->checkYii()->check($requirements)->render(); | 
				
			||||
@ -0,0 +1 @@
					 | 
				
			||||
/* Replace this file with actual dump of your database */ | 
				
			||||
@ -0,0 +1,8 @@
					 | 
				
			||||
<?php | 
				
			||||
namespace Codeception\Module; | 
				
			||||
 | 
				
			||||
// here you can define custom functions for CodeGuy  | 
				
			||||
 | 
				
			||||
class CodeHelper extends \Codeception\Module | 
				
			||||
{ | 
				
			||||
} | 
				
			||||
@ -0,0 +1,8 @@
					 | 
				
			||||
<?php | 
				
			||||
namespace Codeception\Module; | 
				
			||||
 | 
				
			||||
// here you can define custom functions for TestGuy  | 
				
			||||
 | 
				
			||||
class TestHelper extends \Codeception\Module | 
				
			||||
{ | 
				
			||||
} | 
				
			||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue