فهرست منبع

Renamed apps/bootstrap to apps/basic.

Qiang Xue 12 سال پیش
کامیت
cb76b82e09

+ 32 - 0
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.

+ 61 - 0
README.md

@@ -0,0 +1,61 @@
+Yii 2 Basic 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 Basic Application Template - an application template
+that works out-of-box and can be easily customized to fit for your needs.
+
+Yii 2 Basic Application Template is best suitable for small Websites which mainly contain
+a few informational pages.
+
+
+DIRECTORY STRUCTURE
+-------------------
+
+      commands/           contains console commands (controllers)
+      config/             contains application configurations
+      controllers/        contains Web controller classes
+      models/             contains model classes
+      runtime/            contains files generated during runtime
+      vendor/             contains dependent 3rd-party packages
+      views/              contains view files for the Web application
+      www/                contains the entry script and Web resources
+
+
+
+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-basic yii-basic
+~~~
+
+Now you should be able to access the Bootstrap Application using the URL `http://localhost/yii-basic/www/`,
+assuming `yii-basic` 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.

+ 1 - 0
assets/.gitignore

@@ -0,0 +1 @@
+*

+ 29 - 0
commands/HelloController.php

@@ -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\commands;
+use yii\console\Controller;
+
+/**
+ * This command echos what the first argument that you have entered.
+ *
+ * This command is provided as an example for you to learn how to create console commands.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @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";
+	}
+}

+ 38 - 0
composer.json

@@ -0,0 +1,38 @@
+{
+	"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": [
+			"runtime",
+			"www/assets"
+		],
+		"yii-install-executable": [
+			"yii"
+		]
+	}
+}

+ 18 - 0
config/assets.php

@@ -0,0 +1,18 @@
+<?php
+
+return array(
+	'app' => array(
+		'basePath' => '@wwwroot',
+		'baseUrl' => '@www',
+		'css' => array(
+			'css/site.css',
+		),
+		'js' => array(
+
+		),
+		'depends' => array(
+			'yii',
+			'yii/bootstrap/responsive',
+		),
+	),
+);

+ 26 - 0
config/console.php

@@ -0,0 +1,26 @@
+<?php
+
+return array(
+	'id' => 'bootstrap-console',
+	'basePath' => dirname(__DIR__),
+	'preload' => array('log'),
+	'controllerPath' => dirname(__DIR__) . '/commands',
+	'controllerNamespace' => 'app\commands',
+	'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' => require(__DIR__ . '/params.php'),
+);

+ 38 - 0
config/main.php

@@ -0,0 +1,38 @@
+<?php
+
+return array(
+	'id' => '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' => require(__DIR__ . '/params.php'),
+);

+ 5 - 0
config/params.php

@@ -0,0 +1,5 @@
+<?php
+
+return array(
+	'adminEmail' => 'admin@example.com',
+);

+ 61 - 0
controllers/SiteController.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace app\controllers;
+
+use Yii;
+use yii\web\Controller;
+use app\models\LoginForm;
+use app\models\ContactForm;
+
+class SiteController extends Controller
+{
+	public function actions()
+	{
+		return array(
+			'captcha' => 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');
+	}
+}

+ 63 - 0
models/ContactForm.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace app\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;
+		}
+	}
+}

+ 58 - 0
models/LoginForm.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace app\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;
+		}
+	}
+}

+ 61 - 0
models/User.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace app\models;
+
+class User extends \yii\base\Object implements \yii\web\Identity
+{
+	public $id;
+	public $username;
+	public $password;
+	public $authKey;
+
+	private static $users = array(
+		'100' => 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;
+	}
+}

+ 96 - 0
requirements.php

@@ -0,0 +1,96 @@
+<?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__) . '/../../yii';
+
+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();

+ 1 - 0
runtime/.gitignore

@@ -0,0 +1 @@
+*

+ 1 - 0
vendor/.gitignore

@@ -0,0 +1 @@
+*

+ 66 - 0
views/layouts/main.php

@@ -0,0 +1,66 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\Menu;
+use yii\widgets\Breadcrumbs;
+use yii\debug\Toolbar;
+
+/**
+ * @var $this \yii\base\View
+ * @var $content string
+ */
+$this->registerAssetBundle('app');
+?>
+<?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">
+			<div class="navbar-inner">
+				<div class="container">
+					<?php echo Menu::widget(array(
+						'options' => array('class' => 'nav'),
+						'items' => array(
+							array('label' => 'Home', 'url' => array('/site/index')),
+							array('label' => 'About', 'url' => array('/site/about')),
+							array('label' => 'Contact', 'url' => array('/site/contact')),
+							Yii::$app->user->isGuest ?
+								array('label' => 'Login', 'url' => array('/site/login')) :
+								array('label' => 'Logout (' . Yii::$app->user->identity->username .')' , 'url' => array('/site/logout')),
+						),
+					)); ?>
+				</div>
+			</div>
+		</div>
+		<!-- /.navbar -->
+	</div>
+
+	<?php echo Breadcrumbs::widget(array(
+		'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : array(),
+	)); ?>
+	<?php echo $content; ?>
+
+	<hr>
+
+	<div class="footer">
+		<p>&copy; 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>
+<?php echo Toolbar::widget(); ?>
+</body>
+</html>
+<?php $this->endPage(); ?>

