diff --git a/apps/advanced/.gitignore b/apps/advanced/.gitignore
new file mode 100644
index 0000000..b1cf719
--- /dev/null
+++ b/apps/advanced/.gitignore
@@ -0,0 +1 @@
+/yii
\ No newline at end of file
diff --git a/apps/advanced/LICENSE.md b/apps/advanced/LICENSE.md
new file mode 100644
index 0000000..6edcc4f
--- /dev/null
+++ b/apps/advanced/LICENSE.md
@@ -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.
\ No newline at end of file
diff --git a/apps/advanced/README.md b/apps/advanced/README.md
new file mode 100644
index 0000000..a2bcdd4
--- /dev/null
+++ b/apps/advanced/README.md
@@ -0,0 +1,98 @@
+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 backstage separation,
+deployment in different environments, configuration nesting etc.
+
+
+DIRECTORY STRUCTURE
+-------------------
+
+```
+common
+ config/ contains shared configurations
+ models/ contains model classes used in both backstage 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
+backstage
+ assets/ contains application assets such as JavaScript and CSS
+ config/ contains backstage configurations
+ controllers/ contains Web controller classes
+ models/ contains backstage-specific model classes
+ runtime/ contains files generated during runtime
+ views/ contains view files for the Web application
+ www/ 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
+ www/ 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.?.
+
+
+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 Bootstrap Application using the following command:
+
+~~~
+php composer.phar create-project --stability=dev yiisoft/yii2-app-advanced yii-advanced
+~~~
+
+Now you should be able to access:
+
+- the frontend using the URL `http://localhost/yii-advanced/frontend/www/`
+- the backstage using the URL `http://localhost/yii-advanced/backstage/www/`
+
+assuming `yii-advanced` is directly under the document root of your Web server.
+
+
+### Install from an Archive File
+
+This is not currently available. We will provide it when Yii 2 is formally released.
+
+GETTING STARTED
+---------------
+
+After template application and its dependencies are downloaded you need to initialize it and set some config values to
+match your application requirements.
+
+1. Execute `install` command selecting `dev` as environment.
+2. Set `id` value in `console/config/main.php`, `frontend/config/main.php`, `backstage/config/main.php`.
+3. Create new database. It is assumed that MySQL InnoDB is used. If not, adjust `console/migrations/m130524_201442_init.php`.
+4. In `common/config/params.php` set your database details in `components.db` values.
+
diff --git a/apps/advanced/backstage/assets/.gitkeep b/apps/advanced/backstage/assets/.gitkeep
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/apps/advanced/backstage/assets/.gitkeep
@@ -0,0 +1 @@
+*
diff --git a/apps/advanced/backstage/config/.gitignore b/apps/advanced/backstage/config/.gitignore
new file mode 100644
index 0000000..20da318
--- /dev/null
+++ b/apps/advanced/backstage/config/.gitignore
@@ -0,0 +1,2 @@
+main-local.php
+params-local.php
\ No newline at end of file
diff --git a/apps/advanced/backstage/config/assets.php b/apps/advanced/backstage/config/assets.php
new file mode 100644
index 0000000..ee0d610
--- /dev/null
+++ b/apps/advanced/backstage/config/assets.php
@@ -0,0 +1,18 @@
+ array(
+ 'basePath' => '@wwwroot',
+ 'baseUrl' => '@www',
+ 'css' => array(
+ 'css/site.css',
+ ),
+ 'js' => array(
+
+ ),
+ 'depends' => array(
+ 'yii',
+ 'yii/bootstrap/responsive',
+ ),
+ ),
+);
diff --git a/apps/advanced/backstage/config/main.php b/apps/advanced/backstage/config/main.php
new file mode 100644
index 0000000..d3288bd
--- /dev/null
+++ b/apps/advanced/backstage/config/main.php
@@ -0,0 +1,39 @@
+ 'change-me',
+ 'basePath' => dirname(__DIR__),
+ 'preload' => array('log'),
+ 'controllerNamespace' => 'backstage\controllers',
+ 'modules' => array(
+ ),
+ 'components' => array(
+ 'db' => $params['components.db'],
+ 'cache' => $params['components.cache'],
+ 'user' => array(
+ 'class' => 'yii\web\User',
+ 'identityClass' => 'common\models\User',
+ ),
+ 'assetManager' => array(
+ 'bundles' => require(__DIR__ . '/assets.php'),
+ ),
+ 'log' => array(
+ 'class' => 'yii\logging\Router',
+ 'targets' => array(
+ array(
+ 'class' => 'yii\logging\FileTarget',
+ 'levels' => array('error', 'warning'),
+ ),
+ ),
+ ),
+ ),
+ 'params' => $params,
+);
diff --git a/apps/advanced/backstage/config/params.php b/apps/advanced/backstage/config/params.php
new file mode 100644
index 0000000..1e197d0
--- /dev/null
+++ b/apps/advanced/backstage/config/params.php
@@ -0,0 +1,5 @@
+ 'admin@example.com',
+);
\ No newline at end of file
diff --git a/apps/advanced/backstage/controllers/SiteController.php b/apps/advanced/backstage/controllers/SiteController.php
new file mode 100644
index 0000000..d40738a
--- /dev/null
+++ b/apps/advanced/backstage/controllers/SiteController.php
@@ -0,0 +1,33 @@
+render('index');
+ }
+
+ public function actionLogin()
+ {
+ $model = new LoginForm();
+ if ($this->populate($_POST, $model) && $model->login()) {
+ Yii::$app->response->redirect(array('site/index'));
+ } else {
+ echo $this->render('login', array(
+ 'model' => $model,
+ ));
+ }
+ }
+
+ public function actionLogout()
+ {
+ Yii::$app->getUser()->logout();
+ Yii::$app->getResponse()->redirect(array('site/index'));
+ }
+}
diff --git a/apps/advanced/backstage/models/.gitkeep b/apps/advanced/backstage/models/.gitkeep
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/apps/advanced/backstage/models/.gitkeep
@@ -0,0 +1 @@
+*
diff --git a/apps/advanced/backstage/runtime/.gitignore b/apps/advanced/backstage/runtime/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/apps/advanced/backstage/runtime/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/apps/advanced/backstage/views/layouts/main.php b/apps/advanced/backstage/views/layouts/main.php
new file mode 100644
index 0000000..44117f4
--- /dev/null
+++ b/apps/advanced/backstage/views/layouts/main.php
@@ -0,0 +1,64 @@
+registerAssetBundle('app');
+?>
+beginPage(); ?>
+
+
+
+
+ title); ?>
+ head(); ?>
+
+
+
+ beginBody(); ?>
+
+
+ isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : array(),
+ )); ?>
+
+
+
+
+
+ endBody(); ?>
+
+
+
+
+endPage(); ?>
diff --git a/apps/advanced/backstage/views/site/index.php b/apps/advanced/backstage/views/site/index.php
new file mode 100644
index 0000000..158b61c
--- /dev/null
+++ b/apps/advanced/backstage/views/site/index.php
@@ -0,0 +1,47 @@
+title = 'Welcome';
+?>
+
+
Welcome!
+
+
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.
+
Get started with Yii
+
+
+
+
+
+
+
+
Heading
+
+
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.
+
+
View details »
+
+
+
Heading
+
+
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.
+
+
View details »
+
+
+
Heading
+
+
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.
+
+
View details »
+
+
+
diff --git a/apps/advanced/backstage/views/site/login.php b/apps/advanced/backstage/views/site/login.php
new file mode 100644
index 0000000..f676b98
--- /dev/null
+++ b/apps/advanced/backstage/views/site/login.php
@@ -0,0 +1,24 @@
+title = 'Login';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+title); ?>
+
+Please fill out the following fields to login:
+
+ array('class' => 'form-horizontal'))); ?>
+ field($model, 'username')->textInput(); ?>
+ field($model, 'password')->passwordInput(); ?>
+ field($model, 'rememberMe')->checkbox(); ?>
+
+ 'btn btn-primary')); ?>
+
+
diff --git a/apps/advanced/backstage/www/.gitignore b/apps/advanced/backstage/www/.gitignore
new file mode 100644
index 0000000..148f2b0
--- /dev/null
+++ b/apps/advanced/backstage/www/.gitignore
@@ -0,0 +1 @@
+/index.php
\ No newline at end of file
diff --git a/apps/advanced/backstage/www/assets/.gitignore b/apps/advanced/backstage/www/assets/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/apps/advanced/backstage/www/assets/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/apps/advanced/backstage/www/css/site.css b/apps/advanced/backstage/www/css/site.css
new file mode 100644
index 0000000..890a953
--- /dev/null
+++ b/apps/advanced/backstage/www/css/site.css
@@ -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 .navbar-inner {
+ padding: 0;
+}
+
+.navbar .nav {
+ margin: 0;
+ display: table;
+ width: 100%;
+}
+
+.navbar .nav li {
+ display: table-cell;
+ width: 1%;
+ float: none;
+}
+
+.navbar .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 .nav li:first-child a {
+ border-left: 0;
+ border-radius: 3px 0 0 3px;
+}
+
+.navbar .nav li:last-child a {
+ border-right: 0;
+ border-radius: 0 3px 3px 0;
+}
diff --git a/apps/advanced/common/config/.gitignore b/apps/advanced/common/config/.gitignore
new file mode 100644
index 0000000..46f6eb4
--- /dev/null
+++ b/apps/advanced/common/config/.gitignore
@@ -0,0 +1 @@
+params-local.php
\ No newline at end of file
diff --git a/apps/advanced/common/config/params.php b/apps/advanced/common/config/params.php
new file mode 100644
index 0000000..b9409f9
--- /dev/null
+++ b/apps/advanced/common/config/params.php
@@ -0,0 +1,16 @@
+ 'admin@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' => '',
+ ),
+);
\ No newline at end of file
diff --git a/apps/advanced/common/models/LoginForm.php b/apps/advanced/common/models/LoginForm.php
new file mode 100644
index 0000000..4631dbd
--- /dev/null
+++ b/apps/advanced/common/models/LoginForm.php
@@ -0,0 +1,58 @@
+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;
+ }
+ }
+}
diff --git a/apps/advanced/common/models/User.php b/apps/advanced/common/models/User.php
new file mode 100644
index 0000000..110487e
--- /dev/null
+++ b/apps/advanced/common/models/User.php
@@ -0,0 +1,115 @@
+ array(
+ 'class' => 'yii\behaviors\AutoTimestamp',
+ 'attributes' => array(
+ ActiveRecord::EVENT_BEFORE_INSERT => 'create_time',
+ ActiveRecord::EVENT_BEFORE_INSERT => 'update_time',
+ ActiveRecord::EVENT_BEFORE_UPDATE => 'update_time',
+ ),
+ ),
+ );
+ }
+
+ public static function findIdentity($id)
+ {
+ return static::find($id);
+ }
+
+ public static function findByUsername($username)
+ {
+ return static::find(array('username' => $username, 'status' => static::STATUS_ACTIVE));
+ }
+
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ public function getAuthKey()
+ {
+ return $this->auth_key;
+ }
+
+ public function validateAuthKey($authKey)
+ {
+ return $this->auth_key === $authKey;
+ }
+
+ public function validatePassword($password)
+ {
+ return SecurityHelper::validatePassword($password, $this->password_hash);
+ }
+
+ public function rules()
+ {
+ return array(
+ array('username', 'filter', 'filter' => 'trim'),
+ array('username', 'required'),
+ array('username', 'length', '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.'),
+
+ array('password', 'required'),
+ array('password', 'length', 'min' => 6),
+ );
+ }
+
+ public function scenarios()
+ {
+ return array(
+ 'signup' => array('username', 'email', 'password'),
+ 'login' => array('username', 'password'),
+ );
+ }
+
+ public function beforeSave($insert)
+ {
+ if(parent::beforeSave($insert)) {
+ if($this->isNewRecord) {
+ if(!empty($this->password)) {
+ $this->password_hash = SecurityHelper::generatePasswordHash($this->password);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/apps/advanced/composer.json b/apps/advanced/composer.json
index 824cf4d..db97efd 100644
--- a/apps/advanced/composer.json
+++ b/apps/advanced/composer.json
@@ -17,5 +17,28 @@
"php": ">=5.3.0",
"yiisoft/yii2": "dev-master",
"yiisoft/yii2-composer": "dev-master"
+ },
+ "scripts": {
+ "post-install-cmd": [
+ "yii\\composer\\InstallHandler::setPermissions"
+ ],
+ "post-update-cmd": [
+ "yii\\composer\\InstallHandler::setPermissions"
+ ]
+ },
+ "extra": {
+ "yii-install-writable": [
+ "backstage/runtime",
+ "backstage/www/assets",
+
+ "console/runtime",
+ "console/migrations",
+
+ "frontend/runtime",
+ "frontend/www/assets"
+ ],
+ "yii-install-executable": [
+ "yii"
+ ]
}
}
diff --git a/apps/advanced/console/config/.gitignore b/apps/advanced/console/config/.gitignore
new file mode 100644
index 0000000..20da318
--- /dev/null
+++ b/apps/advanced/console/config/.gitignore
@@ -0,0 +1,2 @@
+main-local.php
+params-local.php
\ No newline at end of file
diff --git a/apps/advanced/console/config/main.php b/apps/advanced/console/config/main.php
new file mode 100644
index 0000000..83cb2e3
--- /dev/null
+++ b/apps/advanced/console/config/main.php
@@ -0,0 +1,32 @@
+ 'change-me',
+ 'basePath' => dirname(__DIR__),
+ 'preload' => array('log'),
+ 'controllerNamespace' => 'console\controllers',
+ 'modules' => array(
+ ),
+ 'components' => array(
+ 'db' => $params['components.db'],
+ 'cache' => $params['components.cache'],
+ 'log' => array(
+ 'class' => 'yii\logging\Router',
+ 'targets' => array(
+ array(
+ 'class' => 'yii\logging\FileTarget',
+ 'levels' => array('error', 'warning'),
+ ),
+ ),
+ ),
+ ),
+ 'params' => $params,
+);
diff --git a/apps/advanced/console/config/params.php b/apps/advanced/console/config/params.php
new file mode 100644
index 0000000..1e197d0
--- /dev/null
+++ b/apps/advanced/console/config/params.php
@@ -0,0 +1,5 @@
+ 'admin@example.com',
+);
\ No newline at end of file
diff --git a/apps/advanced/console/controllers/.gitkeep b/apps/advanced/console/controllers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/apps/advanced/console/migrations/m130524_201442_init.php b/apps/advanced/console/migrations/m130524_201442_init.php
new file mode 100644
index 0000000..24a74c3
--- /dev/null
+++ b/apps/advanced/console/migrations/m130524_201442_init.php
@@ -0,0 +1,27 @@
+createTable('tbl_user', array(
+ 'id' => Schema::TYPE_PK,
+ 'username' => Schema::TYPE_STRING.' NOT NULL',
+ 'password_hash' => Schema::TYPE_STRING.' NOT NULL',
+ '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');
+ }
+}
diff --git a/apps/advanced/console/models/.gitkeep b/apps/advanced/console/models/.gitkeep
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/apps/advanced/console/models/.gitkeep
@@ -0,0 +1 @@
+*
diff --git a/apps/advanced/console/runtime/.gitignore b/apps/advanced/console/runtime/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/apps/advanced/console/runtime/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/apps/advanced/environments/dev/backstage/config/main-local.php b/apps/advanced/environments/dev/backstage/config/main-local.php
new file mode 100644
index 0000000..f74bfa3
--- /dev/null
+++ b/apps/advanced/environments/dev/backstage/config/main-local.php
@@ -0,0 +1,17 @@
+ array(
+// 'debug' => array(
+// 'class' => 'yii\debug\Module',
+// ),
+ ),
+ 'components' => array(
+ 'log' => array(
+ 'targets' => array(
+// array(
+// 'class' => 'yii\logging\DebugTarget',
+// )
+ ),
+ ),
+ ),
+);
diff --git a/apps/advanced/environments/dev/backstage/config/params-local.php b/apps/advanced/environments/dev/backstage/config/params-local.php
new file mode 100644
index 0000000..2670143
--- /dev/null
+++ b/apps/advanced/environments/dev/backstage/config/params-local.php
@@ -0,0 +1,3 @@
+run();
diff --git a/apps/advanced/environments/dev/common/config/params-local.php b/apps/advanced/environments/dev/common/config/params-local.php
new file mode 100644
index 0000000..2670143
--- /dev/null
+++ b/apps/advanced/environments/dev/common/config/params-local.php
@@ -0,0 +1,3 @@
+ array(
+// 'debug' => array(
+// 'class' => 'yii\debug\Module',
+// ),
+ ),
+ 'components' => array(
+ 'log' => array(
+ 'targets' => array(
+// array(
+// 'class' => 'yii\logging\DebugTarget',
+// )
+ ),
+ ),
+ ),
+);
diff --git a/apps/advanced/environments/dev/frontend/config/params-local.php b/apps/advanced/environments/dev/frontend/config/params-local.php
new file mode 100644
index 0000000..2670143
--- /dev/null
+++ b/apps/advanced/environments/dev/frontend/config/params-local.php
@@ -0,0 +1,3 @@
+run();
diff --git a/apps/advanced/environments/dev/yii b/apps/advanced/environments/dev/yii
new file mode 100644
index 0000000..d763217
--- /dev/null
+++ b/apps/advanced/environments/dev/yii
@@ -0,0 +1,25 @@
+#!/usr/bin/env php
+run();
diff --git a/apps/advanced/environments/index.php b/apps/advanced/environments/index.php
new file mode 100644
index 0000000..ff907d2
--- /dev/null
+++ b/apps/advanced/environments/index.php
@@ -0,0 +1,38 @@
+ 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(
+ 'yiic',
+ ),
+ ),
+ 'Production' => array(
+ 'path' => 'prod',
+ 'writable' => array(
+ // handled by composer.json already
+ ),
+ 'executable' => array(
+ 'yiic',
+ ),
+ ),
+);
diff --git a/apps/advanced/environments/prod/backstage/config/main-local.php b/apps/advanced/environments/prod/backstage/config/main-local.php
new file mode 100644
index 0000000..5b61b0e
--- /dev/null
+++ b/apps/advanced/environments/prod/backstage/config/main-local.php
@@ -0,0 +1,3 @@
+run();
diff --git a/apps/advanced/environments/prod/common/config/params-local.php b/apps/advanced/environments/prod/common/config/params-local.php
new file mode 100644
index 0000000..2670143
--- /dev/null
+++ b/apps/advanced/environments/prod/common/config/params-local.php
@@ -0,0 +1,3 @@
+run();
diff --git a/apps/advanced/environments/prod/yii b/apps/advanced/environments/prod/yii
new file mode 100644
index 0000000..395aede
--- /dev/null
+++ b/apps/advanced/environments/prod/yii
@@ -0,0 +1,25 @@
+#!/usr/bin/env php
+run();
diff --git a/apps/advanced/frontend/assets/.gitkeep b/apps/advanced/frontend/assets/.gitkeep
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/apps/advanced/frontend/assets/.gitkeep
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/apps/advanced/frontend/config/.gitignore b/apps/advanced/frontend/config/.gitignore
new file mode 100644
index 0000000..20da318
--- /dev/null
+++ b/apps/advanced/frontend/config/.gitignore
@@ -0,0 +1,2 @@
+main-local.php
+params-local.php
\ No newline at end of file
diff --git a/apps/advanced/frontend/config/assets.php b/apps/advanced/frontend/config/assets.php
new file mode 100644
index 0000000..ee0d610
--- /dev/null
+++ b/apps/advanced/frontend/config/assets.php
@@ -0,0 +1,18 @@
+ array(
+ 'basePath' => '@wwwroot',
+ 'baseUrl' => '@www',
+ 'css' => array(
+ 'css/site.css',
+ ),
+ 'js' => array(
+
+ ),
+ 'depends' => array(
+ 'yii',
+ 'yii/bootstrap/responsive',
+ ),
+ ),
+);
diff --git a/apps/advanced/frontend/config/main.php b/apps/advanced/frontend/config/main.php
new file mode 100644
index 0000000..607c9a9
--- /dev/null
+++ b/apps/advanced/frontend/config/main.php
@@ -0,0 +1,39 @@
+ 'change-me',
+ 'basePath' => dirname(__DIR__),
+ 'preload' => array('log'),
+ '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',
+ ),
+ 'assetManager' => array(
+ 'bundles' => require(__DIR__ . '/assets.php'),
+ ),
+ 'log' => array(
+ 'class' => 'yii\logging\Router',
+ 'targets' => array(
+ array(
+ 'class' => 'yii\logging\FileTarget',
+ 'levels' => array('error', 'warning'),
+ ),
+ ),
+ ),
+ ),
+ 'params' => $params,
+);
diff --git a/apps/advanced/frontend/config/params.php b/apps/advanced/frontend/config/params.php
new file mode 100644
index 0000000..1e197d0
--- /dev/null
+++ b/apps/advanced/frontend/config/params.php
@@ -0,0 +1,5 @@
+ 'admin@example.com',
+);
\ No newline at end of file
diff --git a/apps/advanced/frontend/controllers/SiteController.php b/apps/advanced/frontend/controllers/SiteController.php
new file mode 100644
index 0000000..cd3339c
--- /dev/null
+++ b/apps/advanced/frontend/controllers/SiteController.php
@@ -0,0 +1,61 @@
+ array(
+ 'class' => 'yii\web\CaptchaAction',
+ ),
+ );
+ }
+
+ public function actionIndex()
+ {
+ echo $this->render('index');
+ }
+
+ public function actionLogin()
+ {
+ $model = new LoginForm();
+ if ($this->populate($_POST, $model) && $model->login()) {
+ Yii::$app->response->redirect(array('site/index'));
+ } else {
+ echo $this->render('login', array(
+ 'model' => $model,
+ ));
+ }
+ }
+
+ public function actionLogout()
+ {
+ Yii::$app->getUser()->logout();
+ Yii::$app->getResponse()->redirect(array('site/index'));
+ }
+
+ public function actionContact()
+ {
+ $model = new ContactForm;
+ if ($this->populate($_POST, $model) && $model->contact(Yii::$app->params['adminEmail'])) {
+ Yii::$app->session->setFlash('contactFormSubmitted');
+ Yii::$app->response->refresh();
+ } else {
+ echo $this->render('contact', array(
+ 'model' => $model,
+ ));
+ }
+ }
+
+ public function actionAbout()
+ {
+ echo $this->render('about');
+ }
+}
diff --git a/apps/advanced/frontend/models/ContactForm.php b/apps/advanced/frontend/models/ContactForm.php
new file mode 100644
index 0000000..b3d8682
--- /dev/null
+++ b/apps/advanced/frontend/models/ContactForm.php
@@ -0,0 +1,63 @@
+ '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;
+ }
+ }
+}
diff --git a/apps/advanced/frontend/runtime/.gitignore b/apps/advanced/frontend/runtime/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/apps/advanced/frontend/runtime/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/apps/advanced/frontend/views/layouts/main.php b/apps/advanced/frontend/views/layouts/main.php
new file mode 100644
index 0000000..635e118
--- /dev/null
+++ b/apps/advanced/frontend/views/layouts/main.php
@@ -0,0 +1,66 @@
+registerAssetBundle('app');
+?>
+beginPage(); ?>
+
+
+
+
+ title); ?>
+ head(); ?>
+
+
+
+ beginBody(); ?>
+
+
+ isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : array(),
+ )); ?>
+
+
+
+
+
+ endBody(); ?>
+
+
+
+
+endPage(); ?>
diff --git a/apps/advanced/frontend/views/site/about.php b/apps/advanced/frontend/views/site/about.php
new file mode 100644
index 0000000..86e19e1
--- /dev/null
+++ b/apps/advanced/frontend/views/site/about.php
@@ -0,0 +1,16 @@
+title = 'About';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+title); ?>
+
+
+ This is the About page. You may modify the following file to customize its content:
+
+
+
+
diff --git a/apps/advanced/frontend/views/site/contact.php b/apps/advanced/frontend/views/site/contact.php
new file mode 100644
index 0000000..e740d0f
--- /dev/null
+++ b/apps/advanced/frontend/views/site/contact.php
@@ -0,0 +1,46 @@
+title = 'Contact';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+title); ?>
+
+session->hasFlash('contactFormSubmitted')): ?>
+
+ Thank you for contacting us. We will respond to you as soon as possible.
+
+
+
+
+ If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
+
+
+ array('class' => 'form-horizontal'),
+ 'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')),
+)); ?>
+ field($model, 'name')->textInput(); ?>
+ field($model, 'email')->textInput(); ?>
+ field($model, 'subject')->textInput(); ?>
+ field($model, 'body')->textArea(array('rows' => 6)); ?>
+ field($model, 'verifyCode');
+ echo $field->begin()
+ . $field->label()
+ . Captcha::widget()
+ . Html::activeTextInput($model, 'verifyCode', array('class' => 'input-medium'))
+ . $field->error()
+ . $field->end();
+ ?>
+
+ 'btn btn-primary')); ?>
+
+
diff --git a/apps/advanced/frontend/views/site/index.php b/apps/advanced/frontend/views/site/index.php
new file mode 100644
index 0000000..158b61c
--- /dev/null
+++ b/apps/advanced/frontend/views/site/index.php
@@ -0,0 +1,47 @@
+title = 'Welcome';
+?>
+
+
Welcome!
+
+
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.
+
Get started with Yii
+
+
+
+
+
+
+
+
Heading
+
+
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.
+
+
View details »
+
+
+
Heading
+
+
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.
+
+
View details »
+
+
+
Heading
+
+
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.
+
+
View details »
+
+
+
diff --git a/apps/advanced/frontend/views/site/login.php b/apps/advanced/frontend/views/site/login.php
new file mode 100644
index 0000000..f676b98
--- /dev/null
+++ b/apps/advanced/frontend/views/site/login.php
@@ -0,0 +1,24 @@
+title = 'Login';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+title); ?>
+
+Please fill out the following fields to login:
+
+ array('class' => 'form-horizontal'))); ?>
+ field($model, 'username')->textInput(); ?>
+ field($model, 'password')->passwordInput(); ?>
+ field($model, 'rememberMe')->checkbox(); ?>
+
+ 'btn btn-primary')); ?>
+
+
diff --git a/apps/advanced/frontend/www/.gitignore b/apps/advanced/frontend/www/.gitignore
new file mode 100644
index 0000000..148f2b0
--- /dev/null
+++ b/apps/advanced/frontend/www/.gitignore
@@ -0,0 +1 @@
+/index.php
\ No newline at end of file
diff --git a/apps/advanced/frontend/www/assets/.gitignore b/apps/advanced/frontend/www/assets/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/apps/advanced/frontend/www/assets/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/apps/advanced/frontend/www/css/site.css b/apps/advanced/frontend/www/css/site.css
new file mode 100644
index 0000000..890a953
--- /dev/null
+++ b/apps/advanced/frontend/www/css/site.css
@@ -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 .navbar-inner {
+ padding: 0;
+}
+
+.navbar .nav {
+ margin: 0;
+ display: table;
+ width: 100%;
+}
+
+.navbar .nav li {
+ display: table-cell;
+ width: 1%;
+ float: none;
+}
+
+.navbar .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 .nav li:first-child a {
+ border-left: 0;
+ border-radius: 3px 0 0 3px;
+}
+
+.navbar .nav li:last-child a {
+ border-right: 0;
+ border-radius: 0 3px 3px 0;
+}
diff --git a/apps/advanced/install b/apps/advanced/install
new file mode 100644
index 0000000..6864440
--- /dev/null
+++ b/apps/advanced/install
@@ -0,0 +1,112 @@
+#!/usr/bin/env php
+ $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 installation.\n";
+ return;
+}
+
+$env = $envs[$envNames[$answer]];
+echo "\n Install the application under '{$envNames[$answer]}' environment? [yes|no] ";
+$answer = trim(fgets(STDIN));
+if (strncasecmp($answer, 'y', 1)) {
+ echo "\n Quit installation.\n";
+ return;
+}
+
+echo "\n Start installation ...\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 ... installation 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;
+}
diff --git a/apps/advanced/install.bat b/apps/advanced/install.bat
new file mode 100644
index 0000000..dc2cd83
--- /dev/null
+++ b/apps/advanced/install.bat
@@ -0,0 +1,20 @@
+@echo off
+
+rem -------------------------------------------------------------
+rem Yii command line install script for Windows.
+rem
+rem @author Qiang Xue
+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%install" %*
+
+@endlocal
diff --git a/apps/advanced/requirements.php b/apps/advanced/requirements.php
new file mode 100644
index 0000000..5a2d910
--- /dev/null
+++ b/apps/advanced/requirements.php
@@ -0,0 +1,96 @@
+ 'PDO extension',
+ 'mandatory' => true,
+ 'condition' => extension_loaded('pdo'),
+ 'by' => 'All DB-related classes',
+ ),
+ array(
+ 'name' => 'PDO SQLite extension',
+ 'mandatory' => false,
+ 'condition' => extension_loaded('pdo_sqlite'),
+ 'by' => 'All DB-related classes',
+ 'memo' => 'Required for SQLite database.',
+ ),
+ array(
+ 'name' => 'PDO MySQL extension',
+ 'mandatory' => false,
+ 'condition' => extension_loaded('pdo_mysql'),
+ 'by' => 'All DB-related classes',
+ 'memo' => 'Required for MySQL database.',
+ ),
+ // Cache :
+ array(
+ 'name' => 'Memcache extension',
+ 'mandatory' => false,
+ 'condition' => extension_loaded('memcache') || extension_loaded('memcached'),
+ 'by' => 'CMemCache',
+ 'memo' => extension_loaded('memcached') ? 'To use memcached set CMemCache::useMemcached to true
.' : ''
+ ),
+ array(
+ 'name' => 'APC extension',
+ 'mandatory' => false,
+ 'condition' => extension_loaded('apc') || extension_loaded('apc'),
+ 'by' => 'CApcCache',
+ ),
+ // Additional PHP extensions :
+ array(
+ 'name' => 'Mcrypt extension',
+ 'mandatory' => false,
+ 'condition' => extension_loaded('mcrypt'),
+ 'by' => 'CSecurityManager',
+ '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();
diff --git a/apps/advanced/vendor/.gitignore b/apps/advanced/vendor/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/apps/advanced/vendor/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/apps/advanced/yii.bat b/apps/advanced/yii.bat
new file mode 100644
index 0000000..5e21e2e
--- /dev/null
+++ b/apps/advanced/yii.bat
@@ -0,0 +1,20 @@
+@echo off
+
+rem -------------------------------------------------------------
+rem Yii command line bootstrap script for Windows.
+rem
+rem @author Qiang Xue
+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%yii" %*
+
+@endlocal