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