+ 16 - 0
views/site/about.php

@@ -0,0 +1,16 @@
+<?php
+use yii\helpers\Html;
+/**
+ * @var yii\base\View $this
+ */
+$this->title = 'About';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+<h1><?php echo Html::encode($this->title); ?></h1>
+
+<p>
+	This is the About page. You may modify the following file to customize its content:
+</p>
+
+<code><?php echo __FILE__; ?></code>
+

+ 46 - 0
views/site/contact.php

@@ -0,0 +1,46 @@
+<?php
+use yii\helpers\Html;
+use yii\widgets\ActiveForm;
+use yii\widgets\Captcha;
+
+/**
+ * @var yii\base\View $this
+ * @var yii\widgets\ActiveForm $form
+ * @var app\models\ContactForm $model
+ */
+$this->title = 'Contact';
+$this->params['breadcrumbs'][] = $this->title;
+?>
+<h1><?php echo Html::encode($this->title); ?></h1>
+
+<?php if (Yii::$app->session->hasFlash('contactFormSubmitted')): ?>
+<div class="alert alert-success">
+	Thank you for contacting us. We will respond to you as soon as possible.
+</div>
+<?php return; endif; ?>
+
+<p>
+	If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
+</p>
+
+<?php $form = ActiveForm::begin(array(
+	'options' => array('class' => 'form-horizontal'),
+	'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')),
+)); ?>
+	<?php echo $form->field($model, 'name')->textInput(); ?>
+	<?php echo $form->field($model, 'email')->textInput(); ?>
+	<?php echo $form->field($model, 'subject')->textInput(); ?>
+	<?php echo $form->field($model, 'body')->textArea(array('rows' => 6)); ?>
+	<?php
+		$field = $form->field($model, 'verifyCode');
+		echo $field->begin()
+			. $field->label()
+			. Captcha::widget()
+			. Html::activeTextInput($model, 'verifyCode', array('class' => 'input-medium'))
+			. $field->error()
+			. $field->end();
+	?>
+	<div class="form-actions">
+		<?php echo Html::submitButton('Submit', null, null, array('class' => 'btn btn-primary')); ?>
+	</div>
+<?php ActiveForm::end(); ?>

+ 47 - 0
views/site/index.php

@@ -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 &raquo;</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 &raquo;</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 &raquo;</a></p>
+	</div>
+</div>
+

+ 24 - 0
views/site/login.php

@@ -0,0 +1,24 @@
+<?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', null, null, array('class' => 'btn btn-primary')); ?>
+	</div>
+<?php ActiveForm::end(); ?>

+ 1 - 0
www/assets/.gitignore

@@ -0,0 +1 @@
+*

+ 78 - 0
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;
+}

+ 12 - 0
www/index.php

@@ -0,0 +1,12 @@
+<?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 = require(__DIR__ . '/../config/main.php');
+
+$application = new yii\web\Application($config);
+$application->run();

+ 22 - 0
yii

@@ -0,0 +1,22 @@
+#!/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');
+
+$config = require(__DIR__ . '/config/console.php');
+
+$application = new yii\console\Application($config);
+$application->run();

+ 20 - 0
yii.bat

@@ -0,0 +1,20 @@
+@echo off
+
+rem -------------------------------------------------------------
+rem  Yii command line bootstrap script for Windows.
+rem
+rem  @author Qiang Xue <qiang.xue@gmail.com>
+rem  @link http://www.yiiframework.com/
+rem  @copyright Copyright &copy; 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