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..08f0b0d
--- /dev/null
+++ b/apps/advanced/README.md
@@ -0,0 +1,89 @@
+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
+ env/ contains environment-based overrides
+ models/ contains model classes used in both backstage and frontend
+console
+ config/ contains console configurations
+ controllers/ contains console controllers (commands)
+ env/ contains environment-based overrides
+ 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
+ env/ contains environment-based overrides
+ 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
+ env/ contains environment-based overrides
+ 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
+```
+
+
+
+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.
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..3fb95da
--- /dev/null
+++ b/apps/advanced/backstage/config/main.php
@@ -0,0 +1,46 @@
+ 'change-me',
+ 'basePath' => dirname(__DIR__),
+ 'preload' => array('log'),
+ 'controllerNamespace' => 'app\controllers',
+ 'modules' => array(
+// 'debug' => array(
+// 'class' => 'yii\debug\Module',
+// )
+ ),
+ 'components' => array(
+ 'cache' => array(
+ 'class' => 'yii\caching\FileCache',
+ ),
+ 'user' => array(
+ 'class' => 'yii\web\User',
+ 'identityClass' => 'app\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'),
+ ),
+// array(
+// 'class' => 'yii\logging\DebugTarget',
+// )
+ ),
+ ),
+ ),
+ '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..ff3b8b4
--- /dev/null
+++ b/apps/advanced/backstage/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/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..635e118
--- /dev/null
+++ b/apps/advanced/backstage/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/backstage/views/site/about.php b/apps/advanced/backstage/views/site/about.php
new file mode 100644
index 0000000..86e19e1
--- /dev/null
+++ b/apps/advanced/backstage/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/backstage/views/site/contact.php b/apps/advanced/backstage/views/site/contact.php
new file mode 100644
index 0000000..e740d0f
--- /dev/null
+++ b/apps/advanced/backstage/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/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/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..9eb2b15
--- /dev/null
+++ b/apps/advanced/common/config/params.php
@@ -0,0 +1,9 @@
+ 'admin@example.com',
+
+ 'component.cache' => array(
+ 'class' => 'yii\caching\FileCache',
+ ),
+);
\ No newline at end of file
diff --git a/apps/advanced/common/models/ContactForm.php b/apps/advanced/common/models/ContactForm.php
new file mode 100644
index 0000000..7b713a1
--- /dev/null
+++ b/apps/advanced/common/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/common/models/LoginForm.php b/apps/advanced/common/models/LoginForm.php
new file mode 100644
index 0000000..5ba1dc6
--- /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..afbf9f8
--- /dev/null
+++ b/apps/advanced/common/models/User.php
@@ -0,0 +1,61 @@
+ array(
+ 'id' => '100',
+ 'username' => 'admin',
+ 'password' => 'admin',
+ 'authKey' => 'test100key',
+ ),
+ '101' => array(
+ 'id' => '101',
+ 'username' => 'demo',
+ 'password' => 'demo',
+ 'authKey' => 'test101key',
+ ),
+ );
+
+ public static function findIdentity($id)
+ {
+ return isset(self::$users[$id]) ? new self(self::$users[$id]) : null;
+ }
+
+ public static function findByUsername($username)
+ {
+ foreach (self::$users as $user) {
+ if (strcasecmp($user['username'], $username) === 0) {
+ return new self($user);
+ }
+ }
+ return null;
+ }
+
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ public function getAuthKey()
+ {
+ return $this->authKey;
+ }
+
+ public function validateAuthKey($authKey)
+ {
+ return $this->authKey === $authKey;
+ }
+
+ public function validatePassword($password)
+ {
+ return $this->password === $password;
+ }
+}
diff --git a/apps/advanced/composer.json b/apps/advanced/composer.json
new file mode 100644
index 0000000..a5ff565
--- /dev/null
+++ b/apps/advanced/composer.json
@@ -0,0 +1,44 @@
+{
+ "name": "yiisoft/yii2-app-basic",
+ "description": "Yii 2 Basic Application Template",
+ "keywords": ["yii", "framework", "basic", "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-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..7af7824
--- /dev/null
+++ b/apps/advanced/console/config/main.php
@@ -0,0 +1,34 @@
+ 'bootstrap-console',
+ 'basePath' => dirname(__DIR__),
+ 'preload' => array('log'),
+ 'controllerPath' => dirname(__DIR__) . '/commands',
+ 'controllerNamespace' => 'app\controllers',
+ 'modules' => array(
+ ),
+ 'components' => array(
+ 'cache' => array(
+ 'class' => 'yii\caching\FileCache',
+ ),
+ '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/HelloController.php b/apps/advanced/console/controllers/HelloController.php
new file mode 100644
index 0000000..603c6e8
--- /dev/null
+++ b/apps/advanced/console/controllers/HelloController.php
@@ -0,0 +1,29 @@
+
+ * @since 2.0
+ */
+class HelloController extends Controller
+{
+ /**
+ * This command echos what you have entered as the message.
+ * @param string $message the message to be echoed.
+ */
+ public function actionIndex($message = 'hello world')
+ {
+ echo $message."\n";
+ }
+}
\ No newline at end of file
diff --git a/apps/advanced/console/controllers/InstallController.php b/apps/advanced/console/controllers/InstallController.php
new file mode 100644
index 0000000..cbc2227
--- /dev/null
+++ b/apps/advanced/console/controllers/InstallController.php
@@ -0,0 +1,13 @@
+ 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..9379e06
--- /dev/null
+++ b/apps/advanced/frontend/config/main.php
@@ -0,0 +1,46 @@
+ 'bootstrap',
+ 'basePath' => dirname(__DIR__),
+ 'preload' => array('log'),
+ 'controllerNamespace' => 'app\controllers',
+ 'modules' => array(
+// 'debug' => array(
+// 'class' => 'yii\debug\Module',
+// )
+ ),
+ 'components' => array(
+ 'cache' => array(
+ 'class' => 'yii\caching\FileCache',
+ ),
+ 'user' => array(
+ 'class' => 'yii\web\User',
+ 'identityClass' => 'app\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'),
+ ),
+// array(
+// 'class' => 'yii\logging\DebugTarget',
+// )
+ ),
+ ),
+ ),
+ '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..ff3b8b4
--- /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..7b713a1
--- /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/models/LoginForm.php b/apps/advanced/frontend/models/LoginForm.php
new file mode 100644
index 0000000..5ba1dc6
--- /dev/null
+++ b/apps/advanced/frontend/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/frontend/models/User.php b/apps/advanced/frontend/models/User.php
new file mode 100644
index 0000000..afbf9f8
--- /dev/null
+++ b/apps/advanced/frontend/models/User.php
@@ -0,0 +1,61 @@
+ array(
+ 'id' => '100',
+ 'username' => 'admin',
+ 'password' => 'admin',
+ 'authKey' => 'test100key',
+ ),
+ '101' => array(
+ 'id' => '101',
+ 'username' => 'demo',
+ 'password' => 'demo',
+ 'authKey' => 'test101key',
+ ),
+ );
+
+ public static function findIdentity($id)
+ {
+ return isset(self::$users[$id]) ? new self(self::$users[$id]) : null;
+ }
+
+ public static function findByUsername($username)
+ {
+ foreach (self::$users as $user) {
+ if (strcasecmp($user['username'], $username) === 0) {
+ return new self($user);
+ }
+ }
+ return null;
+ }
+
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ public function getAuthKey()
+ {
+ return $this->authKey;
+ }
+
+ public function validateAuthKey($authKey)
+ {
+ return $this->authKey === $authKey;
+ }
+
+ public function validatePassword($password)
+ {
+ return $this->password === $password;
+ }
+}
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/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/dev/backstage/config/main-local.php b/apps/advanced/install/dev/backstage/config/main-local.php
new file mode 100644
index 0000000..5b61b0e
--- /dev/null
+++ b/apps/advanced/install/dev/backstage/config/main-local.php
@@ -0,0 +1,3 @@
+run();
diff --git a/apps/advanced/install/dev/common/config/params-local.php b/apps/advanced/install/dev/common/config/params-local.php
new file mode 100644
index 0000000..2670143
--- /dev/null
+++ b/apps/advanced/install/dev/common/config/params-local.php
@@ -0,0 +1,3 @@
+run();
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 b/apps/advanced/yii
new file mode 100644
index 0000000..afcba03
--- /dev/null
+++ b/apps/advanced/yii
@@ -0,0 +1,26 @@
+#!/usr/bin/env php
+run();
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